- From: Erik Selberg <speed@cs.washington.edu>
- Date: Tue, 23 Jan 1996 10:26:05 PST
- To: www-lib@w3.org
Didn't need to hack the library... here are some code snippets. I use a class "URLClass" which has a bunch of spiffy methods, like isPostURL() etc. Looks like the java class, acually. Anyway, here's basically how I do a GET/POST. DANGER DANGER DANGER DANGER! I encountered two bugs in the library (4.0) which cause this code NOT to work. The first is in streampipe(), which causes the output stream of anything but a GET request to be HTBlackHole (i.e. /dev/null!), the second being in HTMIME_put_block which causes anything using the content_length field (like POST requests) to stop reading after you've _read_ content_length bytes (the content_length is used for telling the server how many bytes you're writing). I'm assuming Henrik will have patches for these in a day or so. Anyway, here's a sketch of how I do a POST. I personally think it's far too convoluded, but that's me. /* printAnchor is a PostCallback function which does just that --- it prints the request->anchor->document to the target */ int printPostData(HTRequest *request, HTStream *target) { int status; if (!request || !request->anchor || !request->anchor->document) return HT_OK; /* this is normally a void * or a HyperDoc *, or something. */ char *s = (char *) request->anchor->document; /* set the various MIME fields */ HTRequest_setMethod(request, METHOD_POST); HTAnchor_setFormat(request->anchor, HTAtom_for("application/x-www-form-urlencoded")); HTAnchor_setLength(request->anchor, strlen(s)); /* send the doc down the target stream */ status = (*target->isa->put_string)(target, s); if (status != HT_OK) return status; /* and flush it. */ status = (*target->isa->flush)(target); return status; } int get_url(URLClass *url) { char *thisURL = url->toExternalForm(); // i.e. "http://some.dom"; HTRequest *request = HTRequest_new(); /* we do this so we can set the anchor->document, which contains the postData. We gotta do some conversions though. */ HTParentAnchor *anchor = (HTParentAnchor *) HTAnchor_findAddress(thisURL); HTRequest_setAnchor(request, (HTAnchor *) anchor); /* see if the url we have should be a POST or GET method */ if (url->postData != "") if (url->isPostURL()) { request->PostCallback = printPostData; HTAnchor_setDocument(anchor, (char *) url->postData); } /* this puts the request into the event loop queue; keep calling HTEvent_Loop until it returns. */ return HTLoadAbsolute(thisURL, request); }
Received on Tuesday, 23 January 1996 13:26:08 UTC