diff options
author | Mukund Sivaraman <muks@banu.com> | 2011-02-04 20:28:48 +0530 |
---|---|---|
committer | Mukund Sivaraman <muks@banu.com> | 2011-02-04 20:28:48 +0530 |
commit | 2d02e2211e1493b2652b44329bd0b29bac71c1b7 (patch) | |
tree | 324269df85add3a69d8ebcc104f99c7d896dff68 | |
parent | 8fd3808ad315fcdf84648a2378324cfab21df0c1 (diff) | |
download | tinyproxy-2d02e2211e1493b2652b44329bd0b29bac71c1b7.tar.gz tinyproxy-2d02e2211e1493b2652b44329bd0b29bac71c1b7.zip |
Handle IPv6 literals in URLs correctly
-rw-r--r-- | src/reqs.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -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: |