Skip to content

Commit

Permalink
parse_request: don’t normalise path for CONNECT
Browse files Browse the repository at this point in the history
  • Loading branch information
jberkel authored and arvidn committed May 8, 2017
1 parent cb24b32 commit 70feade
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 2 deletions.
6 changes: 5 additions & 1 deletion src/http_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,11 @@ namespace sim
}
ret.method.assign(start, space);
ret.req.assign(space+1, space2);
ret.path.assign(normalize(ret.req.substr(0, ret.req.find_first_of('?'))));
if (ret.method != "CONNECT") {
ret.path.assign(normalize(ret.req.substr(0, ret.req.find_first_of('?'))));
} else {
ret.path.assign(ret.req);
}
std::printf("parse_request: %s %s [%s]\n"
, ret.method.c_str(), ret.path.c_str(), ret.req.c_str());

Expand Down
39 changes: 38 additions & 1 deletion test/parse_request.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ All rights reserved.
#pragma GCC diagnostic ignored "-Wparentheses"
#endif

TEST_CASE("[parse_request]")
TEST_CASE("parse GET request", "[parse_request]")
{
auto str = "GET /foo/bar?x=4 HTTP/1.1\r\n\r\n";
sim::http_request req = sim::parse_request(str, std::strlen(str));
Expand All @@ -37,3 +37,40 @@ TEST_CASE("[parse_request]")
CHECK(req.headers.empty());
}

TEST_CASE("request path is normalized (no leading slash)", "[parse_request]")
{
auto str = "GET foo/bar HTTP/1.1\r\n\r\n";
sim::http_request req = sim::parse_request(str, std::strlen(str));
CHECK(req.path == "/foo/bar");
}

TEST_CASE("request path is normalized (..)", "[parse_request]")
{
auto str = "GET /foo/../foo/bar HTTP/1.1\r\n\r\n";
sim::http_request req = sim::parse_request(str, std::strlen(str));
CHECK(req.path == "/foo/bar");
}

TEST_CASE("parse CONNECT request", "[parse_request]")
{
auto str = "CONNECT 192.168.0.1:8888 HTTP/1.1\r\n\r\n";
sim::http_request req = sim::parse_request(str, std::strlen(str));
CHECK(req.method == "CONNECT");
CHECK(req.req == "192.168.0.1:8888");
CHECK(req.path == "192.168.0.1:8888");
CHECK(req.headers.empty());
}

TEST_CASE("headers are parsed", "[parse_request]")
{
auto str = "GET / HTTP/1.1\r\nX-Foo: Bar\r\n\r\n";
sim::http_request req = sim::parse_request(str, std::strlen(str));
CHECK(!req.headers.empty());
CHECK(req.headers["x-foo"] == "Bar");
}

TEST_CASE("invalid formed request throws parse exception", "[parse_request]")
{
auto str = "INVALID";
REQUIRE_THROWS_WITH(sim::parse_request(str, std::strlen(str)), Catch::Contains("parse failed"));
}

0 comments on commit 70feade

Please sign in to comment.