From 151039caf055a741c69656ae9034b4829e4d6c94 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 23 Mar 2019 00:49:07 +0100 Subject: webfs: bracket literal ipv6 host in "Host:" header --- sys/src/cmd/webfs/fns.h | 2 ++ sys/src/cmd/webfs/fs.c | 1 + sys/src/cmd/webfs/http.c | 4 ++-- sys/src/cmd/webfs/url.c | 10 +++++++++- 4 files changed, 14 insertions(+), 3 deletions(-) (limited to 'sys/src/cmd/webfs') diff --git a/sys/src/cmd/webfs/fns.h b/sys/src/cmd/webfs/fns.h index 67301005d..b754802fa 100644 --- a/sys/src/cmd/webfs/fns.h +++ b/sys/src/cmd/webfs/fns.h @@ -15,10 +15,12 @@ char* unquote(char *s, char **ps); #pragma varargck type "U" Url* #pragma varargck type "E" Str2 #pragma varargck type "N" char* +#pragma varargck type "]" char* int Efmt(Fmt*); int Nfmt(Fmt*); int Ufmt(Fmt*); +int Mfmt(Fmt*); char* Upath(Url *); Url* url(char *s, Url *b); Url* saneurl(Url *u); diff --git a/sys/src/cmd/webfs/fs.c b/sys/src/cmd/webfs/fs.c index 6b4f4990d..e4e08670d 100644 --- a/sys/src/cmd/webfs/fs.c +++ b/sys/src/cmd/webfs/fs.c @@ -766,6 +766,7 @@ main(int argc, char *argv[]) quotefmtinstall(); fmtinstall('U', Ufmt); fmtinstall('N', Nfmt); + fmtinstall(']', Mfmt); fmtinstall('E', Efmt); fmtinstall('[', encodefmt); fmtinstall('H', encodefmt); diff --git a/sys/src/cmd/webfs/http.c b/sys/src/cmd/webfs/http.c index 907035bcc..58a0df91c 100644 --- a/sys/src/cmd/webfs/http.c +++ b/sys/src/cmd/webfs/http.c @@ -637,7 +637,7 @@ http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost) ru.path = Upath(u); ru.query = u->query; } - n = snprint(buf, sizeof(buf), "%s %U HTTP/1.1\r\nHost: %s%s%s\r\n", + n = snprint(buf, sizeof(buf), "%s %U HTTP/1.1\r\nHost: %]%s%s\r\n", method, &ru, host, u->port ? ":" : "", u->port ? u->port : ""); if(n >= sizeof(buf)-64){ werrstr("request too large"); @@ -649,7 +649,7 @@ http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost) break; } if(h->tunnel){ - n = snprint(buf, sizeof(buf), "CONNECT %s:%s HTTP/1.1\r\nHost: %s:%s\r\n", + n = snprint(buf, sizeof(buf), "CONNECT %]:%s HTTP/1.1\r\nHost: %]:%s\r\n", host, u->port ? u->port : "443", host, u->port ? u->port : "443"); } diff --git a/sys/src/cmd/webfs/url.c b/sys/src/cmd/webfs/url.c index 1f460a8cb..870a3cdc2 100644 --- a/sys/src/cmd/webfs/url.c +++ b/sys/src/cmd/webfs/url.c @@ -82,6 +82,14 @@ Nfmt(Fmt *f) return 0; } +int +Mfmt(Fmt *f) +{ + char *s = va_arg(f->args, char*); + fmtprint(f, (*s != '[' && strchr(s, ':') != nil)? "[%s]" : "%s", s); + return 0; +} + int Ufmt(Fmt *f) { @@ -101,7 +109,7 @@ Ufmt(Fmt *f) fmtprint(f, "@"); } if(u->host){ - fmtprint(f, strchr(u->host, ':') ? "[%s]" : "%s", u->host); + fmtprint(f, "%]", u->host); if(u->port) fmtprint(f, ":%s", u->port); } -- cgit v1.2.3