]> sjero.net Git - wget/commitdiff
Fix Test-iri-list.
authorMicah Cowan <micah@cowan.name>
Mon, 29 Jun 2009 08:07:12 +0000 (01:07 -0700)
committerMicah Cowan <micah@cowan.name>
Mon, 29 Jun 2009 08:07:12 +0000 (01:07 -0700)
src/iri.c
src/iri.h
src/retr.c
src/url.c

index b1e0bf89cd9bc2a9caf55e2e533f1cc2b6a23d12..1803ca710698f19048be43dcfb1164bbbede182d 100644 (file)
--- a/src/iri.c
+++ b/src/iri.c
@@ -295,7 +295,7 @@ remote_to_utf8 (struct iri *i, const char *str, const char **new)
 struct iri *
 iri_new (void)
 {
-  struct iri *i = xmalloc (sizeof (struct iri));
+  struct iri *i = xmalloc (sizeof *i);
   i->uri_encoding = opt.encoding_remote ? xstrdup (opt.encoding_remote) : NULL;
   i->content_encoding = NULL;
   i->orig_url = NULL;
@@ -303,6 +303,17 @@ iri_new (void)
   return i;
 }
 
+struct iri *iri_dup (const struct iri *src)
+{
+  struct iri *i = xmalloc (sizeof *i);
+  i->uri_encoding = src->uri_encoding ? xstrdup (src->uri_encoding) : NULL;
+  i->content_encoding = (src->content_encoding ?
+                         xstrdup (src->content_encoding) : NULL);
+  i->orig_url = src->orig_url ? xstrdup (src->orig_url) : NULL;
+  i->utf8_encode = src->utf8_encode;
+  return i;
+}
+
 /* Completely free an iri structure. */
 void
 iri_free (struct iri *i)
index 6ad2becfde1ce4ad1ebda6cd87109a0b6ff508f6..fe3da15cf416bd6a104e84d855e0e261de9b960d 100644 (file)
--- a/src/iri.h
+++ b/src/iri.h
@@ -47,6 +47,7 @@ char *idn_encode (struct iri *i, char *host);
 char *idn_decode (char *host);
 bool remote_to_utf8 (struct iri *i, const char *str, const char **new);
 struct iri *iri_new (void);
+struct iri *iri_dup (const struct iri *);
 void iri_free (struct iri *i);
 void set_uri_encoding (struct iri *i, char *charset, bool force);
 void set_content_encoding (struct iri *i, char *charset);
index 2a9dec7bbb658aa6bdb12365813c0121142e7cdb..8752dce71510d3ef3819bdbbb4ba7a0906aa1c4a 100644 (file)
@@ -52,6 +52,7 @@ as that of the covered work.  */
 #include "convert.h"
 #include "ptimer.h"
 #include "html-url.h"
+#include "iri.h"
 
 /* Total size of downloaded files.  Used to enforce quota.  */
 SUM_SIZE_INT total_downloaded_bytes;
@@ -885,7 +886,7 @@ retrieve_from_file (const char *file, bool html, int *count)
     {
       int dt,url_err;
       uerr_t status;
-      struct url * url_parsed = url_parse(url, &url_err, NULL, true);
+      struct url * url_parsed = url_parse(url, &url_err, iri, true);
 
       if (!url_parsed)
         {
@@ -906,9 +907,15 @@ retrieve_from_file (const char *file, bool html, int *count)
       if (dt & TEXTHTML)
         html = true;
 
-      /* If we have a found a content encoding, use it */
-      if (iri->content_encoding)
+      /* If we have a found a content encoding, use it.
+       * ( == is okay, because we're checking for identical object) */
+      if (iri->content_encoding != opt.locale)
          set_uri_encoding (iri, iri->content_encoding, false);
+
+      /* Reset UTF-8 encode status */
+      iri->utf8_encode = opt.enable_iri;
+      xfree_null (iri->orig_url);
+      iri->orig_url = NULL;
     }
   else
     input_file = (char *) file;
@@ -920,6 +927,8 @@ retrieve_from_file (const char *file, bool html, int *count)
     {
       char *filename = NULL, *new_file = NULL;
       int dt;
+      struct iri *tmpiri = iri_dup (iri);
+      struct url *parsed_url = NULL;
 
       if (cur_url->ignore_when_downloading)
         continue;
@@ -930,10 +939,9 @@ retrieve_from_file (const char *file, bool html, int *count)
           break;
         }
 
-      /* Reset UTF-8 encode status */
-      iri->utf8_encode = opt.enable_iri;
-      xfree_null (iri->orig_url);
-      iri->orig_url = NULL;
+      /* Need to reparse the url, since it didn't have iri information. */
+      if (opt.enable_iri)
+          parsed_url = url_parse (cur_url->url->url, NULL, tmpiri, true);
 
       if ((opt.recursive || opt.page_requisites)
           && (cur_url->url->scheme != SCHEME_FTP || getproxy (cur_url->url)))
@@ -944,13 +952,18 @@ retrieve_from_file (const char *file, bool html, int *count)
           if (cur_url->url->scheme == SCHEME_FTP)
             opt.follow_ftp = 1;
 
-          status = retrieve_tree (cur_url->url, iri);
+          status = retrieve_tree (parsed_url ? parsed_url : cur_url->url,
+                                  tmpiri);
 
           opt.follow_ftp = old_follow_ftp;
         }
       else
-        status = retrieve_url (cur_url->url, cur_url->url->url, &filename,
-                               &new_file, NULL, &dt, opt.recursive, iri);
+        status = retrieve_url (parsed_url ? parsed_url : cur_url->url,
+                               cur_url->url->url, &filename,
+                               &new_file, NULL, &dt, opt.recursive, tmpiri);
+
+      if (parsed_url)
+          url_free (parsed_url);
 
       if (filename && opt.delete_after && file_exists_p (filename))
         {
@@ -964,6 +977,7 @@ Removing file due to --delete-after in retrieve_from_file():\n"));
 
       xfree_null (new_file);
       xfree_null (filename);
+      iri_free (tmpiri);
     }
 
   /* Free the linked list of URL-s.  */
index 4c22a9fc6e460c5d34cc63ac81f0d6d3ca69c453..6b24e0637331c0fa28e9e5fa96a24ee6667b64ee 100644 (file)
--- a/src/url.c
+++ b/src/url.c
@@ -693,7 +693,7 @@ url_parse (const char *url, int *error, struct iri *iri, bool percent_encode)
   if (percent_encode)
     url_encoded = reencode_escapes (new_url ? new_url : url);
   else
-     url_encoded = new_url ? new_url : url;
+    url_encoded = new_url ? new_url : url;
 
   p = url_encoded;