]> git.saurik.com Git - apt.git/blobdiff - methods/http.cc
HTTP pipelining
[apt.git] / methods / http.cc
index 4c773b064a1af8f8bee835fe70b80da7d16ee13f..c52ddc458b201482d5e6fe3ad2a10a8815216117 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: http.cc,v 1.3 1998/11/04 07:10:49 jgg Exp $
+// $Id: http.cc,v 1.9 1998/12/05 04:19:05 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the HTTP aquire method for APT.
@@ -267,18 +267,23 @@ bool ServerState::Open()
    Out.Reset();
 
    // Determine the proxy setting
-   string DefProxy = _config->Find("Acquire::http::Proxy",getenv("http_proxy"));
-   string SpecificProxy = _config->Find("Acquire::http::Proxy::" + ServerName.Host);
-   if (SpecificProxy.empty() == false)
+   if (getenv("http_proxy") == 0)
    {
-      if (SpecificProxy == "DIRECT")
-        Proxy = "";
+      string DefProxy = _config->Find("Acquire::http::Proxy");
+      string SpecificProxy = _config->Find("Acquire::http::Proxy::" + ServerName.Host);
+      if (SpecificProxy.empty() == false)
+      {
+        if (SpecificProxy == "DIRECT")
+           Proxy = "";
+        else
+           Proxy = SpecificProxy;
+      }   
       else
-        Proxy = SpecificProxy;
-   }   
+        Proxy = DefProxy;
+   }
    else
-      Proxy = DefProxy;
-
+      Proxy = getenv("http_proxy");
+   
    // Determine what host and port to use based on the proxy settings
    int Port = 80;
    string Host;   
@@ -613,7 +618,7 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
       Req += string("Proxy-Authorization: Basic ") + Base64Encode(ProxyAuth) + "\r\n";*/
 
    Req += "User-Agent: Debian APT-HTTP/1.2\r\n\r\n";
-//   cout << Req << endl;
+//   cerr << Req << endl;
    
    Out.Read(Req);
 }
@@ -789,7 +794,8 @@ bool HttpMethod::ServerDie(ServerState *Srv)
      0 - File is open,
      1 - IMS hit
      3 - Unrecoverable error 
-     4 - Error with error content page */
+     4 - Error with error content page
+     5 - Unrecoverable non-server error (close the connection) */
 int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
 {
    // Not Modified
@@ -819,7 +825,7 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
    delete File;
    File = new FileFd(Queue->DestFile,FileFd::WriteAny);
    if (_error->PendingError() == true)
-      return 3;
+      return 5;
 
    FailFile = Queue->DestFile;
    FailFd = File->Fd();
@@ -845,7 +851,7 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
       if (Srv->In.MD5->AddFD(File->Fd(),Srv->StartPos) == false)
       {
         _error->Errno("read","Problem hashing file");
-        return 3;
+        return 5;
       }
       lseek(File->Fd(),0,SEEK_END);
    }
@@ -874,6 +880,38 @@ void HttpMethod::SigTerm(int)
    exit(100);
 }
                                                                        /*}}}*/
+// HttpMethod::Fetch - Fetch an item                                   /*{{{*/
+// ---------------------------------------------------------------------
+/* This adds an item to the pipeline. We keep the pipeline at a fixed
+   depth. */
+bool HttpMethod::Fetch(FetchItem *)
+{
+   if (Server == 0)
+      return true;
+   
+   // Queue the requests
+   int Depth = -1;
+   bool Tail = false;
+   for (FetchItem *I = Queue; I != 0 && Depth < 5; I = I->Next, Depth++)
+   {
+      // Make sure we stick with the same server
+      if (Server->Comp(I->Uri) == false)
+        break;
+      
+      if (QueueBack == I)
+        Tail = true;
+      if (Tail == true)
+      {
+        Depth++;
+        QueueBack = I->Next;
+        SendReq(I,Server->Out);
+        continue;
+      }         
+   }
+   
+   return true;
+};
+                                                                       /*}}}*/
 // HttpMethod::Loop - Main loop                                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -882,7 +920,7 @@ int HttpMethod::Loop()
    signal(SIGTERM,SigTerm);
    signal(SIGINT,SigTerm);
    
-   ServerState *Server = 0;
+   Server = 0;
    
    int FailCounter = 0;
    while (1)
@@ -920,10 +958,10 @@ int HttpMethod::Loop()
         Fail();
         continue;
       }
-      
-      // Queue the request
-      SendReq(Queue,Server->Out);
 
+      // Fill the pipeline.
+      Fetch(0);
+      
       // Fetch the next URL header data from the server.
       switch (Server->RunHeaders())
       {
@@ -948,9 +986,10 @@ int HttpMethod::Loop()
            continue;
         }
       };
-      
+
       // Decide what to do.
       FetchResult Res;
+      Res.Filename = Queue->DestFile;
       switch (DealWithHeaders(Res,Server))
       {
         // Ok, the file is Open
@@ -998,6 +1037,14 @@ int HttpMethod::Loop()
            Fail();
            break;
         }
+         
+        // Hard internal error, kill the connection and fail
+        case 5:
+        {
+           Fail();
+           Server->Close();
+           break;
+        }
 
         // We need to flush the data, the header is like a 404 w/ error text
         case 4: