From 5e2a8b2d4cd861c66363707191b8fa88114f623a Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 5 Nov 2011 13:16:45 +0900 Subject: [PATCH] Fixed bug that some information such as port number is lost if redirect URI contains only path component. --- src/Request.cc | 13 ++++++++----- test/RequestTest.cc | 15 ++++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/Request.cc b/src/Request.cc index b710206d..7c80aa18 100644 --- a/src/Request.cc +++ b/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; } diff --git a/test/RequestTest.cc b/test/RequestTest.cc index 33c213d3..9cb7b446 100644 --- a/test/RequestTest.cc +++ b/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()