From: willy tarreau Date: Mon, 10 Apr 2006 19:01:39 +0000 (+0200) Subject: * ignore leading empty lines in HTTP requests (RFC2616) X-Git-Tag: v1.2.12^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=43b15128347df59f31b57c0e5fa9c7a3c6d09e5f;p=thirdparty%2Fhaproxy.git * ignore leading empty lines in HTTP requests (RFC2616) --- diff --git a/TODO b/TODO index b06ce74b40..cd6513f74a 100644 --- a/TODO +++ b/TODO @@ -149,4 +149,5 @@ Todo for 1.2 activity on the buffer's pointers from touching the buffer page itself. - make buffer size configurable in global options * monitor number of simultaneous sessions in logs (per srv/inst/global) +* ignore leading empty lines in HTTP requests diff --git a/haproxy.c b/haproxy.c index df6f5d664f..817cb0d2ed 100644 --- a/haproxy.c +++ b/haproxy.c @@ -3311,6 +3311,32 @@ int process_cli(struct session *t) { if (ptr == req->h) { /* empty line, end of headers */ int line, len; + + /* + * first, let's check that it's not a leading empty line, in + * which case we'll ignore and remove it (according to RFC2616). + */ + if (req->h == req->data) { + /* to get a complete header line, we need the ending \r\n, \n\r, \r or \n too */ + if (ptr > req->r - 2) { + /* this is a partial header, let's wait for more to come */ + req->lr = ptr; + break; + } + + /* now we know that *ptr is either \r or \n, + * and that there are at least 1 char after it. + */ + if ((ptr[0] == ptr[1]) || (ptr[1] != '\r' && ptr[1] != '\n')) + req->lr = ptr + 1; /* \r\r, \n\n, \r[^\n], \n[^\r] */ + else + req->lr = ptr + 2; /* \r\n or \n\r */ + /* ignore empty leading lines */ + buffer_replace2(req, req->h, req->lr, NULL, 0); + req->h = req->lr; + continue; + } + /* we can only get here after an end of headers */ /* we'll have something else to do here : add new headers ... */