From 2d02e2211e1493b2652b44329bd0b29bac71c1b7 Mon Sep 17 00:00:00 2001 From: Mukund Sivaraman Date: Fri, 4 Feb 2011 20:28:48 +0530 Subject: Handle IPv6 literals in URLs correctly --- src/reqs.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/reqs.c b/src/reqs.c index ead54ff..569f916 100644 --- a/src/reqs.c +++ b/src/reqs.c @@ -167,12 +167,18 @@ static void strip_username_password (char *host) static int strip_return_port (char *host) { char *ptr1; + char *ptr2; int port; - ptr1 = strchr (host, ':'); + ptr1 = strrchr (host, ':'); if (ptr1 == NULL) return 0; + /* Check for IPv6 style literals */ + ptr2 = strchr (ptr1, ']'); + if (ptr2 != NULL) + return 0; + *ptr1++ = '\0'; if (sscanf (ptr1, "%d", &port) != 1) /* one conversion required */ return 0; @@ -212,6 +218,13 @@ static int extract_http_url (const char *url, struct request_s *request) port = strip_return_port (request->host); request->port = (port != 0) ? port : HTTP_PORT; + /* Remove any surrounding '[' and ']' from IPv6 literals */ + p = strrchr (request->host, ']'); + if (p && (*(request->host) == '[')) { + request->host++; + *p = '\0'; + } + return 0; ERROR_EXIT: -- cgit v1.2.3