]> git.saurik.com Git - apt.git/blobdiff - methods/server.cc
Merge commit 'e2073b0276226b625897ef475f225bf8f508719e' as 'triehash'
[apt.git] / methods / server.cc
index d0b6ef3d7c5d4141f05285f9885592f67897d14e..0408dddfd3f8dfbb8ef395f1b3d8935e8cac712e 100644 (file)
@@ -208,8 +208,16 @@ bool ServerState::HeaderLine(string Line)
    if (stringcasecmp(Tag,"Connection:") == 0)
    {
       if (stringcasecmp(Val,"close") == 0)
+      {
         Persistent = false;
-      if (stringcasecmp(Val,"keep-alive") == 0)
+        Pipeline = false;
+        /* Some servers send error pages (as they are dynamically generated)
+           for simplicity via a connection close instead of e.g. chunked,
+           so assuming an always closing server only if we get a file + close */
+        if (Result >= 200 && Result < 300)
+           PipelineAllowed = false;
+      }
+      else if (stringcasecmp(Val,"keep-alive") == 0)
         Persistent = true;
       return true;
    }
@@ -227,6 +235,15 @@ bool ServerState::HeaderLine(string Line)
       return true;
    }
 
+   if (stringcasecmp(Tag, "Accept-Ranges:") == 0)
+   {
+      std::string ranges = ',' + Val + ',';
+      ranges.erase(std::remove(ranges.begin(), ranges.end(), ' '), ranges.end());
+      if (ranges.find(",bytes,") == std::string::npos)
+        RangesAllowed = false;
+      return true;
+   }
+
    return true;
 }
                                                                        /*}}}*/
@@ -252,6 +269,7 @@ void ServerState::Reset(bool const Everything)                              /*{{{*/
    if (Everything)
    {
       Persistent = false; Pipeline = false; PipelineAllowed = true;
+      RangesAllowed = true;
    }
 }
                                                                        /*}}}*/
@@ -752,8 +770,8 @@ int ServerMethod::Loop()
         // We need to flush the data, the header is like a 404 w/ error text
         case ERROR_WITH_CONTENT_PAGE:
         {
-           Fail();
            Server->RunDataToDevNull();
+           Fail();
            break;
         }