]> git.saurik.com Git - apt.git/commitdiff
Http method
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:51:18 +0000 (16:51 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:51:18 +0000 (16:51 +0000)
Author: jgg
Date: 1998-11-04 07:10:49 GMT
Http method

apt-pkg/contrib/configuration.h
apt-pkg/contrib/strutl.cc
apt-pkg/contrib/strutl.h
methods/http.cc
methods/http.h

index cf5a90f5741c6f5c5056ded56b619263687ec0fd..c5c32ef2f7325bd497463f0e46a8612dfae543d3 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: configuration.h,v 1.7 1998/10/30 07:53:44 jgg Exp $
+// $Id: configuration.h,v 1.8 1998/11/04 07:11:12 jgg Exp $
 /* ######################################################################
 
    Configuration Class
@@ -52,6 +52,7 @@ class Configuration
    public:
 
    string Find(const char *Name,const char *Default = 0);
+   string Find(string Name,const char *Default = 0) {return Find(Name.c_str(),Default);};
    string FindFile(const char *Name,const char *Default = 0);
    string FindDir(const char *Name,const char *Default = 0);
    int FindI(const char *Name,int Default = 0);
index 5efa6f60bdf26202cc470e436849c8d3caa14947..c99f88c3fc930e33dab905024f6125920cb857ae 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: strutl.cc,v 1.11 1998/11/01 08:07:12 jgg Exp $
+// $Id: strutl.cc,v 1.12 1998/11/04 07:11:13 jgg Exp $
 /* ######################################################################
 
    String Util - Some usefull string functions.
    ##################################################################### */
                                                                        /*}}}*/
 // Includes                                                            /*{{{*/
+#ifdef __GNUG__
+#pragma implementation "strutl.h"
+#endif
+
 #include <strutl.h>
 #include <apt-pkg/fileutl.h>
 
 #include <ctype.h>
 #include <string.h>
 #include <stdio.h>
-#include <time.h>
                                                                        /*}}}*/
 
 // strstrip - Remove white space from the front and back of a string   /*{{{*/
@@ -695,6 +698,7 @@ URI::operator string()
    string Res = Access + ':';
    if (Host.empty() == false)
    {
+      Res += "//";
       if (User.empty() == false)
       {
         Res += "//" + User;
@@ -703,10 +707,21 @@ URI::operator string()
         Res += "@";
       }
       Res += Host;
+      if (Port != 0)
+      {
+        char S[30];
+        sprintf(S,":%u",Port);
+        Res += S;
+      }         
    }
    
    if (Path.empty() == false)
-      Res += "/" + Path;
+   {
+      if (Path[0] != '/')
+        Res += "/" + Path;
+      else
+        Res += Path;
+   }
    
    return Res;
 }
index f93184a24c35748c294b4dcd46593f09fc53ce38..10d835ba3c62ea30f8345905f117db72023e1cd9 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: strutl.h,v 1.9 1998/11/01 05:27:38 jgg Exp $
+// $Id: strutl.h,v 1.10 1998/11/04 07:11:14 jgg Exp $
 /* ######################################################################
 
    String Util - These are some usefull string functions
 #ifndef STRUTL_H
 #define STRUTL_H
 
+#ifdef __GNUG__
+#pragma interface "strutl.h"
+#endif 
+
 #include <stdlib.h>
 #include <string>
 #include <vector>
+#include <time.h>
 
 char *_strstrip(char *String);
 char *_strtabexpand(char *String,size_t Len);
@@ -56,7 +61,7 @@ class URI
    string Path;
    unsigned int Port;
    
-   inline operator string();
+   operator string();
    inline operator =(string From) {CopyFrom(From);};
    inline bool empty() {return Access.empty();};
    
index d9ac7991231d0f6f78d80597c4f0b281db1fb4d2..4c773b064a1af8f8bee835fe70b80da7d16ee13f 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: http.cc,v 1.2 1998/11/01 08:07:13 jgg Exp $
+// $Id: http.cc,v 1.3 1998/11/04 07:10:49 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the HTTP aquire method for APT.
@@ -36,6 +36,7 @@
 #include <sys/time.h>
 #include <utime.h>
 #include <unistd.h>
+#include <signal.h>
 #include <stdio.h>
 
 // Internet stuff
 #include "http.h"
                                                                        /*}}}*/
 
+string HttpMethod::FailFile;
+int HttpMethod::FailFd = -1;
+time_t HttpMethod::FailTime = 0;
+
 // CircleBuf::CircleBuf - Circular input buffer                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -258,10 +263,25 @@ bool ServerState::Open()
       return true;
    
    Close();
-   
+   In.Reset();
+   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 (SpecificProxy == "DIRECT")
+        Proxy = "";
+      else
+        Proxy = SpecificProxy;
+   }   
+   else
+      Proxy = DefProxy;
+
+   // Determine what host and port to use based on the proxy settings
    int Port = 80;
-   string Host;
-   
+   string Host;   
    if (Proxy.empty() == true)
    {
       if (ServerName.Port != 0)
@@ -275,6 +295,9 @@ bool ServerState::Open()
       Host = Proxy.Host;
    }
    
+   /* We used a cached address record.. Yes this is against the spec but
+      the way we have setup our rotating dns suggests that this is more
+      sensible */
    if (LastHost != Host)
    {
       Owner->Status("Connecting to %s",Host.c_str());
@@ -312,8 +335,6 @@ bool ServerState::Close()
 {
    close(ServerFd);
    ServerFd = -1;
-   In.Reset();
-   Out.Reset();
    return true;
 }
                                                                        /*}}}*/
@@ -556,7 +577,12 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
       ProperHost += Buf;
    }   
       
-   // Build the request
+   /* Build the request. We include a keep-alive header only for non-proxy
+      requests. This is to tweak old http/1.0 servers that do support keep-alive
+      but not HTTP/1.1 automatic keep-alive. Doing this with a proxy server 
+      will glitch HTTP/1.0 proxies because they do not filter it out and 
+      pass it on, HTTP/1.1 says the connection should default to keep alive
+      and we expect the proxy to do this */
    if (Proxy.empty() == true)
       sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n",
              Uri.Path.c_str(),ProperHost.c_str());
@@ -564,7 +590,7 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
       sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n",
              Itm->Uri.c_str(),ProperHost.c_str());
    string Req = Buf;
-   
+
    // Check for a partial file
    struct stat SBuf;
    if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
@@ -794,7 +820,11 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
    File = new FileFd(Queue->DestFile,FileFd::WriteAny);
    if (_error->PendingError() == true)
       return 3;
-   
+
+   FailFile = Queue->DestFile;
+   FailFd = File->Fd();
+   FailTime = Srv->Date;
+      
    // Set the expected size
    if (Srv->StartPos >= 0)
    {
@@ -824,11 +854,34 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
    return 0;
 }
                                                                        /*}}}*/
-// HttpMethod::Loop                                                    /*{{{*/
+// HttpMethod::SigTerm - Handle a fatal signal                         /*{{{*/
+// ---------------------------------------------------------------------
+/* This closes and timestamps the open file. This is neccessary to get 
+   resume behavoir on user abort */
+void HttpMethod::SigTerm(int)
+{
+   if (FailFd == -1)
+      exit(100);
+   close(FailFd);
+   
+   // Timestamp
+   struct utimbuf UBuf;
+   time(&UBuf.actime);
+   UBuf.actime = FailTime;
+   UBuf.modtime = FailTime;
+   utime(FailFile.c_str(),&UBuf);
+   
+   exit(100);
+}
+                                                                       /*}}}*/
+// HttpMethod::Loop - Main loop                                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 int HttpMethod::Loop()
 {
+   signal(SIGTERM,SigTerm);
+   signal(SIGINT,SigTerm);
+   
    ServerState *Server = 0;
    
    int FailCounter = 0;
@@ -906,16 +959,29 @@ int HttpMethod::Loop()
            URIStart(Res);
 
            // Run the data
-           if (Server->RunData() == false)
-              Fail();
-           else
+           bool Result =  Server->RunData();
+
+           // Close the file, destroy the FD object and timestamp it
+           FailFd = -1;
+           delete File;
+           File = 0;
+           
+           // Timestamp
+           struct utimbuf UBuf;
+           time(&UBuf.actime);
+           UBuf.actime = Server->Date;
+           UBuf.modtime = Server->Date;
+           utime(Queue->DestFile.c_str(),&UBuf);
+
+           // Send status to APT
+           if (Result == true)
            {
               Res.MD5Sum = Server->In.MD5->Result();
               URIDone(Res);
            }
-           
-           delete File;
-           File = 0;
+           else
+              Fail();
+
            break;
         }
         
index 962fb00273789ca8798caa3aa4ec6f7bb6dd5c53..62f329ef55a8ae69c20db3b3d6ba3efde7df6d64 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: http.h,v 1.2 1998/11/01 08:07:14 jgg Exp $
+// $Id: http.h,v 1.3 1998/11/04 07:10:50 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the HTTP aquire method for APT.
@@ -119,6 +119,12 @@ class HttpMethod : public pkgAcqMethod
    bool ServerDie(ServerState *Srv);
    int DealWithHeaders(FetchResult &Res,ServerState *Srv);
    
+   // In the event of a fatal signal this file will be closed and timestamped.
+   static string FailFile;
+   static int FailFd;
+   static time_t FailTime;
+   static void SigTerm(int);
+   
    public:
    friend ServerState;