changeset: 6817:2a6bfdb9f869
user:      Kevin McCarthy <ke...@8t8.us>
date:      Sat Oct 15 14:45:55 2016 -0700
link:      http://dev.mutt.org/hg/mutt/rev/2a6bfdb9f869

Allow IPv6 literal addresses in URLs. (closes #3681)

RFCs 2732 and 3986 specify a literal IPv6 address be surrounded by
"[]".

This patch removes the "[]" delimiters when parsing the URL, but adds
them back in url_ciss_tostring() if the host name contains a ':'.

Thanks to Evgeni Golov for the original patch.

diffs (50 lines):

diff -r a3e35631b503 -r 2a6bfdb9f869 url.c
--- a/url.c     Wed Oct 12 18:10:35 2016 -0700
+++ b/url.c     Sat Oct 15 14:45:55 2016 -0700
@@ -143,7 +143,16 @@
     ciss->user = src;
     if (url_pct_decode (ciss->user) < 0)
       return -1;
-    t++;
+    src = t + 1;
+  }
+
+  /* IPv6 literal address.  It may contain colons, so set t to start
+   * the port scan after it.
+   */
+  if ((*src == '[') && (t = strchr (src, ']')))
+  {
+    src++;
+    *t++ = '\0';
   }
   else
     t = src;
@@ -159,7 +168,7 @@
   else
     ciss->port = 0;
 
-  ciss->host = t;
+  ciss->host = src;
   return url_pct_decode (ciss->host) >= 0 &&
     (!ciss->path || url_pct_decode (ciss->path) >= 0) ? 0 : -1;
 }
@@ -232,10 +241,17 @@
       len -= (l = strlen (dest)); dest += l;
     }
 
+    if (strchr (ciss->host, ':'))
+      snprintf (dest, len, "[%s]", ciss->host);
+    else
+      snprintf (dest, len, "%s", ciss->host);
+
+    len -= (l = strlen (dest)); dest += l;
+
     if (ciss->port)
-      snprintf (dest, len, "%s:%hu/", ciss->host, ciss->port);
+      snprintf (dest, len, ":%hu/", ciss->port);
     else
-      snprintf (dest, len, "%s/", ciss->host);
+      snprintf (dest, len, "/");
   }
 
   if (ciss->path)

Reply via email to