Tristan Horn <[EMAIL PROTECTED]> writes:

> tris.net/index.html: merge("http://tris.net/";, "//www.arrl.org/") ->
> http://tris.net//www.arrl.org/
> (it should return http://www.arrl.org/)
>
> See page 11 of rfc1630 and page 11 of rfc2396 for more details.  I
> may well be the only person using 'em, though... :)

Thanks for the report.  And, as it happens, you're not the only person
using them.  Here is the fix that has been in CVS for some time now:

Index: src/url.c
===================================================================
RCS file: /pack/anoncvs/wget/src/url.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- src/url.c   2001/12/14 15:45:59     1.67
+++ src/url.c   2002/01/14 01:56:40     1.68
@@ -1575,6 +1575,37 @@
          memcpy (constr + baselength, link, linklength);
          constr[baselength + linklength] = '\0';
        }
+      else if (linklength > 1 && *link == '/' && *(link + 1) == '/')
+       {
+         /* LINK begins with "//" and so is a net path: we need to
+            replace everything after (and including) the double slash
+            with LINK. */
+
+         /* uri_merge("foo", "//new/bar")            -> "//new/bar"      */
+         /* uri_merge("//old/foo", "//new/bar")      -> "//new/bar"      */
+         /* uri_merge("http://old/foo";, "//new/bar") -> "http://new/bar"; */
+
+         int span;
+         const char *slash;
+         const char *start_insert;
+
+         /* Look for first slash. */
+         slash = memchr (base, '/', end - base);
+         /* If found slash and it is a double slash, then replace
+            from this point, else default to replacing from the
+            beginning.  */
+         if (slash && *(slash + 1) == '/')
+           start_insert = slash;
+         else
+           start_insert = base;
+
+         span = start_insert - base;
+         constr = (char *)xmalloc (span + linklength + 1);
+         if (span)
+           memcpy (constr, base, span);
+         memcpy (constr + span, link, linklength);
+         constr[span + linklength] = '\0';
+       }
       else if (*link == '/')
        {
          /* LINK is an absolute path: we need to replace everything

Reply via email to