Skip to content

Commit

Permalink
Support network-path reference in HTTP redirect.
Browse files Browse the repository at this point in the history
  • Loading branch information
tatsuhiro-t committed Jan 10, 2012
1 parent 2997fa0 commit a6803c2
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/Request.cc
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,16 @@ bool Request::redirectUri(const std::string& uri) {
return false;
}
std::string redirectedUri;
if(uri.find("://") == std::string::npos) {
if(util::startsWith(uri, "//")) {
// Network-path reference (according to RFC 3986, Section 4.2)
// Just complement current protocol.
redirectedUri = getProtocol();
redirectedUri += ":";
redirectedUri += uri;
} else if(uri.find("://") == std::string::npos) {
// rfc2616 requires absolute URI should be provided by Location header
// field, but some servers don't obey this rule.
// UPDATE: draft-ietf-httpbis-p2-semantics-18 now allows this.
uri::UriStruct rus(us_);
rus.query.clear();
rus.file.clear();
Expand Down
5 changes: 5 additions & 0 deletions test/RequestTest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ void RequestTest::testRedirectUri()
"relativepath/to/file"),
req.getCurrentUri());
CPPUNIT_ASSERT_EQUAL(4, req.getRedirectCount());

// Give network-path reference
CPPUNIT_ASSERT(req.redirectUri("//host/to/file"));
CPPUNIT_ASSERT_EQUAL(std::string("http://host/to/file"), req.getCurrentUri());
CPPUNIT_ASSERT_EQUAL(5, req.getRedirectCount());
}

void RequestTest::testRedirectUri2()
Expand Down

0 comments on commit a6803c2

Please sign in to comment.