]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Ignore trailing whitespace in headers.
authorTimo Sirainen <tss@iki.fi>
Sun, 4 Aug 2013 11:03:54 +0000 (14:03 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 4 Aug 2013 11:03:54 +0000 (14:03 +0300)
Patch by Stephan Bosch.

src/lib-http/http-header-parser.c
src/lib-http/test-http-header-parser.c

index b556612893151ff78b547e0cf49a5329862237fa..d78f6ed69cab05ce3a103ad52db7175bd6f239a5 100644 (file)
@@ -124,7 +124,7 @@ static int http_header_parse(struct http_header_parser *parser)
        int ret;
 
        /* 'header'       = *( header-field CRLF ) CRLF
-          header-field   = field-name ":" OWS field-value BWS
+          header-field   = field-name ":" OWS field-value OWS
           field-name     = token
           field-value    = *( field-content / obs-fold )
           field-content  = *( HTAB / SP / VCHAR / obs-text )
@@ -247,6 +247,7 @@ int http_header_parse_next_field(struct http_header_parser *parser,
        const char **name_r, const unsigned char **data_r, size_t *size_r,
        const char **error_r)
 {
+       const unsigned char *data;
        size_t size;
        int ret;
 
@@ -264,8 +265,16 @@ int http_header_parse_next_field(struct http_header_parser *parser,
 
                if (ret == 1) {
                        if (parser->state != HTTP_HEADER_PARSE_STATE_EOH) {
+                               data = buffer_get_data(parser->value_buf, &size);
+                       
+                               /* trim trailing OWS */
+                               while (size > 0 &&
+                                       (data[size-1] == ' ' || data[size-1] == '\t'))
+                                       size--;
+
                                *name_r = str_c(parser->name);
-                               *data_r = buffer_get_data(parser->value_buf, size_r);
+                               *data_r = data;
+                               *size_r = size;
                                parser->state = HTTP_HEADER_PARSE_STATE_INIT;
                        } else {
                                *name_r = NULL;
index d6a1af24e2ad68198a9168b9d6ca748c4f8a386d..9187b0432e16ab0a96a695226a4ee822105fcf62 100644 (file)
@@ -62,6 +62,22 @@ static struct http_header_parse_result valid_header_parse_result3[] = {
 };
 
 static struct http_header_parse_result valid_header_parse_result4[] = {
+       { "Age", "58" },
+       { "Date", "Sun, 04 Aug 2013 09:33:09 GMT" },
+       { "Expires", "Sun, 04 Aug 2013 09:34:08 GMT" },
+       { "Cache-Control", "max-age=60" },
+       { "Content-Length", "17336" },
+       { "Connection", "Keep-Alive" },
+       { "Via", "NS-CACHE-9.3" },
+       { "Server", "Apache" },
+       { "Vary", "Host" },
+       { "Last-Modified", "Sun, 04 Aug 2013 09:33:07 GMT" },
+       { "Content-Type", "text/html; charset=utf-8" },
+       { "Content-Encoding", "gzip" },
+       { NULL, NULL }
+};
+
+static struct http_header_parse_result valid_header_parse_result5[] = {
        { NULL, NULL }
 };
 
@@ -108,9 +124,25 @@ static const struct http_header_parse_test valid_header_parse_tests[] = {
                        "\r\n",
                .fields = valid_header_parse_result3
        },{
-               .header =
+               .header = 
+                       "Age: 58        \r\n"
+                       "Date: Sun, 04 Aug 2013 09:33:09 GMT\r\n"
+                       "Expires: Sun, 04 Aug 2013 09:34:08 GMT\r\n"
+                       "Cache-Control: max-age=60        \r\n"
+                       "Content-Length: 17336     \r\n"
+                       "Connection: Keep-Alive\r\n"
+                       "Via: NS-CACHE-9.3\r\n"
+                       "Server: Apache\r\n"
+                       "Vary: Host\r\n"
+                       "Last-Modified: Sun, 04 Aug 2013 09:33:07 GMT\r\n"
+                       "Content-Type: text/html; charset=utf-8\r\n"
+                       "Content-Encoding: gzip\r\n"
                        "\r\n",
                .fields = valid_header_parse_result4
+       },{
+               .header =
+                       "\r\n",
+               .fields = valid_header_parse_result5
        }
 };