diff --git a/httplib.h b/httplib.h index 092940e..1836b20 100644 --- a/httplib.h +++ b/httplib.h @@ -4204,7 +4204,7 @@ inline void Server::stop() { inline bool Server::parse_request_line(const char *s, Request &req) { const static std::regex re( "(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH|PRI) " - "(([^?]+)(?:\\?(.*?))?) (HTTP/1\\.[01])\r\n"); + "(([^? ]+)(?:\\?([^ ]*?))?) (HTTP/1\\.[01])\r\n"); std::cmatch m; if (std::regex_match(s, m, re)) { diff --git a/test/test.cc b/test/test.cc index 9eb577b..8222125 100644 --- a/test/test.cc +++ b/test/test.cc @@ -3004,6 +3004,12 @@ TEST(ServerRequestParsingTest, InvalidHeaderTextWithExtraCR) { "Content-Type: text/plain\r\n\r"); } +TEST(ServerRequestParsingTest, InvalidSpaceInURL) { + std::string out; + test_raw_request("GET /h i HTTP/1.1\r\n\r\n", &out); + EXPECT_EQ("HTTP/1.1 400 Bad Request", out.substr(0, 24)); +} + TEST(ServerStopTest, StopServerWithChunkedTransmission) { Server svr;