diff --git a/http.0.9.c b/http.0.9.c new file mode 100644 index 0000000..1a890d5 --- /dev/null +++ b/http.0.9.c @@ -0,0 +1,81 @@ +/* + * HTTP 0.9 + * + * request: + * GET url CR LF + * + * response: + * data EOF + * + * http://www.w3.org/Protocols/HTTP/AsImplemented.html + * + */ +#pragma optimize 79 +#pragma noroot + +#include +#include +#include + +#include + +#include "url.h" +#include "connection.h" +#include "prototypes.h" + +int do_http_0_9(const char *url, URLComponents *components, FILE *file) +{ + char *host; + Connection connection; + int ok; + + if (!components->portNumber) components->portNumber = 80; + + + host = URLComponentGetCMalloc(url, components, URLComponentHost); + + if (!host) + { + fprintf(stderr, "URL `%s': no host.", url); + return -1; + } + + ok = ConnectLoop(host, components->portNumber, &connection); + + if (!ok) + { + free(host); + return -1; + } + + + // connected.... + TCPIPWriteTCP(connection.ipid, "GET ", 4, false, false); + + if (components->pathAndQuery.length) + { + const char *path = url + components->pathAndQuery.location; + int length = components->pathAndQuery.length; + + TCPIPWriteTCP(connection.ipid, path, length, false, false); + } + else + { + TCPIPWriteTCP(connection.ipid, "/", 1, false, false); + } + + TCPIPWriteTCP(connection.ipid, "\r\n", 2, true, false); + + // read until eof. + + ok = read_binary(connection.ipid, file); + + fflush(file); + + CloseLoop(&connection); + free(host); + + return 0; + +} + \ No newline at end of file diff --git a/http.1.0.c b/http.1.0.c new file mode 100644 index 0000000..d9a6a07 --- /dev/null +++ b/http.1.0.c @@ -0,0 +1,115 @@ + +/* + * HTTP 1.0 + * + * request: + * verb url version CR LF + * header CR LF * + * CR LF + * + * response: + * status CR LF + * header CR LF * + * CR LF + * data + */ + +#pragma optimize 79 +#pragma noroot + +#include +#include +#include + +#include + +#include "url.h" +#include "connection.h" +#include "prototypes.h" +#include "dictionary.h" + +int do_http_1_0(const char *url, URLComponents *components, FILE *file) +{ + char *host; + Connection connection; + int ok; + Handle dict; + + if (!components->portNumber) components->portNumber = 80; + + + host = URLComponentGetCMalloc(url, components, URLComponentHost); + + if (!host) + { + fprintf(stderr, "URL `%s': no host.", url); + return -1; + } + + ok = ConnectLoop(host, components->portNumber, &connection); + + if (!ok) + { + free(host); + return -1; + } + + // html headers. + // (not really needed until 1.1) + dict = DictionaryCreate(MMStartUp(), 2048); + DictionaryAdd(dict, "Host", 4, host, components->host.length, false); + DictionaryAdd(dict, "Connection", 10, "close", 5, false); + + // connected.... + + // send the request. + TCPIPWriteTCP(connection.ipid, "GET ", 4, false, false); + + if (components->pathAndQuery.length) + { + TCPIPWriteTCP(connection.ipid, + url + components->pathAndQuery.location, + components->pathAndQuery.length, + false, + false); + } + else + { + TCPIPWriteTCP(connection.ipid, "/", 1, false, false); + } + + TCPIPWriteTCP(connection.ipid, " HTTP/1.0\r\n", 11, false, false); + + // send the headers. + { + DictionaryEnumerator e; + Word cookie; + + cookie = 0; + while ((cookie = DictionaryEnumerate(dict, &e, cookie))) + { + if (!e.keySize) continue; + + TCPIPWriteTCP(connection.ipid, e.key, e.keySize, false, false); + TCPIPWriteTCP(connection.ipid, ": ", 2, false, false); + TCPIPWriteTCP(connection.ipid, e.value, e.valueSize, false, false); + TCPIPWriteTCP(connection.ipid, "\r\n", 2, false, false); + } + } + // end headers and push. + TCPIPWriteTCP(connection.ipid, "\r\n", 2, true, false); + + + // read until eof. + + ok = read_binary(connection.ipid, file); + + fflush(file); + + CloseLoop(&connection); + free (host); + DisposeHandle(dict); + + return 0; + +}