[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#437150: doesn't reset curl options between files or timestamp downloaded files



Package: apt-transport-https
Version: 0.7.6
Severity: normal

The following patch address two problems in the apt https method:

1. the curl options aren't reset between files, causing the previous files
settings to be used for the next, which can be a problem if the setting was
a lastmodified or range request.
2. Downloaded files aren't set to the time of the remote server (if available).
This breaks 304 support compared to the http method, as the files always have
the last downloaded time, rather than the last time from the web server.

This patch is against bzr revno 1517 of methods/https.cc

--- /home/rmurray/aptbzr/methods/https.cc	2007-08-09 20:32:36.707623733 -0700
+++ /home/rmurray/https.cc	2007-08-10 10:51:54.015466148 -0700
@@ -115,6 +115,7 @@
    //       - error checking/reporting
    //       - more debug options? (CURLOPT_DEBUGFUNCTION?)
 
+   curl_easy_reset(curl);
    SetupProxy();
 
    // callbacks
@@ -125,6 +126,7 @@
    curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, this);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
    curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
+   curl_easy_setopt(curl, CURLOPT_FILETIME, true);
 
    // FIXME: https: offer various options of verification
    bool peer_verify = _config->FindB("Acquire::https::Verify-Peer", false);
@@ -202,6 +204,9 @@
    CURLcode success = curl_easy_perform(curl);
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &curl_responsecode);
 
+   long curl_servdate;
+   curl_easy_getinfo(curl, CURLINFO_FILETIME, &curl_servdate);
+
    // cleanup
    if(success != 0) 
    {
@@ -215,6 +220,14 @@
    if (Res.Size == 0)
       Res.Size = File->Size();
 
+   // Timestamp
+   struct utimbuf UBuf;
+   if (curl_servdate != -1) {
+       UBuf.actime = curl_servdate;
+       UBuf.modtime = curl_servdate;
+       utime(File->Name().c_str(),&UBuf);
+   }
+
    // check the downloaded result
    struct stat Buf;
    if (stat(File->Name().c_str(),&Buf) == 0)

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (x86_64)

Kernel: Linux 2.6.20.15 (SMP w/4 CPU cores; PREEMPT)
Locale: LANG=en_CA, LC_CTYPE=en_CA (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages apt-transport-https depends on:
ii  apt [libapt-pkg-libc6.6-6-4.4 0.7.6      Advanced front-end for dpkg
ii  libc6                         2.6.1-1    GNU C Library: Shared libraries
ii  libcurl3-gnutls               7.16.4-2   Multi-protocol file transfer libra
ii  libgcc1                       1:4.2.1-2  GCC support library
ii  libstdc++6                    4.2.1-2    The GNU Standard C++ Library v3

apt-transport-https recommends no packages.

-- no debconf information



Reply to: