From a4a1a88a70d82facefdd19b66ebc372e28adb146 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 4 Jun 2016 19:10:07 +0200 Subject: webfs: less aggressive url normalization; never unescape reserved characters in path/query/fragment --- sys/src/cmd/webfs/url.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'sys/src/cmd/webfs') diff --git a/sys/src/cmd/webfs/url.c b/sys/src/cmd/webfs/url.c index 141c8abd0..82e0a4c2b 100644 --- a/sys/src/cmd/webfs/url.c +++ b/sys/src/cmd/webfs/url.c @@ -8,6 +8,8 @@ #include "dat.h" #include "fns.h" +static char reserved[] = "%:/?#[]@!$&'()*+,;="; + static int dhex(char c) { @@ -31,7 +33,7 @@ unescape(char *s, char *spec) for(r=w=s; x = *r; r++){ if(x == '%' && isxdigit(r[1]) && isxdigit(r[2])){ x = (dhex(r[1])<<4)|dhex(r[2]); - if(x == 0 || x == '%' || (x > 0x1F && x < 0x7F && strchr(spec, x))){ + if(spec && strchr(spec, x)){ *w++ = '%'; *w++ = toupper(r[1]); *w++ = toupper(r[2]); @@ -328,11 +330,11 @@ Out: free(t); } - unescape(u->user, ""); - unescape(u->pass, ""); - unescape(u->path, "/"); - unescape(u->query, "&;=/?#"); - unescape(u->fragment, ""); + unescape(u->user, nil); + unescape(u->pass, nil); + unescape(u->path, reserved); + unescape(u->query, reserved); + unescape(u->fragment, reserved); mklowcase(u->scheme); mklowcase(u->host); mklowcase(u->port); -- cgit v1.2.3