From: Timo Sirainen Date: Sun, 4 Aug 2013 11:03:54 +0000 (+0300) Subject: lib-http: Ignore trailing whitespace in headers. X-Git-Tag: 2.2.5~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9a449fb205b61613586b905ce3ee537486d5bd7c;p=thirdparty%2Fdovecot%2Fcore.git lib-http: Ignore trailing whitespace in headers. Patch by Stephan Bosch. --- diff --git a/src/lib-http/http-header-parser.c b/src/lib-http/http-header-parser.c index b556612893..d78f6ed69c 100644 --- a/src/lib-http/http-header-parser.c +++ b/src/lib-http/http-header-parser.c @@ -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; diff --git a/src/lib-http/test-http-header-parser.c b/src/lib-http/test-http-header-parser.c index d6a1af24e2..9187b0432e 100644 --- a/src/lib-http/test-http-header-parser.c +++ b/src/lib-http/test-http-header-parser.c @@ -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 } };