summaryrefslogtreecommitdiff
path: root/sys/src/cmd/webfs
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-06-04 19:10:07 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-06-04 19:10:07 +0200
commita4a1a88a70d82facefdd19b66ebc372e28adb146 (patch)
tree07d04cf8704af50b32f2688af7817ec16e7968d8 /sys/src/cmd/webfs
parent7c5ca77a6e4d442b4c026e2cd9e483a692f65def (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.c14
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);