Explorar el Código

Use request URI as referer if --referer="*" is given

Tatsuhiro Tsujikawa hace 12 años
padre
commit
87af7c32c6
Se han modificado 3 ficheros con 24 adiciones y 2 borrados
  1. 6 1
      src/FileEntry.cc
  2. 3 1
      src/usage_text.h
  3. 15 0
      test/FileEntryTest.cc

+ 6 - 1
src/FileEntry.cc

@@ -170,7 +170,12 @@ FileEntry::getRequest
             req.reset();
             continue;
           }
-          req->setReferer(util::percentEncodeMini(referer));
+          if(referer == "*") {
+            // Assuming uri has already been percent-encoded.
+            req->setReferer(uri);
+          } else {
+            req->setReferer(util::percentEncodeMini(referer));
+          }
           req->setMethod(method);
           spentUris_.push_back(uri);
           inFlightRequests_.insert(req);

+ 3 - 1
src/usage_text.h

@@ -94,7 +94,9 @@
 #define TEXT_PROXY_METHOD                                               \
   _(" --proxy-method=METHOD        Set the method to use in proxy request.")
 #define TEXT_REFERER                                                    \
-  _(" --referer=REFERER            Set Referer. This affects all URLs.")
+  _(" --referer=REFERER            Set Referer. This affects all URLs. If \"*\" is\n" \
+    "                              given, each request URI is used as a referer.\n" \
+    "                              This may be useful when used with -P option.")
 #define TEXT_FTP_USER                                                   \
   _(" --ftp-user=USER              Set FTP user. This affects all URLs.")
 #define TEXT_FTP_PASSWD                                                 \

+ 15 - 0
test/FileEntryTest.cc

@@ -15,6 +15,7 @@ class FileEntryTest : public CppUnit::TestFixture {
   CPPUNIT_TEST(testGetRequest);
   CPPUNIT_TEST(testGetRequest_withoutUriReuse);
   CPPUNIT_TEST(testGetRequest_withUniqueProtocol);
+  CPPUNIT_TEST(testGetRequest_withReferer);
   CPPUNIT_TEST(testReuseUri);
   CPPUNIT_TEST(testAddUri);
   CPPUNIT_TEST(testAddUris);
@@ -30,6 +31,7 @@ public:
   void testGetRequest();
   void testGetRequest_withoutUriReuse();
   void testGetRequest_withUniqueProtocol();
+  void testGetRequest_withReferer();
   void testReuseUri();
   void testAddUri();
   void testAddUris();
@@ -184,6 +186,19 @@ void FileEntryTest::testGetRequest_withUniqueProtocol()
                        fileEntry->getRemainingUris()[1]);
 }
 
+void FileEntryTest::testGetRequest_withReferer()
+{
+  SharedHandle<FileEntry> fileEntry = createFileEntry();
+  SharedHandle<InorderURISelector> selector(new InorderURISelector());
+  std::vector<std::pair<size_t, std::string> > usedHosts;
+  SharedHandle<Request> req =
+    fileEntry->getRequest(selector, true, usedHosts, "http://referer");
+  CPPUNIT_ASSERT_EQUAL(std::string("http://referer"), req->getReferer());
+  // URI is used as referer if "*" is given.
+  req = fileEntry->getRequest(selector, true, usedHosts, "*");
+  CPPUNIT_ASSERT_EQUAL(req->getUri(), req->getReferer());
+}
+
 void FileEntryTest::testReuseUri()
 {
   SharedHandle<InorderURISelector> selector(new InorderURISelector());