]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
* implemented support for multi-line headers as required by RFC2616.
authorwilly tarreau <willy@wtap.(none)>
Thu, 2 Mar 2006 15:50:45 +0000 (16:50 +0100)
committerwilly tarreau <willy@wtap.(none)>
Thu, 2 Mar 2006 15:50:45 +0000 (16:50 +0100)
haproxy.c

index 94839ffd9c5e3d62528b8221ca8a1f50da883e93..45453a9486509431733211edb8d27bbb0e144af9 100644 (file)
--- a/haproxy.c
+++ b/haproxy.c
@@ -3203,8 +3203,10 @@ int process_cli(struct session *t) {
                goto process_data;
            }
 
-           /* to get a complete header line, we need the ending \r\n, \n\r, \r or \n too */
-           if (ptr > req->r - 2) {
+           /* To get a complete header line, we need the ending \r\n, \n\r,
+            * \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 */
                req->lr = ptr;
                break;
@@ -3218,6 +3220,29 @@ int process_cli(struct session *t) {
            else
                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
             * we want with these pointers :