| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta name="generator" content="HTML Tidy, see www.w3.org" /> |
| |
| <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> |
| |
| <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> |
| |
| <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 |
| (<em>e.g.</em>, 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> |
| |
| <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.</li> |
| </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> |
| |