From 126d5bf5e4e4d533807891818d0d3b11c0f7b237 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Thu, 18 Jul 2024 00:20:38 +0400 Subject: [PATCH] not only https, now also http type and downloads are supported. --- GNUmakefile | 1 + Makefile | 1 + src/vpkHttp.Mod | 68 +++++++++++++++++++++++++++++++++++++ src/vpkJsonDepRetriever.Mod | 44 ++++++++++++++++++++---- src/vpkSyncer.Mod | 8 +++-- 5 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 src/vpkHttp.Mod diff --git a/GNUmakefile b/GNUmakefile index 0735337..c4f618d 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -61,6 +61,7 @@ buildThis: cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkConf.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkdepTree.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkMD5Checker.Mod + cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkHttp.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkHttps.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkSyncer.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkDot.Mod diff --git a/Makefile b/Makefile index e822cb9..ddd6d85 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,7 @@ buildThis: cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkTime.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkLogger.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkHttp.Mod + cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkHtts.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkEnv.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkGit.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkCharacterStack.Mod diff --git a/src/vpkHttp.Mod b/src/vpkHttp.Mod new file mode 100644 index 0000000..49bbced --- /dev/null +++ b/src/vpkHttp.Mod @@ -0,0 +1,68 @@ +MODULE vpkHttp; +IMPORT Out, Platform, + List, strTypes, http, + vpkdepTree, vpkTools, vpkMD5Checker, vpkEnv; + +PROCEDURE fetchFiles*(VAR dep: vpkdepTree.Tdep; dst: ARRAY OF CHAR); +VAR + h: http.Client; + answer: strTypes.pstring; + domain, path: ARRAY 128 OF CHAR; port: ARRAY 8 OF CHAR; + filename: ARRAY 64 OF CHAR; + i, j: LONGINT; + node: List.Node; + bool, continueFetching: BOOLEAN; + initialDst: ARRAY 512 OF CHAR; +BEGIN + COPY(dst, initialDst); + COPY("80", port); + i := 0; + continueFetching := TRUE; + + WHILE continueFetching DO + node := dep^.rmt(vpkdepTree.RemoteHttps)^.Files.Get(dep^.rmt(vpkdepTree.RemoteHttps)^.Files, i); + IF node # NIL THEN + IF node^.obj(vpkdepTree.File) # NIL THEN + Out.String("getting "); Out.String(node^.obj(vpkdepTree.File)^.URI); Out.Ln; + + vpkTools.extractDomainFromUrl(node^.obj(vpkdepTree.File)^.URI, domain); + Out.String("connecting to "); Out.String(domain); Out.Ln; + vpkTools.extractPathFromUrl(node^.obj(vpkdepTree.File)^.URI, path); + vpkTools.extractFilenameFromUrl(node^.obj(vpkdepTree.File)^.URI, filename); + + vpkEnv.mkPkgDirPath(domain, dep^.name^, dst); + + j := Platform.Chdir(dst); + + COPY(initialDst, dst); + + h := http.Create(domain, port, path); + + IF node^.obj(vpkdepTree.File)^.auth THEN + Out.String("requires basic auth"); Out.Ln; + Out.String("username: "); Out.String(node^.obj(vpkdepTree.File)^.username); Out.Ln; + Out.String("password: "); Out.String(node^.obj(vpkdepTree.File)^.password); Out.Ln; + + h.appendAuthHdr(h, node^.obj(vpkdepTree.File)^.username, node^.obj(vpkdepTree.File)^.password); + ELSE + Out.String("does not require basic auth"); Out.Ln; + END; + + (*h.Init(h);*) + answer := h.Get(h); + h.Save(h); + bool := vpkMD5Checker.checkMD5(filename, node^.obj(vpkdepTree.File)^.md5); + IF bool THEN Out.String("correct!") ELSE Out.String("incorrect!"); END; Out.Ln; + ELSE + Out.String("node^.obj(vpkdepTree.File) is NIL"); Out.Ln; + END; + ELSE + Out.String("Node is NIL, stopping."); Out.Ln; + continueFetching := FALSE; + END; + INC(i); + END; + +END fetchFiles; + +END vpkHttp. diff --git a/src/vpkJsonDepRetriever.Mod b/src/vpkJsonDepRetriever.Mod index 72b6a0c..2a86719 100644 --- a/src/vpkJsonDepRetriever.Mod +++ b/src/vpkJsonDepRetriever.Mod @@ -48,7 +48,7 @@ BEGIN NEW(fl, Strings.Length(vpkSettings.bldFile) + 1); (* +1 for 0X *) COPY(vpkSettings.bldCommand, cm^); COPY(vpkSettings.bldFile, fl^); - IF d^.Type = vpkSettings.https THEN + IF (d^.Type = vpkSettings.https) OR (d^.Type = vpkSettings.http) THEN (* Handle HTTPS build steps *) IF Json.ObjSelect(command, buildStep, cm) & Json.ObjSelect(file, buildStep, fl) THEN IF (command IS Json.Str) & (file IS Json.Str) THEN @@ -105,8 +105,8 @@ BEGIN RETURN b; END getBuildInfo; - -PROCEDURE fetchHttpsFiles(someObj: Json.Obj; VAR httpsRemote: vpkdepTree.RemoteHttps); +(*PROCEDURE fetchHttpsFiles(someObj: Json.Obj; VAR httpsRemote: vpkdepTree.RemoteHttps);*) +PROCEDURE fetchHttpsFiles(someObj: Json.Obj; VAR Remote: vpkdepTree.Remote); VAR filesArray, fileObjValue: Json.Value; fileObj, authObj: Json.Obj; @@ -114,11 +114,24 @@ VAR url, authType, authCr, user, password, md5: Json.jString; httpsFile: vpkdepTree.File; BEGIN + IF Remote IS vpkdepTree.RemoteHttp THEN + IF Remote(vpkdepTree.RemoteHttp)^.Files = NIL THEN + Remote(vpkdepTree.RemoteHttp)^.Files := List.Create(); + END + ELSIF Remote IS vpkdepTree.RemoteHttps THEN + IF Remote(vpkdepTree.RemoteHttps)^.Files = NIL THEN + Remote(vpkdepTree.RemoteHttps)^.Files := List.Create(); + END + ELSE + Out.String("HTTP or HTTPS protocols expected, check package description"); Out.Ln; + HALT(11); + END; + (* IF httpsRemote^.Files = NIL THEN httpsRemote^.Files := List.Create(); END; - + *) WHILE someObj # NIL DO IF someObj.value IS Json.Arr THEN filesArray := someObj.value(Json.Arr); @@ -167,7 +180,12 @@ BEGIN COPY(md5Value(Json.Str).str^, httpsFile^.md5); Out.String("found md5 "); Out.String(httpsFile^.md5); Out.Ln; END; - httpsRemote^.Files.Append(httpsRemote^.Files, httpsFile); + (*httpsRemote^.Files.Append(httpsRemote^.Files, httpsFile);*) + IF Remote IS vpkdepTree.RemoteHttp THEN + Remote(vpkdepTree.RemoteHttp)^.Files.Append(Remote(vpkdepTree.RemoteHttp)^.Files, httpsFile); + ELSIF Remote IS vpkdepTree.RemoteHttps THEN + Remote(vpkdepTree.RemoteHttps)^.Files.Append(Remote(vpkdepTree.RemoteHttps)^.Files, httpsFile); + END; END; filesArray := filesArray(Json.Arr).next; END; @@ -201,6 +219,8 @@ VAR b, fndRemSec: BOOLEAN; key, val, remote, keyLower: Json.jString; httpsRemote, httpsRemote2: vpkdepTree.RemoteHttps; + httpRemote, httpRemote2: vpkdepTree.RemoteHttp; + tmpRemote: vpkdepTree.Remote; gitRemote: vpkdepTree.RemoteGit; BEGIN jsonstr := NIL; @@ -249,6 +269,11 @@ BEGIN d^.Type := vpkSettings.https; httpsRemote^.Files := List.Create(); Out.String("Set remote type to HTTPS"); Out.Ln; + ELSIF val^ = vpkSettings.rmtTypHttpVal THEN + NEW(httpRemote); d^.rmt := httpRemote; + d^.Type := vpkSettings.http; + httpRemote^.Files := List.Create(); + Out.String("Set remote type to HTTP"); Out.Ln; ELSIF val^ = vpkSettings.rmtTypGitVal THEN NEW(gitRemote); d^.rmt := gitRemote; d^.Type := vpkSettings.git; @@ -278,9 +303,14 @@ BEGIN IF keyLower^ = "files" THEN IF (d^.rmt IS vpkdepTree.RemoteHttps) THEN httpsRemote2 := d^.rmt(vpkdepTree.RemoteHttps); (* Separate the cast *) - fetchHttpsFiles(rootObj, httpsRemote2); + tmpRemote := httpsRemote2; + fetchHttpsFiles(rootObj, tmpRemote); + ELSIF (d^.rmt IS vpkdepTree.RemoteHttp) THEN + httpRemote2 := d^.rmt(vpkdepTree.RemoteHttp); + tmpRemote := httpRemote2; + fetchHttpsFiles(rootObj, tmpRemote); ELSE - Out.String("Files section found but remote type is not HTTPS"); Out.Ln; + Out.String("Files section found but remote type is not HTTP(S)"); Out.Ln; END; ELSE Out.String("Value for key "); Out.String(key^); Out.String(" is not a string"); Out.Ln; diff --git a/src/vpkSyncer.Mod b/src/vpkSyncer.Mod index 9e48b90..181694b 100644 --- a/src/vpkSyncer.Mod +++ b/src/vpkSyncer.Mod @@ -1,7 +1,7 @@ MODULE vpkSyncer; IMPORT Strings, Out, strUtils, List, - vpkSettings, vpkEnv, vpkConf, vpkGit, vpkdepTree, vpkTools, vpkHttps; + vpkSettings, vpkEnv, vpkConf, vpkGit, vpkdepTree, vpkTools, vpkHttps, vpkHttp; PROCEDURE mkTreePath(VAR path: ARRAY OF CHAR); BEGIN @@ -53,7 +53,11 @@ BEGIN Out.String("Remote type is HTTPS"); Out.Ln; (* full dst will be determined in vpkHttps.fetchFiles for each file *) vpkHttps.fetchFiles(dep, dst); - ELSE + ELSIF dep^.rmt IS vpkdepTree.RemoteHttp THEN + Out.String("Remote type is HTTP"); Out.Ln; + (* full dst will be determined in vpkHttps.fetchFiles for each file *) + vpkHttp.fetchFiles(dep, dst); + ELSE Out.String("TODO: neither git nor https url"); Out.Ln; Out.String("not handled"); Out.Ln;