diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-06-04 19:10:07 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-06-04 19:10:07 +0200 |
commit | a4a1a88a70d82facefdd19b66ebc372e28adb146 (patch) | |
tree | 07d04cf8704af50b32f2688af7817ec16e7968d8 /sys/src/cmd/webfs | |
parent | 7c5ca77a6e4d442b4c026e2cd9e483a692f65def (diff) |
webfs: less aggressive url normalization; never unescape reserved characters in path/query/fragment
Diffstat (limited to 'sys/src/cmd/webfs')
-rw-r--r-- | sys/src/cmd/webfs/url.c | 14 |
1 files changed, 8 insertions, 6 deletions
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); |