From a9c3209a9bd488e9c211ba390bcbed37120b33d4 Mon Sep 17 00:00:00 2001
From: mtortonesi <devnull@localhost>
Date: Thu, 17 Aug 2006 03:49:29 -0700
Subject: [PATCH] [svn] Fix broken -c in new HTTP code.

---
 src/ChangeLog |  6 ++++++
 src/http.c    | 19 ++++++++++++++++---
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index c43619b3..9a5ffee3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2006-08-16  Mauro Tortonesi  <mauro@ferrara.linux.it>
+
+	* http.c: Fixed bug which broke --continue feature. Now if -c is
+	given, http_loop sends a HEAD request to find out the destination
+	filename before resuming download.
+
 2006-08-08  Hrvoje Niksic  <hniksic@xemacs.org>
 
 	* utils.c (datetime_str): Avoid code repetition with time_str.
diff --git a/src/http.c b/src/http.c
index 77f97972..63bcca63 100644
--- a/src/http.c
+++ b/src/http.c
@@ -1762,7 +1762,7 @@ File `%s' already there; not retrieving.\n\n"), hs->local_file);
 
           return RETROK;
         }
-      else
+      else if (!ALLOW_CLOBBER)
         {
           char *unique = unique_name (hs->local_file, true);
           if (unique != hs->local_file)
@@ -2231,6 +2231,7 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
 {
   int count;
   bool got_head = false;         /* used for time-stamping */
+  bool got_name = false;
   char *tms;
   const char *tmrate;
   uerr_t err, ret = TRYLIMEXC;
@@ -2264,7 +2265,10 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
   hstat.referer = referer;
 
   if (opt.output_document)
-    hstat.local_file = xstrdup (opt.output_document);
+    {
+      hstat.local_file = xstrdup (opt.output_document);
+      got_name = true;
+    }
 
   /* Reset the counter. */
   count = 0;
@@ -2309,13 +2313,16 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
       /* Default document type is empty.  However, if spider mode is
          on or time-stamping is employed, HEAD_ONLY commands is
          encoded within *dt.  */
-      if ((opt.spider && !opt.recursive) || (opt.timestamping && !got_head))
+      if ((opt.spider && !opt.recursive) 
+          || (opt.timestamping && !got_head)
+          || (opt.always_rest && !got_name))
         *dt |= HEAD_ONLY;
       else
         *dt &= ~HEAD_ONLY;
 
       /* Decide whether or not to restart.  */
       if (opt.always_rest
+          && got_name
           && stat (hstat.local_file, &st) == 0
           && S_ISREG (st.st_mode))
         /* When -c is used, continue from on-disk size.  (Can't use
@@ -2484,6 +2491,12 @@ The sizes do not match (local %s) -- retrieving.\n"),
           continue;
         }
       
+      if (opt.always_rest && !got_name)
+        {
+          got_name = true;
+          continue;
+        }
+          
       if ((tmr != (time_t) (-1))
           && (!opt.spider || opt.recursive)
           && ((hstat.len == hstat.contlen) ||