WebHTTPTools.Mod 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE WebHTTPTools; (** AUTHOR "TF"; PURPOSE "HTTP download tool"; *)
  3. IMPORT
  4. Commands, Files, IP, TCP, WebHTTP, WebHTTPClient, Streams, TFLog, Modules;
  5. VAR log : TFLog.Log;
  6. (*
  7. PROCEDURE StrToIntDef(x: ARRAY OF CHAR; def : LONGINT):LONGINT;
  8. VAR i, v, sgn: LONGINT;
  9. BEGIN
  10. IF x[0] = "-" THEN sgn := -1; INC(i) ELSE sgn := 1 END;
  11. WHILE (i < LEN(x)) & (x[i] # 0X) DO
  12. IF (x[i] >= "0") & (x[i] <= "9") THEN v := v * 10 + (ORD(x[i])-ORD("0")) ELSE RETURN def END;
  13. INC(i)
  14. END;
  15. RETURN sgn * v
  16. END StrToIntDef;
  17. *)
  18. PROCEDURE HexStrToIntDef(CONST x: ARRAY OF CHAR; def : LONGINT):LONGINT;
  19. VAR i, v: LONGINT;
  20. BEGIN
  21. WHILE (i < LEN(x)) & (x[i] # 0X) DO
  22. IF (x[i] >= "0") & (x[i] <= "9") THEN v := v * 16 + (ORD(x[i])-ORD("0"))
  23. ELSIF (CAP(x[i]) >= "A") & (CAP(x[i]) <= "F") THEN v := v * 16 + (ORD(CAP(x[i]))-ORD("A") + 10)
  24. ELSE RETURN def END;
  25. INC(i)
  26. END;
  27. RETURN v
  28. END HexStrToIntDef;
  29. PROCEDURE MatchPrefixI(CONST prefix, str: ARRAY OF CHAR):BOOLEAN;
  30. VAR i: LONGINT;
  31. BEGIN
  32. i := 0; WHILE (prefix[i] # 0X) & (CAP(prefix[i]) = CAP(str[i])) DO INC(i) END;
  33. RETURN prefix[i] = 0X
  34. END MatchPrefixI;
  35. PROCEDURE Get*(context : Commands.Context);
  36. VAR h : WebHTTP.ResponseHeader;
  37. rh : WebHTTP.RequestHeader;
  38. in : Streams.Reader;
  39. res, i, cs : LONGINT;
  40. ch : CHAR; token : ARRAY 16 OF CHAR;
  41. name : ARRAY 32 OF CHAR;
  42. url : ARRAY 256 OF CHAR;
  43. file : Files.File;
  44. fw : Files.Writer;
  45. con : TCP.Connection;
  46. BEGIN
  47. context.arg.SkipWhitespace; context.arg.String(url);
  48. context.arg.SkipWhitespace; context.arg.String(name);
  49. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" to "); log.String(name); log.Exit;
  50. rh.useragent := "WebHTTPTool/0.1";
  51. WebHTTPClient.Get(url, rh, con, h, in, res);
  52. IF res = WebHTTPClient.Ok THEN
  53. file := Files.New(name);
  54. Files.OpenWriter(fw, file, 0);
  55. IF (h.transferencoding # "") & MatchPrefixI("chunked", h.transferencoding) THEN
  56. in.SkipSpaces(); in.Token(token); cs := HexStrToIntDef(token, 0); in.SkipLn();
  57. WHILE cs # 0 DO
  58. FOR i := 0 TO cs - 1 DO in.Char(ch); fw.Char( ch) END;
  59. in.SkipLn;in.SkipSpaces; in.Token(token); cs := HexStrToIntDef(token, 0); in.SkipLn;
  60. END;
  61. IF fw.res = Streams.Ok THEN log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - OK"); log.Exit
  62. ELSE log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - failed"); log.Exit
  63. END
  64. ELSE
  65. IF h.contentlength >= 0 THEN
  66. FOR i := 0 TO h.contentlength - 1 DO in.Char(ch); fw.Char(ch) END;
  67. IF fw.res = Streams.Ok THEN log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - OK"); log.Exit
  68. ELSE log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - failed"); log.Exit
  69. END
  70. ELSE
  71. WHILE in.res = Streams.Ok DO in.Char(ch); fw.Char(ch) END;
  72. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - OK"); log.Exit
  73. END
  74. END;
  75. fw.Update;
  76. Files.Register(file);
  77. con.Close
  78. ELSE
  79. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - "); log.Int(h.statuscode, 5);
  80. log.String(h.reasonphrase); log.Exit
  81. END;
  82. END Get;
  83. PROCEDURE Head*(context : Commands.Context);
  84. VAR
  85. h : WebHTTP.ResponseHeader;
  86. res : LONGINT;
  87. url : ARRAY 256 OF CHAR;
  88. con : TCP.Connection;
  89. BEGIN
  90. context.arg.SkipWhitespace; context.arg.String(url);
  91. WebHTTPClient.Head(url, con, h, res);
  92. IF res = WebHTTPClient.Ok THEN
  93. WebHTTP.LogResponseHeader(log, h)
  94. ELSE log.Enter; log.String("Head not done."); log.Exit
  95. END;
  96. END Head;
  97. PROCEDURE GetAll*(context : Commands.Context);
  98. VAR
  99. baseUrl, baseDir, fileName, url, name, token: ARRAY 256 OF CHAR;
  100. file: Files.File;
  101. fw: Files.Writer;
  102. rh: WebHTTP.RequestHeader;
  103. h: WebHTTP.ResponseHeader;
  104. con: TCP.Connection;
  105. in: Streams.Reader;
  106. res, i, cs: LONGINT;
  107. ch : CHAR;
  108. BEGIN
  109. IF ~context.arg.GetString(baseUrl) THEN
  110. context.error.String("Expected base URL");
  111. context.error.Ln;
  112. RETURN;
  113. END;
  114. IF ~context.arg.GetString(baseDir) THEN
  115. context.error.String("Expected base directory");
  116. context.error.Ln;
  117. RETURN;
  118. END;
  119. WHILE context.arg.GetString(fileName) DO
  120. Files.JoinPath(baseUrl, fileName, url);
  121. Files.JoinPath(baseDir, fileName, name);
  122. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" to "); log.String(name); log.Exit;
  123. rh.fadr := IP.NilAdr;
  124. rh.fport := 0;
  125. rh.method := 0;
  126. rh.maj := 0; rh.min := 0;
  127. rh.uri := '';
  128. rh.host := '';
  129. rh.referer := '';
  130. rh.useragent := "WebHTTPTool/0.1";
  131. rh.accept := '';
  132. rh.transferencoding := '';
  133. rh.additionalFields := NIL;
  134. res := WebHTTPClient.Ok;
  135. con := NIL;
  136. in := NIL;
  137. WebHTTPClient.Get(url, rh, con, h, in, res);
  138. IF res = WebHTTPClient.Ok THEN
  139. file := Files.New(name);
  140. Files.OpenWriter(fw, file, 0);
  141. IF (h.transferencoding # "") & MatchPrefixI("chunked", h.transferencoding) THEN
  142. in.SkipSpaces(); in.Token(token); cs := HexStrToIntDef(token, 0); in.SkipLn();
  143. WHILE cs # 0 DO
  144. FOR i := 0 TO cs - 1 DO in.Char(ch); fw.Char( ch) END;
  145. in.SkipLn;in.SkipSpaces; in.Token(token); cs := HexStrToIntDef(token, 0); in.SkipLn;
  146. END;
  147. IF fw.res = Streams.Ok THEN log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - OK"); log.Exit
  148. ELSE log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - failed"); log.Exit
  149. END
  150. ELSE
  151. IF h.contentlength >= 0 THEN
  152. FOR i := 0 TO h.contentlength - 1 DO in.Char(ch); fw.Char(ch) END;
  153. IF fw.res = Streams.Ok THEN log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - OK"); log.Exit
  154. ELSE log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - failed"); log.Exit
  155. END
  156. ELSE
  157. WHILE in.res = Streams.Ok DO in.Char(ch); fw.Char(ch) END;
  158. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - OK"); log.Exit
  159. END
  160. END;
  161. fw.Update;
  162. Files.Register(file);
  163. con.Close
  164. ELSE
  165. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.String(" - "); log.Int(h.statuscode, 5);
  166. log.String(" ("); log.Int(res, 0); log.String(") ");
  167. log.String(h.reasonphrase); log.Exit
  168. END
  169. END;
  170. END GetAll;
  171. PROCEDURE Read*(context : Commands.Context);
  172. VAR
  173. url: ARRAY 512 OF CHAR;
  174. reader: WebHTTPClient.ContentReader;
  175. rh: WebHTTP.RequestHeader;
  176. h: WebHTTP.ResponseHeader;
  177. in: Streams.Reader;
  178. con: TCP.Connection;
  179. res: LONGINT;
  180. BEGIN
  181. IF ~context.arg.GetString(url) THEN RETURN END;
  182. log.Enter; log.TimeStamp; log.String("GET "); log.String(url); log.Exit;
  183. rh.useragent := "WebHTTPTool/0.1";
  184. WebHTTPClient.Get(url, rh, con, h, in, res);
  185. IF res = WebHTTPClient.Ok THEN
  186. NEW(reader, in, h);
  187. WHILE reader.res = 0 DO
  188. context.out.Char(reader.Get());
  189. END
  190. END
  191. END Read;
  192. PROCEDURE Cleanup;
  193. BEGIN
  194. log.Close
  195. END Cleanup;
  196. BEGIN
  197. NEW(log, "WebHTTPTools");
  198. Modules.InstallTermHandler(Cleanup)
  199. END WebHTTPTools.
  200. WebHTTPTools.Get http://www.enigon.com/ test.html~
  201. WebHTTPTools.Get http://212.254.73.92/ test.html~
  202. WebHTTPTools.Get http://www.nzz.ch/ test.html~
  203. WebHTTPTools.Head http://212.254.73.92/~
  204. WebHTTPTools.Head http://www.microsoft.com~
  205. WebHTTPTools.Head http://slashdot.org~ (* whats wrong with slashdot ? telnet worked... *)
  206. WebHTTPTools.Get https://www.mediapart.fr/ test.html ~
  207. WebHTTPTools.Get http://files.rcsb.org/download/4hhb.cif.gz test.gz ~
  208. WebHTTPTools.Get https://highdim.com/ test.html ~
  209. WebHTTPTools.Get https://www.startpage.com/ test.html ~
  210. WebHTTP.Mod
  211. SystemTools.Free WebHTTPTools
  212. SystemTools.FreeDownTo WebHTTP ~
  213. WebHTTPClient WebWormWatch WebHTTPServer WebHTTP~
  214. WebHTTPServer.Start~
  215. WebWormWatch.Install~
  216. WebHTTPTools.GetAll http://files.rcsb.org/download/ WORK: 4hhb.cif 4hhb.cif.gz 4hhb.cif 4hhb.cif.gz ~
  217. WebHTTPTools.Read http://www.highdim.com ~