Parcourir la source

Support network-path reference in HTTP redirect.

Tatsuhiro Tsujikawa il y a 13 ans
Parent
commit
a6803c21b5
2 fichiers modifiés avec 13 ajouts et 1 suppressions
  1. 8 1
      src/Request.cc
  2. 5 0
      test/RequestTest.cc

+ 8 - 1
src/Request.cc

@@ -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();

+ 5 - 0
test/RequestTest.cc

@@ -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()