parseuri: support IPv6 address for host - gopherproxy-c - Gopher HTTP proxy in C (CGI)
(HTM) git clone git://git.codemadness.org/gopherproxy-c
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 9612b7ed97d46f386db7334b7ef880038a92df8c
(DIR) parent d0cd571a262cbbca3c7d12f08799e6835552bf13
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Fri, 17 Aug 2018 18:37:09 +0200
parseuri: support IPv6 address for host
Diffstat:
M gopherproxy.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
---
(DIR) diff --git a/gopherproxy.c b/gopherproxy.c
@@ -446,15 +446,26 @@ parseuri(const char *str, struct uri *u)
memset(u, 0, sizeof(struct uri));
s = str;
- e = &s[strcspn(s, ":/")];
- if (e - s + 1 >= sizeof(u->host))
- return 0;
- memcpy(u->host, s, e - s);
- u->host[e - s] = '\0';
- if (*e == ':') {
- s = ++e;
+ /* IPv6 */
+ if (*s == '[') {
+ s++;
+ e = strchr(s, ']');
+ if (!e || e - s + 1 >= sizeof(u->host))
+ return 0;
+ memcpy(u->host, s, e - s);
+ u->host[e - s] = '\0';
+ e++;
+ } else {
+ e = &s[strcspn(s, ":/")];
+ if (e - s + 1 >= sizeof(u->host))
+ return 0;
+ memcpy(u->host, s, e - s);
+ u->host[e - s] = '\0';
+ }
+ if (*e == ':') {
+ s = e + 1;
e = &s[strcspn(s, "/")];
if (e - s + 1 >= sizeof(u->port))