git: 9front

Download patch

ref: ab2b56b6b0b62e9e492bc1acba197bbb85bb642f
parent: 7312a7c586c5ecdbbc395c4ff8c3c9acadb232b9
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Jun 4 15:10:07 EDT 2016

webfs: less aggressive url normalization; never unescape reserved characters in path/query/fragment

--- 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 @@
 	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 @@
 		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);
--