diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-03-23 00:49:07 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-03-23 00:49:07 +0100 |
commit | 151039caf055a741c69656ae9034b4829e4d6c94 (patch) | |
tree | ff83464daf054af30218ddfb802cdfb9df287a66 | |
parent | 1e97adc86b3ca9ef5c9834fa802e4003df1b86e2 (diff) | |
download | plan9front-151039caf055a741c69656ae9034b4829e4d6c94.tar.xz |
webfs: bracket literal ipv6 host in "Host:" header
-rw-r--r-- | sys/src/cmd/webfs/fns.h | 2 | ||||
-rw-r--r-- | sys/src/cmd/webfs/fs.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/webfs/http.c | 4 | ||||
-rw-r--r-- | sys/src/cmd/webfs/url.c | 10 |
4 files changed, 14 insertions, 3 deletions
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 @@ -83,6 +83,14 @@ Nfmt(Fmt *f) } 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) { char *s; @@ -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); } |