diff --git a/src/vpkHttp.Mod b/src/vpkHttp.Mod index 2c908dc..bf73f8e 100644 --- a/src/vpkHttp.Mod +++ b/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; + +TYPE + 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^); + 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); -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; +PROCEDURE get*(host, port, path: ARRAY OF CHAR; VAR buff: PString); +VAR + 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"; - - connectionFlag := Internet.Connect(host, port, socket); - - send := "GET "; + Empty(buff); + httpTail := " HTTP/1.1"; - Strings.Append(path, send); - Strings.Append(httpTail, send); + sendLength := Strings.Length(path) + Strings.Length(httpTail) + 4; (* 4 for "GET " *) + NEW(send, sendLength); + COPY("GET ", 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^); - - addHeader("User-Agent", "oberon-http-client/1.0", sendClean); - connectionFlag := Internet.Write(socket, sendClean^); + AppendEOLAndClean(send^, sendClean); + connectionFlag := Internet.Write(socket, sendClean^); - addHeader("Accept", "*/*", sendClean); - connectionFlag := Internet.Write(socket, sendClean^); + addHeader("HOST", host, sendClean); + connectionFlag := Internet.Write(socket, sendClean^); - AppendEOLAndClean("", sendClean); - connectionFlag := Internet.Write(socket, sendClean^); - REPEAT - Empty( tmpBuff); + addHeader("User-Agent", "oberon-http-client/1.0", sendClean); + connectionFlag := Internet.Write(socket, sendClean^); - 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); + 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); + 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.