summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-03-23 00:49:07 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2019-03-23 00:49:07 +0100
commit151039caf055a741c69656ae9034b4829e4d6c94 (patch)
treeff83464daf054af30218ddfb802cdfb9df287a66
parent1e97adc86b3ca9ef5c9834fa802e4003df1b86e2 (diff)
downloadplan9front-151039caf055a741c69656ae9034b4829e4d6c94.tar.xz
webfs: bracket literal ipv6 host in "Host:" header
-rw-r--r--sys/src/cmd/webfs/fns.h2
-rw-r--r--sys/src/cmd/webfs/fs.c1
-rw-r--r--sys/src/cmd/webfs/http.c4
-rw-r--r--sys/src/cmd/webfs/url.c10
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);
}