On Thu, Sep 16, 2010 at 4:55 PM, Giuseppe Scrivano <[email protected]> wrote:
> Hi Cheng,
>
> the development version is hosted on the bazaar repository.
>
> If you have problems accessing the bazaar repository then you can try
> with this alpha version, rebasing your patch on it:
>
>  ftp://alpha.gnu.org/gnu/wget/wget-1.12-2416.tar.bz2

This attached "wget-content-disposition-filename-recursive.patch
(text/x-patch) 8K" is rebased on above wget-1.12-2416 snapshot;

>
>
> Anyway, the bazaar repository must be accessible everywhere, I am going
> to report your problem to the savannah hackers.

I mean, it should be because of bazaar bad design on over http protocol;

On many places (Singapore and China), on multiple machines/platforms
(linux and windows), even I tried to get bazaar code over bazaar, when
I don't have a launchpad account, it default uses http/https protocol;

$ bzr branch lp:bzr

Or use "bzr branch http://bzr.savannah.gnu.org/r/wget/trunk/"; to
download wget trunk,

It really started with "Fetching revisions:Inserting stream" or some
other messages, but would never finish, even after hours, after days;

I don't know how many hours/days would you usually need to download a
wget trunk code over bazaar http protocol?

>
> Thanks,
> Giuseppe
---
 src/url.c  |   35 +++++++++++++++++++++++------------
 src/url.h  |    2 +-
 src/ftp.c  |   10 +++++-----
 src/http.c |   59 +++++++++++++++++++++++------------------------------------
 4 files changed, 52 insertions(+), 54 deletions(-)

--- src/url.c.orig	2010-07-09 17:36:02.000000000 +0800
+++ src/url.c	2010-09-16 17:45:28.591399233 +0800
@@ -1499,7 +1499,7 @@ append_dir_structure (const struct url *
    possible.  Does not create directories on the file system.  */
 
 char *
-url_file_name (const struct url *u)
+url_file_name (const struct url *u, char *replaced_filename)
 {
   struct growable fnres;        /* stands for "file name result" */
 
@@ -1554,18 +1554,29 @@ url_file_name (const struct url *u)
       append_dir_structure (u, &fnres);
     }
 
-  /* Add the file name. */
-  if (fnres.tail)
-    append_char ('/', &fnres);
-  u_file = *u->file ? u->file : index_filename;
-  append_uri_pathel (u_file, u_file + strlen (u_file), false, &fnres);
-
-  /* Append "?query" to the file name. */
-  u_query = u->query && *u->query ? u->query : NULL;
-  if (u_query)
+  if (!replaced_filename)
     {
-      append_char (FN_QUERY_SEP, &fnres);
-      append_uri_pathel (u_query, u_query + strlen (u_query), true, &fnres);
+      /* Add the file name. */
+      if (fnres.tail)
+	append_char ('/', &fnres);
+      u_file = *u->file ? u->file : index_filename;
+      append_uri_pathel (u_file, u_file + strlen (u_file), false, &fnres);
+
+      /* Append "?query" to the file name. */
+      u_query = u->query && *u->query ? u->query : NULL;
+      if (u_query)
+	{
+	  append_char (FN_QUERY_SEP, &fnres);
+	  append_uri_pathel (u_query, u_query + strlen (u_query),
+			     true, &fnres);
+	}
+    }
+  else
+    {
+      if (fnres.tail)
+	append_char ('/', &fnres);
+      u_file = replaced_filename;
+      append_uri_pathel (u_file, u_file + strlen (u_file), false, &fnres);
     }
 
   /* Zero-terminate the file name. */
--- src/url.h.orig	2010-07-09 17:36:02.000000000 +0800
+++ src/url.h	2010-09-16 17:47:14.206925782 +0800
@@ -99,7 +99,7 @@ int scheme_default_port (enum url_scheme
 void scheme_disable (enum url_scheme);
 
 char *url_string (const struct url *, enum url_auth_mode);
-char *url_file_name (const struct url *);
+char *url_file_name (const struct url *, char *);
 
 char *uri_merge (const char *, const char *);
 
--- src/ftp.c.orig	2010-07-29 03:31:27.000000000 +0800
+++ src/ftp.c	2010-09-16 17:45:28.578927117 +0800
@@ -1382,7 +1382,7 @@ ftp_loop_internal (struct url *u, struct
   else
     {
       /* URL-derived file.  Consider "-O file" name. */
-      con->target = url_file_name (u);
+      con->target = url_file_name (u, NULL);
       if (!opt.output_document)
         locf = con->target;
       else
@@ -1496,7 +1496,7 @@ ftp_loop_internal (struct url *u, struct
             {
               /* Re-determine the file name. */
               xfree_null (con->target);
-              con->target = url_file_name (u);
+              con->target = url_file_name (u, NULL);
               locf = con->target;
             }
           continue;
@@ -1624,7 +1624,7 @@ ftp_get_listing (struct url *u, ccon *co
   /* Find the listing file name.  We do it by taking the file name of
      the URL and replacing the last component with the listing file
      name.  */
-  uf = url_file_name (u);
+  uf = url_file_name (u, NULL);
   lf = file_merge (uf, LIST_FILENAME);
   xfree (uf);
   DEBUGP ((_("Using %s as listing tmp file.\n"), quote (lf)));
@@ -1718,7 +1718,7 @@ ftp_retrieve_list (struct url *u, struct
       ofile = xstrdup (u->file);
       url_set_file (u, f->name);
 
-      con->target = url_file_name (u);
+      con->target = url_file_name (u, NULL);
       err = RETROK;
 
       dlthis = true;
@@ -2168,7 +2168,7 @@ ftp_loop (struct url *u, char **local_fi
               char *filename = (opt.output_document
                                 ? xstrdup (opt.output_document)
                                 : (con.target ? xstrdup (con.target)
-                                   : url_file_name (u)));
+                                   : url_file_name (u, NULL)));
               res = ftp_index (filename, u, f);
               if (res == FTPOK && opt.verbose)
                 {
--- src/http.c.orig	2010-07-29 03:31:27.000000000 +0800
+++ src/http.c	2010-09-16 17:56:28.882889918 +0800
@@ -1149,7 +1149,14 @@ append_value_to_filename (char **filenam
    false.
 
    The file name is stripped of directory components and must not be
-   empty.  */
+   empty.
+
+   Historically, this function returned filename prefixed with opt.dir_prefix,
+   now that logic is handled by the caller, new code should pay attention,
+   changed by crq, Sep 2010.
+
+*/
+
 static bool
 parse_content_disposition (const char *hdr, char **filename)
 {
@@ -1169,40 +1176,13 @@ parse_content_disposition (const char *h
 	    value.b = 1 + (last_slash ? last_slash : last_bs);
 	  if (value.b == value.e)
 	    continue;
-	  /* Start with the directory prefix, if specified. */
-	  if (opt.dir_prefix)
+	  if (*filename)
 	    {
-	      if (!(*filename))
-		{
-		  int prefix_length = strlen (opt.dir_prefix);
-		  bool add_slash = (opt.dir_prefix[prefix_length - 1] != '/');
-		  int total_length;
-		  
-		  if (add_slash) 
-		    ++prefix_length;
-		  total_length = prefix_length + (value.e - value.b);            
-		  *filename = xmalloc (total_length + 1);
-		  strcpy (*filename, opt.dir_prefix);
-		  if (add_slash) 
-		    (*filename)[prefix_length - 1] = '/';
-		  memcpy (*filename + prefix_length, value.b, (value.e - value.b));
-		  (*filename)[total_length] = '\0';
-		}
-	      else
-		{
-		  append_value_to_filename (filename, &value);
-		}  
+	      append_value_to_filename (filename, &value);
 	    }
 	  else
 	    {
-	      if (*filename)
-		{
-		  append_value_to_filename (filename, &value);
-		}
-	      else
-		{
-		  *filename = strdupdelim (value.b, value.e);
-		}
+	      *filename = strdupdelim (value.b, value.e);
 	    }
 	}
     }
@@ -2159,16 +2139,24 @@ read_header:
    * hstat.local_file is set by http_loop to the argument of -O. */
   if (!hs->local_file)
     {
+      char *local_file = NULL;
+
       /* Honor Content-Disposition whether possible. */
       if (!opt.content_disposition
           || !resp_header_copy (resp, "Content-Disposition",
                                 hdrval, sizeof (hdrval))
-          || !parse_content_disposition (hdrval, &hs->local_file))
+          || !parse_content_disposition (hdrval, &local_file))
         {
           /* The Content-Disposition header is missing or broken.
            * Choose unique file name according to given URL. */
-          hs->local_file = url_file_name (u);
+          hs->local_file = url_file_name (u, NULL);
         }
+      else
+	{
+	  DEBUGP(("Parsed filename from Content-Disposition: %s\n",
+		  local_file));
+	  hs->local_file = url_file_name(u, local_file);
+	}
     }
 
   /* TODO: perform this check only once. */
@@ -2643,7 +2631,7 @@ http_loop (struct url *u, struct url *or
   else if (!opt.content_disposition)
     {
       hstat.local_file =
-        url_file_name (opt.trustservernames ? u : original_url);
+        url_file_name (opt.trustservernames ? u : original_url, NULL);
       got_name = true;
     }
 
@@ -2681,7 +2669,7 @@ File %s already there; not retrieving.\n
 
   /* Send preliminary HEAD request if -N is given and we have an existing
    * destination file. */
-  file_name = url_file_name (opt.trustservernames ? u : original_url);
+  file_name = url_file_name (opt.trustservernames ? u : original_url, NULL);
   if (opt.timestamping && (file_exists_p (file_name)
                            || opt.content_disposition))
     send_head_first = true;
@@ -3566,7 +3554,6 @@ test_parse_content_disposition()
       char *filename;
       bool res;
 
-      opt.dir_prefix = test_array[i].opt_dir_prefix;
       res = parse_content_disposition (test_array[i].hdrval, &filename);
 
       mu_assert ("test_parse_content_disposition: wrong result",

Reply via email to