mirror of
https://github.com/apache/httpd.git
synced 2025-05-19 02:21:09 +03:00
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@80918 13f79535-47bb-0310-9956-ffa450edef68
87 lines
3.2 KiB
HTML
87 lines
3.2 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
|
<HTML>
|
|
<HEAD>
|
|
<TITLE>Reading Client Input in Apache 1.2</TITLE>
|
|
</HEAD>
|
|
|
|
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
|
|
<BODY
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#000080"
|
|
ALINK="#FF0000"
|
|
>
|
|
<!--#include virtual="header.html" -->
|
|
<H1 ALIGN="CENTER">Reading Client Input in Apache 1.2</H1>
|
|
|
|
<HR>
|
|
|
|
<P>Apache 1.1 and earlier let modules handle POST and PUT requests by
|
|
themselves. The module would, on its own, determine whether the
|
|
request had an entity, how many bytes it was, and then called a
|
|
function (<CODE>read_client_block</CODE>) to get the data.
|
|
|
|
<P>However, HTTP/1.1 requires several things of POST and PUT request
|
|
handlers that did not fit into this module, and all existing modules
|
|
have to be rewritten. The API calls for handling this have been
|
|
further abstracted, so that future HTTP protocol changes can be
|
|
accomplished while remaining backwards-compatible.</P>
|
|
|
|
<HR>
|
|
|
|
<H3>The New API Functions</H3>
|
|
|
|
<PRE>
|
|
int ap_setup_client_block (request_rec *, int read_policy);
|
|
int ap_should_client_block (request_rec *);
|
|
long ap_get_client_block (request_rec *, char *buffer, int buffer_size);
|
|
</PRE>
|
|
|
|
<OL>
|
|
<LI>Call <CODE>ap_setup_client_block()</CODE> near the beginning of the request
|
|
handler. This will set up all the necessary properties, and
|
|
will return either OK, or an error code. If the latter,
|
|
the module should return that error code. The second parameter
|
|
selects the policy to apply if the request message indicates a
|
|
body, and how a chunked
|
|
transfer-coding should be interpreted. Choose one of
|
|
<PRE>
|
|
REQUEST_NO_BODY Send 413 error if message has any body
|
|
REQUEST_CHUNKED_ERROR Send 411 error if body without Content-Length
|
|
REQUEST_CHUNKED_DECHUNK If chunked, remove the chunks for me.
|
|
REQUEST_CHUNKED_PASS Pass the chunks to me without removal.
|
|
</PRE>
|
|
In order to use the last two options, the caller MUST provide a buffer
|
|
large enough to hold a chunk-size line, including any extensions.
|
|
|
|
|
|
|
|
<LI>When you are ready to possibly accept input, call
|
|
<CODE>ap_should_client_block()</CODE>.
|
|
This will tell the module whether or not to read input. If it is 0,
|
|
the module should assume that the input is of a non-entity type
|
|
(e.g. a GET request). A nonzero response indicates that the module
|
|
should proceed (to step 3).
|
|
This step also sends a 100 Continue response
|
|
to HTTP/1.1 clients, so should not be called until the module
|
|
is <STRONG>*definitely*</STRONG> ready to read content. (otherwise, the point of the
|
|
100 response is defeated). Never call this function more than once.
|
|
|
|
<LI>Finally, call <CODE>ap_get_client_block</CODE> in a loop. Pass it a
|
|
buffer and its
|
|
size. It will put data into the buffer (not necessarily the full
|
|
buffer, in the case of chunked inputs), and return the length of
|
|
the input block. When it is done reading, it will
|
|
return 0 if EOF, or -1 if there was an error.
|
|
|
|
</OL>
|
|
|
|
<P>As an example, please look at the code in
|
|
<CODE>mod_cgi.c</CODE>. This is properly written to the new API
|
|
guidelines.</P>
|
|
|
|
<!--#include virtual="footer.html" -->
|
|
</BODY>
|
|
</HTML>
|