/* * NAME: http_request.c * DESCRIPTION: handle an HTTP request */ inherit rfc822 "/lpc/rfc822"; # include "http.h" string method; /* the requested method */ string uri; /* the requested uniform resource id */ string pvers; /* the client protocol version */ string query; /* posting/searching information */ object client; /* the client object */ /* * NAME: process() * DESCRIPTION: initial request is completed */ private void process(void) { object doc; catch(doc = call_other(WWW_ROOT, method, uri, query, rfc822::get_header("accept"))); if (! doc) doc = HTTP->error_doc(R_INTERNALERR, "An internal error prevented the document from " + "being returned."); if (pvers != HTTP_09) { int status; string descrip, type; status = doc->status(); descrip = HTTP->status_descrip(status); type = doc->content_type(); client->notify(HTTP_SVERS + " " + (string) status + " " + descrip); client->notify("MIME-Version: " + HTTP_MIMEVERS); client->notify("Server: " + HTTP_SERVER); client->notify("Date: " + ctime(time())); client->notify("Content-Type: " + type); doc->headers(client); client->notify(""); } doc->output(client); destruct_object(doc); call_out("finish", 1); } /* * NAME: finish() * DESCRIPTION: close connection and destroy this request object */ static void finish(void) { client->boot(); destruct_object(this_object()); } /* * NAME: htrq_body() * DESCRIPTION: receive an HTRQ body line */ int htrq_body(string line) { query = line; process(); return 1; } /* * NAME: htrq_header() * DESCRIPTION: receive an HTRQ header */ int htrq_header(string line) { while (1) { if (! rfc822::receive_line(line)) break; if (! (line = client->get_line())) { input_to("htrq_header"); return 1; } } /* headers finished */ if (method == "POST") { if (line = client->get_line()) htrq_body(line); else input_to("htrq_body"); return 1; } else process(); return 1; } /* * NAME: init() * DESCRIPTION: called after creation to initialize */ void init(string imethod, string iuri, string ipvers) { string line; method = imethod; uri = iuri; pvers = ipvers; client = this_user(); if (pvers != HTTP_09) { if (line = client->get_line()) htrq_header(line); else input_to("htrq_header"); return; } /* simple request; process immediately */ process(); }