]> git.saurik.com Git - apt.git/blobdiff - methods/server.cc
Implement CacheDB for source packages in apt-ftparchive
[apt.git] / methods / server.cc
index e12c23c0759b98156c92b2d01b16c11bf150caef..5a13f18a7b7a527db033c3e286870e9e4e99eec6 100644 (file)
 // Include Files                                                       /*{{{*/
 #include <config.h>
 
 // Include Files                                                       /*{{{*/
 #include <config.h>
 
-#include <apt-pkg/fileutl.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
-#include <apt-pkg/hashes.h>
-#include <apt-pkg/netrc.h>
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/strutl.h>
 
 
-#include <fcntl.h>
+#include <ctype.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <sys/time.h>
+#include <time.h>
 #include <unistd.h>
 #include <unistd.h>
-#include <signal.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <climits>
 #include <iostream>
 #include <iostream>
+#include <limits>
 #include <map>
 #include <map>
+#include <string>
+#include <vector>
 
 
-// Internet stuff
-#include <netdb.h>
-
-#include "config.h"
-#include "connect.h"
-#include "rfc2553emu.h"
-#include "http.h"
+#include "server.h"
 
 #include <apti18n.h>
                                                                        /*}}}*/
 
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -86,7 +81,7 @@ ServerState::RunHeadersResult ServerState::RunHeaders(FileFd * const File)
       if (Result == 100)
         continue;
       
       if (Result == 100)
         continue;
       
-      // Tidy up the connection persistance state.
+      // Tidy up the connection persistence state.
       if (Encoding == Closes && HaveContent == true)
         Persistent = false;
       
       if (Encoding == Closes && HaveContent == true)
         Persistent = false;
       
@@ -119,10 +114,10 @@ bool ServerState::HeaderLine(string Line)
    string::size_type Pos2 = Pos;
    while (Pos2 < Line.length() && isspace(Line[Pos2]) != 0)
       Pos2++;
    string::size_type Pos2 = Pos;
    while (Pos2 < Line.length() && isspace(Line[Pos2]) != 0)
       Pos2++;
-      
+
    string Tag = string(Line,0,Pos);
    string Val = string(Line,Pos2);
    string Tag = string(Line,0,Pos);
    string Val = string(Line,Pos2);
-   
+
    if (stringcasecmp(Tag.c_str(),Tag.c_str()+4,"HTTP") == 0)
    {
       // Evil servers return no version
    if (stringcasecmp(Tag.c_str(),Tag.c_str()+4,"HTTP") == 0)
    {
       // Evil servers return no version
@@ -146,7 +141,7 @@ bool ServerState::HeaderLine(string Line)
            return _error->Error(_("The HTTP server sent an invalid reply header"));
       }
 
            return _error->Error(_("The HTTP server sent an invalid reply header"));
       }
 
-      /* Check the HTTP response header to get the default persistance
+      /* Check the HTTP response header to get the default persistence
          state. */
       if (Major < 1)
         Persistent = false;
          state. */
       if (Major < 1)
         Persistent = false;
@@ -159,14 +154,14 @@ bool ServerState::HeaderLine(string Line)
       }
 
       return true;
       }
 
       return true;
-   }      
-      
+   }
+
    if (stringcasecmp(Tag,"Content-Length:") == 0)
    {
       if (Encoding == Closes)
         Encoding = Stream;
       HaveContent = true;
    if (stringcasecmp(Tag,"Content-Length:") == 0)
    {
       if (Encoding == Closes)
         Encoding = Stream;
       HaveContent = true;
-      
+
       // The length is already set from the Content-Range header
       if (StartPos != 0)
         return true;
       // The length is already set from the Content-Range header
       if (StartPos != 0)
         return true;
@@ -184,7 +179,7 @@ bool ServerState::HeaderLine(string Line)
       HaveContent = true;
       return true;
    }
       HaveContent = true;
       return true;
    }
-   
+
    if (stringcasecmp(Tag,"Content-Range:") == 0)
    {
       HaveContent = true;
    if (stringcasecmp(Tag,"Content-Range:") == 0)
    {
       HaveContent = true;
@@ -201,12 +196,12 @@ bool ServerState::HeaderLine(string Line)
         return _error->Error(_("This HTTP server has broken range support"));
       return true;
    }
         return _error->Error(_("This HTTP server has broken range support"));
       return true;
    }
-   
+
    if (stringcasecmp(Tag,"Transfer-Encoding:") == 0)
    {
       HaveContent = true;
       if (stringcasecmp(Val,"chunked") == 0)
    if (stringcasecmp(Tag,"Transfer-Encoding:") == 0)
    {
       HaveContent = true;
       if (stringcasecmp(Val,"chunked") == 0)
-        Encoding = Chunked;      
+        Encoding = Chunked;
       return true;
    }
 
       return true;
    }
 
@@ -218,7 +213,7 @@ bool ServerState::HeaderLine(string Line)
         Persistent = true;
       return true;
    }
         Persistent = true;
       return true;
    }
-   
+
    if (stringcasecmp(Tag,"Last-Modified:") == 0)
    {
       if (RFC1123StrToTime(Val.c_str(), Date) == false)
    if (stringcasecmp(Tag,"Last-Modified:") == 0)
    {
       if (RFC1123StrToTime(Val.c_str(), Date) == false)
@@ -291,11 +286,15 @@ ServerMethod::DealWithHeaders(FetchResult &Res)
       }
       else
       {
       }
       else
       {
-         NextURI = DeQuoteString(Server->Location);
-         URI tmpURI = NextURI;
-         // Do not allow a redirection to switch protocol
-         if (tmpURI.Access == "http")
-            return TRY_AGAIN_OR_REDIRECT;
+        NextURI = DeQuoteString(Server->Location);
+        URI tmpURI = NextURI;
+        URI Uri = Queue->Uri;
+        // same protocol redirects are okay
+        if (tmpURI.Access == Uri.Access)
+           return TRY_AGAIN_OR_REDIRECT;
+        // as well as http to https
+        else if (Uri.Access == "http" && tmpURI.Access == "https")
+           return TRY_AGAIN_OR_REDIRECT;
       }
       /* else pass through for error message */
    }
       }
       /* else pass through for error message */
    }
@@ -362,18 +361,18 @@ ServerMethod::DealWithHeaders(FetchResult &Res)
                                                                        /*}}}*/
 // ServerMethod::SigTerm - Handle a fatal signal                       /*{{{*/
 // ---------------------------------------------------------------------
                                                                        /*}}}*/
 // ServerMethod::SigTerm - Handle a fatal signal                       /*{{{*/
 // ---------------------------------------------------------------------
-/* This closes and timestamps the open file. This is neccessary to get
+/* This closes and timestamps the open file. This is necessary to get
    resume behavoir on user abort */
 void ServerMethod::SigTerm(int)
 {
    if (FailFd == -1)
       _exit(100);
 
    resume behavoir on user abort */
 void ServerMethod::SigTerm(int)
 {
    if (FailFd == -1)
       _exit(100);
 
-   struct timespec times[2];
+   struct timeval times[2];
    times[0].tv_sec = FailTime;
    times[1].tv_sec = FailTime;
    times[0].tv_sec = FailTime;
    times[1].tv_sec = FailTime;
-   times[0].tv_nsec = times[1].tv_nsec = 0;
-   futimens(FailFd, times);
+   times[0].tv_usec = times[1].tv_usec = 0;
+   utimes(FailFile.c_str(), times);
    close(FailFd);
 
    _exit(100);
    close(FailFd);
 
    _exit(100);
@@ -409,7 +408,7 @@ bool ServerMethod::Fetch(FetchItem *)
    }
    
    return true;
    }
    
    return true;
-};
+}
                                                                        /*}}}*/
 // ServerMethod::Loop - Main loop                                      /*{{{*/
 int ServerMethod::Loop()
                                                                        /*}}}*/
 // ServerMethod::Loop - Main loop                                      /*{{{*/
 int ServerMethod::Loop()
@@ -539,10 +538,10 @@ int ServerMethod::Loop()
            File = 0;
            
            // Timestamp
            File = 0;
            
            // Timestamp
-           struct timespec times[2];
+           struct timeval times[2];
            times[0].tv_sec = times[1].tv_sec = Server->Date;
            times[0].tv_sec = times[1].tv_sec = Server->Date;
-           times[0].tv_nsec = times[1].tv_nsec = 0;
-           utimensat(AT_FDCWD, Queue->DestFile.c_str(), times, AT_SYMLINK_NOFOLLOW);
+           times[0].tv_usec = times[1].tv_usec = 0;
+           utimes(Queue->DestFile.c_str(), times);
 
            // Send status to APT
            if (Result == true)
 
            // Send status to APT
            if (Result == true)