mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-04-05 20:42:26 +00:00
using dynamic allocation instead of fixed length stack strings.
This commit is contained in:
parent
8ee5252223
commit
90a1d51b24
1 changed files with 71 additions and 77 deletions
136
src/vpkHttp.Mod
136
src/vpkHttp.Mod
|
|
@ -1,27 +1,21 @@
|
|||
MODULE vpkHttp;
|
||||
IMPORT Strings, Internet, vpkLogger, Out;
|
||||
CONST
|
||||
MAXARRAYNUMBER = 10000;
|
||||
MAXARRAYNUMBEREXTENDED = 100000;
|
||||
|
||||
TYPE
|
||||
PSTRING = POINTER TO ARRAY OF CHAR;
|
||||
PString = POINTER TO ARRAY OF CHAR;
|
||||
|
||||
VAR
|
||||
buff, buff2: ARRAY MAXARRAYNUMBEREXTENDED OF CHAR;
|
||||
buff, buff2: PString;
|
||||
|
||||
PROCEDURE Empty *(VAR string: ARRAY OF CHAR);
|
||||
VAR
|
||||
i : LONGINT;
|
||||
PROCEDURE Empty*(VAR string: PString);
|
||||
BEGIN
|
||||
FOR i := 0 TO LEN(string) - 1 DO string[i] := 0X END;
|
||||
COPY("", string);
|
||||
NEW(string, 1);
|
||||
string[0] := 0X;
|
||||
END Empty;
|
||||
|
||||
PROCEDURE getClean *(buff: ARRAY OF CHAR; VAR clean: ARRAY OF CHAR);
|
||||
PROCEDURE getClean*(buff: ARRAY OF CHAR; VAR clean: PString);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
newLine: ARRAY 2 OF CHAR;
|
||||
lineIsHeader, EOL, notFirstLine: BOOLEAN;
|
||||
BEGIN
|
||||
i := 0;
|
||||
|
|
@ -43,102 +37,102 @@ BEGIN
|
|||
INC(i);
|
||||
UNTIL (i + 2 > Strings.Length(buff)) OR (~lineIsHeader & EOL & notFirstLine);
|
||||
|
||||
Strings.Extract(buff, i, Strings.Length(buff), clean);
|
||||
NEW(clean, Strings.Length(buff) - i + 1);
|
||||
Strings.Extract(buff, i, Strings.Length(buff), clean^);
|
||||
END getClean;
|
||||
|
||||
PROCEDURE AppendEOLAndClean(buff: ARRAY OF CHAR; VAR buffClean: PSTRING);
|
||||
VAR i: LONGINT;
|
||||
PROCEDURE AppendEOLAndClean(buff: ARRAY OF CHAR; VAR buffClean: PString);
|
||||
VAR
|
||||
i: LONGINT;
|
||||
BEGIN
|
||||
i := Strings.Length(buff);
|
||||
|
||||
NEW(buffClean, i + 3);
|
||||
|
||||
COPY(buff, buffClean^);
|
||||
|
||||
buffClean[i] := 0DX;
|
||||
buffClean[i + 1] := 0AX;
|
||||
buffClean[i + 2] := " ";
|
||||
buffClean[i + 2] := 0X;
|
||||
END AppendEOLAndClean;
|
||||
|
||||
PROCEDURE addHeader(key, val: ARRAY OF CHAR; VAR buff: PSTRING);
|
||||
PROCEDURE addHeader(key, val: ARRAY OF CHAR; VAR buff: PString);
|
||||
VAR
|
||||
header: ARRAY MAXARRAYNUMBER OF CHAR;
|
||||
header: PString;
|
||||
headerLength: LONGINT;
|
||||
BEGIN
|
||||
Empty(header);
|
||||
Strings.Append(key, header);
|
||||
Strings.Append(": ", header);
|
||||
Strings.Append(val, header);
|
||||
AppendEOLAndClean(header, buff);
|
||||
headerLength := Strings.Length(key) + Strings.Length(val) + 2; (* 2 for ": " *)
|
||||
NEW(header, headerLength + 1); (* +1 for null terminator *)
|
||||
|
||||
COPY(key, header^);
|
||||
Strings.Append(": ", header^);
|
||||
Strings.Append(val, header^);
|
||||
|
||||
AppendEOLAndClean(header^, buff);
|
||||
END addHeader;
|
||||
|
||||
PROCEDURE getHeader(buff, key: ARRAY OF CHAR; VAR val: ARRAY OF CHAR);
|
||||
PROCEDURE getHeader(buff, key: ARRAY OF CHAR; VAR val: PString);
|
||||
VAR
|
||||
positionStart, valPositionStart, i: LONGINT;
|
||||
BEGIN
|
||||
positionStart := Strings.Pos(key, buff, 0);
|
||||
valPositionStart := positionStart + Strings.Length(key) + 1;
|
||||
NEW(val, Strings.Length(buff) - valPositionStart + 1);
|
||||
i := 0;
|
||||
REPEAT
|
||||
val[i] := buff[valPositionStart + i];
|
||||
INC(i);
|
||||
UNTIL (ORD(val[i]) = 10) (* 0DX number(newline)*) OR
|
||||
(i > Strings.Length(buff));
|
||||
UNTIL (ORD(val[i]) = 10) OR (i > Strings.Length(buff));
|
||||
END getHeader;
|
||||
|
||||
PROCEDURE get *(host, port, path: ARRAY OF CHAR; VAR buff: ARRAY OF CHAR);
|
||||
PROCEDURE get*(host, port, path: ARRAY OF CHAR; VAR buff: PString);
|
||||
VAR
|
||||
socket : Internet.Socket;
|
||||
connectionFlag: BOOLEAN;
|
||||
valueContentLength: REAL;
|
||||
send, valueContentLengthString: ARRAY MAXARRAYNUMBER OF CHAR;
|
||||
sendClean: PSTRING;
|
||||
httpTail: ARRAY 16 OF CHAR;
|
||||
endOfLine: ARRAY 3 OF CHAR;
|
||||
tmpBuff: ARRAY MAXARRAYNUMBER OF CHAR;
|
||||
socket: Internet.Socket;
|
||||
connectionFlag: BOOLEAN;
|
||||
valueContentLength: REAL;
|
||||
send, valueContentLengthString: PString;
|
||||
sendClean: PString;
|
||||
httpTail: ARRAY 16 OF CHAR;
|
||||
tmpBuff: PString;
|
||||
sendLength: LONGINT;
|
||||
BEGIN
|
||||
Empty( buff);
|
||||
httpTail := " HTTP/1.1";
|
||||
Empty(buff);
|
||||
httpTail := " HTTP/1.1";
|
||||
|
||||
connectionFlag := Internet.Connect(host, port, socket);
|
||||
sendLength := Strings.Length(path) + Strings.Length(httpTail) + 4; (* 4 for "GET " *)
|
||||
NEW(send, sendLength);
|
||||
|
||||
send := "GET ";
|
||||
COPY("GET ", send^);
|
||||
Strings.Append(path, send^);
|
||||
Strings.Append(httpTail, send^);
|
||||
|
||||
Strings.Append(path, send);
|
||||
Strings.Append(httpTail, send);
|
||||
AppendEOLAndClean(send^, sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
|
||||
addHeader("HOST", host, sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
|
||||
AppendEOLAndClean(send, sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
addHeader("User-Agent", "oberon-http-client/1.0", sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
|
||||
addHeader("HOST", host, sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
addHeader("Accept", "*/*", sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
|
||||
addHeader("User-Agent", "oberon-http-client/1.0", sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
AppendEOLAndClean("", sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
|
||||
addHeader("Accept", "*/*", sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
|
||||
AppendEOLAndClean("", sendClean);
|
||||
connectionFlag := Internet.Write(socket, sendClean^);
|
||||
REPEAT
|
||||
Empty( tmpBuff);
|
||||
|
||||
connectionFlag := Internet.Read(socket, tmpBuff);
|
||||
Strings.Append(tmpBuff, buff);
|
||||
getHeader(buff, "Content-Length", valueContentLengthString);
|
||||
Strings.StrToReal(valueContentLengthString, valueContentLength);
|
||||
(* Out.Real(valueContentLength, 6);
|
||||
Out.Ln;
|
||||
vpkLogger.LogIntLn(Strings.Length(buff));
|
||||
*)
|
||||
(* vpkLogger.Log(buff); *)
|
||||
UNTIL ~connectionFlag OR (Strings.Length(buff) > valueContentLength);
|
||||
Internet.Disconnect(socket);
|
||||
REPEAT
|
||||
Empty(tmpBuff);
|
||||
connectionFlag := Internet.Read(socket, tmpBuff^);
|
||||
Strings.Append(tmpBuff^, buff^);
|
||||
getHeader(buff^, "Content-Length", valueContentLengthString);
|
||||
Strings.StrToReal(valueContentLengthString^, valueContentLength);
|
||||
UNTIL ~connectionFlag OR (Strings.Length(buff^) > valueContentLength);
|
||||
Internet.Disconnect(socket);
|
||||
END get;
|
||||
|
||||
|
||||
BEGIN
|
||||
(* get("norayr.am", "/tmp/", "80", buff);
|
||||
getClean(buff, buff2);
|
||||
vpkLogger.Log(buff2); *)
|
||||
(* Example usage of the get procedure *)
|
||||
(* get("example.com", "80", "/path", buff);
|
||||
getClean(buff^, buff2);
|
||||
vpkLogger.Log(buff2^); *)
|
||||
END vpkHttp.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue