diff --git a/ChangeLog b/ChangeLog index 4bc41e71a..c11e4623d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-04-27 Tatsuhiro Tsujikawa + + Removed query part from filename in HTTP download. The query part means + the substring after "?" in URL. Firefox seems do the same thing. + A query part is sometimes very long and not suitable to filename, + so I think it is better to remove it from filename. + * src/HttpRequest.cc + * src/HttpRequest.h + * src/Request.cc + * src/Request.h + * test/HttpRequestTest.cc + * test/RequestTest.cc + 2008-04-27 Tatsuhiro Tsujikawa Rewritten Exception class. Throw exception object, not its pointer and diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc index d303e9fc1..70e281da0 100644 --- a/src/HttpRequest.cc +++ b/src/HttpRequest.cc @@ -141,7 +141,7 @@ std::string HttpRequest::createRequest() const } else { requestLine += getDir()+"/"; } - requestLine += getFile(); + requestLine += getFile()+getQuery(); } requestLine += std::string(" HTTP/1.1\r\n")+ @@ -281,4 +281,9 @@ std::string HttpRequest::getFile() const return request->getFile(); } +std::string HttpRequest::getQuery() const +{ + return request->getQuery(); +} + } // namespace aria2 diff --git a/src/HttpRequest.h b/src/HttpRequest.h index 6a1cc1244..ddf0ecfe1 100644 --- a/src/HttpRequest.h +++ b/src/HttpRequest.h @@ -108,6 +108,8 @@ public: std::string getFile() const; + std::string getQuery() const; + std::string getPreviousURI() const; SharedHandle getRange() const; diff --git a/src/Request.cc b/src/Request.cc index 8cf46c76e..cc9c7c943 100644 --- a/src/Request.cc +++ b/src/Request.cc @@ -88,12 +88,14 @@ bool Request::parseUrl(const std::string& url) { port = 0; dir = ""; file = ""; + _query = ""; _username = ""; _password = ""; // find query part + std::string queryTemp; std::string::size_type startQueryIndex = tempUrl.find("?"); if(startQueryIndex != std::string::npos) { - query = tempUrl.substr(startQueryIndex); + queryTemp = tempUrl.substr(startQueryIndex); tempUrl.erase(startQueryIndex); } // find protocol @@ -154,7 +156,7 @@ bool Request::parseUrl(const std::string& url) { if(tempUrl.size() > direp+1) { file = tempUrl.substr(direp+1); } - file += query; + _query = queryTemp; return true; } diff --git a/src/Request.h b/src/Request.h index 9319b8da1..1bd1f0d68 100644 --- a/src/Request.h +++ b/src/Request.h @@ -69,6 +69,8 @@ private: uint16_t port; std::string dir; std::string file; + /* after ? mark(includes '?' itself) */ + std::string _query; unsigned int tryCount; // whether or not the server supports persistent connection @@ -119,6 +121,7 @@ public: uint16_t getPort() const { return port; } std::string getDir() const { return dir; } std::string getFile() const { return file;} + std::string getQuery() const { return _query; } void supportsPersistentConnection(bool f) { diff --git a/test/HttpRequestTest.cc b/test/HttpRequestTest.cc index 7400d0979..dde436fea 100644 --- a/test/HttpRequestTest.cc +++ b/test/HttpRequestTest.cc @@ -19,6 +19,7 @@ class HttpRequestTest : public CppUnit::TestFixture { CPPUNIT_TEST(testCreateRequest); CPPUNIT_TEST(testCreateRequest_ftp); CPPUNIT_TEST(testCreateRequest_with_cookie); + CPPUNIT_TEST(testCreateRequest_query); CPPUNIT_TEST(testCreateProxyRequest); CPPUNIT_TEST(testIsRangeSatisfied); CPPUNIT_TEST(testUserAgent); @@ -34,6 +35,7 @@ public: void testCreateRequest(); void testCreateRequest_ftp(); void testCreateRequest_with_cookie(); + void testCreateRequest_query(); void testCreateProxyRequest(); void testIsRangeSatisfied(); void testUserAgent(); @@ -457,6 +459,26 @@ void HttpRequestTest::testCreateRequest_with_cookie() } +void HttpRequestTest::testCreateRequest_query() +{ + SharedHandle request(new Request()); + request->setUrl("http://localhost/wiki?id=9ad5109a-b8a5-4edf-9373-56a1c34ae138"); + HttpRequest httpRequest; + httpRequest.setRequest(request); + + std::string expectedText = + "GET /wiki?id=9ad5109a-b8a5-4edf-9373-56a1c34ae138 HTTP/1.1\r\n" + "User-Agent: aria2\r\n" + "Accept: */*\r\n" + "Host: localhost\r\n" + "Pragma: no-cache\r\n" + "Cache-Control: no-cache\r\n" + "Connection: close\r\n" + "\r\n"; + + CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest()); +} + void HttpRequestTest::testCreateProxyRequest() { SharedHandle request(new Request()); diff --git a/test/RequestTest.cc b/test/RequestTest.cc index 0bfe28c50..95c8e69e0 100644 --- a/test/RequestTest.cc +++ b/test/RequestTest.cc @@ -78,6 +78,7 @@ void RequestTest::testSetUrl1() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); CPPUNIT_ASSERT_EQUAL(std::string(""), req.getUsername()); CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPassword()); } @@ -98,6 +99,7 @@ void RequestTest::testSetUrl2() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl3() { @@ -110,6 +112,7 @@ void RequestTest::testSetUrl3() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/aria2"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl4() { @@ -122,6 +125,7 @@ void RequestTest::testSetUrl4() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/aria2/aria3"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl5() { @@ -134,6 +138,7 @@ void RequestTest::testSetUrl5() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/aria2/aria3"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl6() { @@ -146,6 +151,7 @@ void RequestTest::testSetUrl6() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/aria2"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("aria3"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl7() { @@ -184,7 +190,8 @@ void RequestTest::testSetUrl11() { CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol()); CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); - CPPUNIT_ASSERT_EQUAL(std::string("?query/"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("?query/"), req.getQuery()); } void RequestTest::testSetUrl12() { @@ -195,7 +202,8 @@ void RequestTest::testSetUrl12() { CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol()); CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); - CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getQuery()); } void RequestTest::testSetUrl13() { @@ -206,7 +214,8 @@ void RequestTest::testSetUrl13() { CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol()); CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); - CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getQuery()); } void RequestTest::testSetUrl14() { @@ -218,7 +227,8 @@ void RequestTest::testSetUrl14() { CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL((uint16_t)8080, req.getPort()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); - CPPUNIT_ASSERT_EQUAL(std::string("abc?query"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("abc"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getQuery()); } void RequestTest::testSetUrl15() @@ -231,6 +241,7 @@ void RequestTest::testSetUrl15() CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/dir1/dir2"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("file"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl16() @@ -243,6 +254,7 @@ void RequestTest::testSetUrl16() CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("file"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl17() @@ -253,7 +265,8 @@ void RequestTest::testSetUrl17() CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol()); CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/file%3cwith%252%20%20space"), req.getDir()); - CPPUNIT_ASSERT_EQUAL(std::string("file%20with%20space;param?a=/?"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("file%20with%20space;param"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string("?a=/?"), req.getQuery()); } void RequestTest::testRedirectUrl() { @@ -277,6 +290,7 @@ void RequestTest::testRedirectUrl() { CPPUNIT_ASSERT_EQUAL((uint16_t)80, req.getPort()); CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testRedirectUrl2() { @@ -303,7 +317,7 @@ void RequestTest::testResetUrl() { Request req; req.setUrl("http://aria.rednoah.com:8080/aria2/index.html"); req.setReferer("http://aria.rednoah.com:8080/"); - req.redirectUrl("ftp://aria.rednoah.co.jp/"); + req.redirectUrl("ftp://aria.rednoah.co.jp/index_en.html?view=wide"); bool v3 = req.resetUrl(); CPPUNIT_ASSERT(v3); @@ -319,6 +333,7 @@ void RequestTest::testResetUrl() { CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(std::string("/aria2"), req.getDir()); CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testInnerLink() { @@ -326,6 +341,7 @@ void RequestTest::testInnerLink() { bool v = req.setUrl("http://aria.rednoah.com/index.html#download"); CPPUNIT_ASSERT(v); CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile()); + CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery()); } void RequestTest::testSetUrl_zeroUsername()