Преглед на файлове

Fixed bug that some information such as port number is lost if
redirect URI contains only path component.

Tatsuhiro Tsujikawa преди 14 години
родител
ревизия
5e2a8b2d4c
променени са 2 файла, в които са добавени 18 реда и са изтрити 10 реда
  1. 8 5
      src/Request.cc
  2. 10 5
      test/RequestTest.cc

+ 8 - 5
src/Request.cc

@@ -111,14 +111,17 @@ bool Request::redirectUri(const std::string& uri) {
   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.
+    uri::UriStruct rus(us_);
+    rus.query.clear();
+    rus.file.clear();
+    size_t offset = 0;
     if(uri[0] == '/') {
       // abosulute path
-      redirectedUri = strconcat(us_.protocol, "://", us_.host, uri);
-    } else {
-      // relative path
-      redirectedUri = strconcat(us_.protocol, "://", us_.host, us_.dir,
-                                "/", uri);
+      rus.dir.clear();
+      offset = 1;
     }
+    redirectedUri = uri::construct(rus);
+    redirectedUri.append(uri.begin()+offset, uri.end());
   } else {
     redirectedUri = uri;
   }

+ 10 - 5
test/RequestTest.cc

@@ -98,8 +98,13 @@ void RequestTest::testRedirectUri()
   req.supportsPersistentConnection(false);
   req.setUri("http://aria.rednoah.com:8080/aria2/index.html");
   
-  bool v2 = req.redirectUri("http://aria.rednoah.co.jp/");
-  CPPUNIT_ASSERT(v2);
+  // See port number is preserved.
+  CPPUNIT_ASSERT(req.redirectUri("/foo"));
+  CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/foo"),
+                       req.getCurrentUri());
+  CPPUNIT_ASSERT_EQUAL((unsigned int)1, req.getRedirectCount());
+
+  CPPUNIT_ASSERT(req.redirectUri("http://aria.rednoah.co.jp/"));
   // persistent connection flag is set to be true after redirection
   CPPUNIT_ASSERT(req.supportsPersistentConnection());
   // uri must be the same
@@ -118,20 +123,20 @@ void RequestTest::testRedirectUri()
   CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile());
   CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
   // See redirect count is incremented.
-  CPPUNIT_ASSERT_EQUAL((unsigned int)1, req.getRedirectCount());
+  CPPUNIT_ASSERT_EQUAL((unsigned int)2, req.getRedirectCount());
 
   // Give abosulute path
   CPPUNIT_ASSERT(req.redirectUri("/abspath/to/file"));
   CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/abspath/to/file"),
                        req.getCurrentUri());
-  CPPUNIT_ASSERT_EQUAL((unsigned int)2, req.getRedirectCount());
+  CPPUNIT_ASSERT_EQUAL((unsigned int)3, req.getRedirectCount());
 
   // Give relative path
   CPPUNIT_ASSERT(req.redirectUri("relativepath/to/file"));
   CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/abspath/to/"
                                    "relativepath/to/file"),
                        req.getCurrentUri());
-  CPPUNIT_ASSERT_EQUAL((unsigned int)3, req.getRedirectCount());
+  CPPUNIT_ASSERT_EQUAL((unsigned int)4, req.getRedirectCount());
 }
 
 void RequestTest::testRedirectUri2()