diff --git a/http_parser.c b/http_parser.c index 50795e9..f97311b 100644 --- a/http_parser.c +++ b/http_parser.c @@ -947,6 +947,7 @@ size_t http_parser_execute (http_parser *parser, if (parser->index == 1 && ch == 'E') { parser->method = HTTP_SEARCH; } else { + SET_ERRNO(HPE_INVALID_METHOD); goto error; } } else if (parser->index == 1 && parser->method == HTTP_POST) { @@ -957,13 +958,27 @@ size_t http_parser_execute (http_parser *parser, } else if (ch == 'A') { parser->method = HTTP_PATCH; } else { + SET_ERRNO(HPE_INVALID_METHOD); goto error; } } else if (parser->index == 2) { if (parser->method == HTTP_PUT) { - if (ch == 'R') parser->method = HTTP_PURGE; + if (ch == 'R') { + parser->method = HTTP_PURGE; + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } } else if (parser->method == HTTP_UNLOCK) { - if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; + if (ch == 'S') { + parser->method = HTTP_UNSUBSCRIBE; + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; } } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { parser->method = HTTP_PROPPATCH; diff --git a/test.c b/test.c index 995874c..06be2ca 100644 --- a/test.c +++ b/test.c @@ -3275,7 +3275,10 @@ main (void) test_simple("hello world", HPE_INVALID_METHOD); test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); - + test_simple("GEM / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("PUN / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("PX / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("SA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); test_simple("ASDF / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD);