diff options
Diffstat (limited to 'src/reqs.c')
-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: |