* http.c (do_parse_uri): Properly handle IPv6 literal addresses as per
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 13 Mar 2009 17:51:05 +0000 (17:51 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Fri, 13 Mar 2009 17:51:05 +0000 (17:51 +0000)
RFC-2732.  Adapted from patch by Phil Pennock.

util/ChangeLog
util/http.c

index 6c5e7d0..21132d2 100644 (file)
@@ -1,5 +1,8 @@
 2009-03-13  David Shaw  <dshaw@jabberwocky.com>
 
+       * http.c (do_parse_uri): Properly handle IPv6 literal addresses as
+       per RFC-2732.  Adapted from patch by Phil Pennock.
+
        * Makefile.am, http.c (start_server): Minor tweaks to get
        http-test compiling again.
 
index 9acd146..5013ae6 100644 (file)
@@ -343,16 +343,27 @@ do_parse_uri( PARSED_URI uri, int only_local_part )
              }
 
            strlwr( p );
-           uri->host = p;
-           if( (p3=strchr( p, ':' )) ) {
-               *p3++ = 0;
+
+           /* Handle a host of [IP] so that [IP:V6]:port works */
+           if( *p == '[' && (p3=strchr( p, ']' )) )
+             {
+               *p3++ = '\0';
+               /* worst case, uri->host should have length 0, points to \0 */
+               uri->host = p + 1;
+               p = p3;
+             }
+           else
+             uri->host = p;
+
+           if( (p3=strchr( p, ':' )) )
+             {
+               *p3++ = '\0';
                uri->port = atoi( p3 );
-           }
+             }
 
-           uri->host = p;
            if( (n = remove_escapes( uri->host )) < 0 )
                return G10ERR_BAD_URI;
-           if( n != strlen( p ) )
+           if( n != strlen( uri->host ) )
                return G10ERR_BAD_URI; /* hostname with a Nul in it */
            p = p2 ? p2 : NULL;
        }