Pārlūkot izejas kodu

Use index.html as filename for conditional-get when file is missing in URI

Previously we disabled conditional-get if file part is missing in URI.
But we use constant string "index.html" in this case, so we can do the
same to determine the modification time.  In this patch, if we have
file part in URI, we are not going to set absolute file path in
FileEntry, since it prevents content-disposition from working.
Tatsuhiro Tsujikawa 11 gadi atpakaļ
vecāks
revīzija
f60e55cece
4 mainītis faili ar 29 papildinājumiem un 19 dzēšanām
  1. 24 18
      src/HttpRequestCommand.cc
  2. 1 1
      src/HttpResponse.cc
  3. 2 0
      src/Request.cc
  4. 2 0
      src/Request.h

+ 24 - 18
src/HttpRequestCommand.cc

@@ -145,25 +145,31 @@ bool HttpRequestCommand::executeInternal() {
       if(getOption()->getAsBool(PREF_CONDITIONAL_GET) &&
          (getRequest()->getProtocol() == "http" ||
           getRequest()->getProtocol() == "https")) {
-        if(getFileEntry()->getPath().empty() &&
-           getRequest()->getFile().empty()) {
-          A2_LOG_DEBUG("Conditional-Get is disabled because file name"
-                       " is not available.");
+
+        std::string path;
+
+        if(getFileEntry()->getPath().empty()) {
+          auto& file = getRequest()->getFile();
+
+          // If filename part of URI is empty, we just use
+          // Request::DEFAULT_FILE, since it is the name we use to
+          // store file in disk.
+
+          path = util::createSafePath
+            (getOption()->get(PREF_DIR),
+             (getRequest()->getFile().empty() ?
+              Request::DEFAULT_FILE :
+              util::percentDecode(std::begin(file), std::end(file))));
         } else {
-          if(getFileEntry()->getPath().empty()) {
-            getFileEntry()->setPath
-              (util::createSafePath
-               (getOption()->get(PREF_DIR),
-                util::percentDecode(getRequest()->getFile().begin(),
-                                    getRequest()->getFile().end())));
-          }
-          File ctrlfile(getFileEntry()->getPath()+
-                        DefaultBtProgressInfoFile::getSuffix());
-          File file(getFileEntry()->getPath());
-          if(!ctrlfile.exists() && file.exists()) {
-            httpRequest->setIfModifiedSinceHeader
-              (file.getModifiedTime().toHTTPDate());
-          }
+          path = getFileEntry()->getPath();
+        }
+
+        File ctrlfile(path + DefaultBtProgressInfoFile::getSuffix());
+        File file(path);
+
+        if(!ctrlfile.exists() && file.exists()) {
+          httpRequest->setIfModifiedSinceHeader
+            (file.getModifiedTime().toHTTPDate());
         }
       }
       httpConnection_->sendRequest(std::move(httpRequest));

+ 1 - 1
src/HttpResponse.cc

@@ -124,7 +124,7 @@ std::string HttpResponse::determineFilename() const
     auto file = httpRequest_->getFile();
     file = util::percentDecode(file.begin(), file.end());
     if (file.empty()) {
-      return "index.html";
+      return Request::DEFAULT_FILE;
     }
     return file;
   }

+ 2 - 0
src/Request.cc

@@ -50,6 +50,8 @@ const std::string Request::METHOD_GET = "GET";
 
 const std::string Request::METHOD_HEAD = "HEAD";
 
+const std::string Request::DEFAULT_FILE = "index.html";
+
 Request::Request():
   method_(METHOD_GET),
   tryCount_(0),

+ 2 - 0
src/Request.h

@@ -220,6 +220,8 @@ public:
   static const std::string METHOD_HEAD;
 
   static const int MAX_REDIRECT = 20;
+
+  static const std::string DEFAULT_FILE;
 };
 
 } // namespace aria2