diff --git a/http_parser.c b/http_parser.c index 122ede1..9c5640f 100644 --- a/http_parser.c +++ b/http_parser.c @@ -331,10 +331,20 @@ size_t http_parser_execute (http_parser *parser, uint64_t nread = parser->nread; if (len == 0) { - if (state == s_body_identity_eof) { - CALLBACK2(message_complete); + switch (state) { + case s_body_identity_eof: + CALLBACK2(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + return 1; // error } - return 0; } /* technically we could combine all of these (except for url_mark) into one diff --git a/test.c b/test.c index e5699aa..2d1d8bd 100644 --- a/test.c +++ b/test.c @@ -1735,14 +1735,22 @@ main (void) /// REQUESTS - test_simple("hello world", 0); test_simple("GET / HTP/1.1\r\n\r\n", 0); + test_simple("ASDF / HTTP/1.1\r\n\r\n", 0); test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", 0); test_simple("GETA / HTTP/1.1\r\n\r\n", 0); + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + 0); + static const char *all_methods[] = { "DELETE", "GET",