Permalink
Browse files

parser: fix Content-Length header parsing.

Commit e2e467b ("Update http-parser to 2.6.1") enforces that messages
contain no more than one Content-Length header but it considers any
header that starts with "Content-Length" as a duplicate.

Fix: #324
PR-URL: #325
Reviewed-By: Fedor Indutny <fedor@indutny.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information...
1 parent b2cc8e4 commit cacb07d2b4ebcd86fc44fd6ee3f0020125e7a9a6 @bnoordhuis bnoordhuis committed with indutny Jul 3, 2016
Showing with 32 additions and 5 deletions.
  1. +6 −5 http_parser.c
  2. +26 −0 test.c
View
@@ -1366,12 +1366,7 @@ size_t http_parser_execute (http_parser *parser,
|| c != CONTENT_LENGTH[parser->index]) {
parser->header_state = h_general;
} else if (parser->index == sizeof(CONTENT_LENGTH)-2) {
- if (parser->flags & F_CONTENTLENGTH) {
- SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
- goto error;
- }
parser->header_state = h_content_length;
- parser->flags |= F_CONTENTLENGTH;
}
break;
@@ -1474,6 +1469,12 @@ size_t http_parser_execute (http_parser *parser,
goto error;
}
+ if (parser->flags & F_CONTENTLENGTH) {
+ SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
+ goto error;
+ }
+
+ parser->flags |= F_CONTENTLENGTH;
parser->content_length = ch - '0';
break;
View
@@ -1745,6 +1745,32 @@ const struct message responses[] =
,.body= ""
}
+#define CONTENT_LENGTH_X 21
+, {.name= "Content-Length-X"
+ ,.type= HTTP_RESPONSE
+ ,.raw= "HTTP/1.1 200 OK\r\n"
+ "Content-Length-X: 0\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "2\r\n"
+ "OK\r\n"
+ "0\r\n"
+ "\r\n"
+ ,.should_keep_alive= TRUE
+ ,.message_complete_on_eof= FALSE
+ ,.http_major= 1
+ ,.http_minor= 1
+ ,.status_code= 200
+ ,.response_status= "OK"
+ ,.num_headers= 2
+ ,.headers= { { "Content-Length-X", "0" }
+ , { "Transfer-Encoding", "chunked" }
+ }
+ ,.body= "OK"
+ ,.num_chunks_complete= 2
+ ,.chunk_lengths= { 2 }
+ }
+
, {.name= NULL } /* sentinel */
};

0 comments on commit cacb07d

Please sign in to comment.