Merge branch 'rfc2616' into switch

This commit is contained in:
Willy Tarreau 2006-12-02 20:13:39 +01:00
commit 09536952b3
1 changed files with 27 additions and 2 deletions

View File

@ -469,8 +469,10 @@ int process_cli(struct session *t)
goto process_data; goto process_data;
} }
/* to get a complete header line, we need the ending \r\n, \n\r, \r or \n too */ /* To get a complete header line, we need the ending \r\n, \n\r,
if (ptr > req->r - 2) { * \r or \n, possibly followed by a white space or tab indicating
* that the header goes on next line. */
if (ptr > req->r - 3) {
/* this is a partial header, let's wait for more to come */ /* this is a partial header, let's wait for more to come */
req->lr = ptr; req->lr = ptr;
break; break;
@ -484,6 +486,29 @@ int process_cli(struct session *t)
else else
req->lr = ptr + 2; /* \r\n or \n\r */ req->lr = ptr + 2; /* \r\n or \n\r */
/* Now, try to detect multi-line headers. From RFC 2616 :
* HTTP/1.1 header field values can be folded onto multiple lines if the
* continuation line begins with a space or horizontal tab. All linear
* white space, including folding, has the same semantics as SP. A
* recipient MAY replace any linear white space with a single SP before
* interpreting the field value or forwarding the message downstream.
*
* LWS = [CRLF] 1*( SP | HT )
*/
if (req->lr < req->r &&
(*req->lr == ' ' || *req->lr == '\t')) {
/* we are allowed to replace the \r\n with spaces */
while (ptr < req->lr)
*ptr++ = ' ';
/* now look for end of LWS */
do {
req->lr++;
} while (req->lr < req->r && (*req->lr == ' ' || *req->lr == '\t'));
/* continue processing on the same header */
continue;
}
/* /*
* now we know that we have a full header ; we can do whatever * now we know that we have a full header ; we can do whatever
* we want with these pointers : * we want with these pointers :