Browse Source

2008-04-27 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	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
Tatsuhiro Tsujikawa 17 years ago
parent
commit
4663902500
7 changed files with 72 additions and 9 deletions
  1. 13 0
      ChangeLog
  2. 6 1
      src/HttpRequest.cc
  3. 2 0
      src/HttpRequest.h
  4. 4 2
      src/Request.cc
  5. 3 0
      src/Request.h
  6. 22 0
      test/HttpRequestTest.cc
  7. 22 6
      test/RequestTest.cc

+ 13 - 0
ChangeLog

@@ -1,3 +1,16 @@
+2008-04-27  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	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  <tujikawa at rednoah dot com>
 
 	Rewritten Exception class. Throw exception object, not its pointer and

+ 6 - 1
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

+ 2 - 0
src/HttpRequest.h

@@ -108,6 +108,8 @@ public:
 
   std::string getFile() const;
 
+  std::string getQuery() const;
+
   std::string getPreviousURI() const;
 
   SharedHandle<Range> getRange() const;

+ 4 - 2
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;
 }
 

+ 3 - 0
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)
   {

+ 22 - 0
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> 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> request(new Request());

+ 22 - 6
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()