Index: http-server.scm
===================================================================
--- http-server.scm	(revision 240)
+++ http-server.scm	(working copy)
@@ -421,10 +421,7 @@
      (map (lambda (def)
 	    (regex-case def
 	      ["([^=]+)=(.*)" (_ name value)
-	       (cons name
-		     (string-translate
-		      (http:canonicalize-string value)
-		      "+" " ") ) ]
+	       (cons name (http:canonicalize-string value)) ] 
 	      [else (cons def #f)] ) )
 	  data) ) ) )
 
Index: http-utils.scm
===================================================================
--- http-utils.scm	(revision 240)
+++ http-utils.scm	(working copy)
@@ -102,17 +102,19 @@
 ;;; URL and string operations:
 
 (define (http:decode-url url)
-  (let ((canurl (http:canonicalize-string url)))
-    (regex-case canurl
-      ["([^?]+)\\?(.*)" (_ loc args)
-        (values
-         loc
-         (parse-encoded-arguments args) ) ]
-       [else
-         (values canurl '())] ) ) )
+  (regex-case url
+    ["([^?]+)\\?(.*)" (_ loc args)
+     (values
+      (http:unescape-string loc)
+      (parse-encoded-arguments args) ) ] 
+    [else (values (http:unescape-string url) '())] ) )
 
 (define (http:canonicalize-string str)
-  (let loop ([i 0] [str str])
+  (http:unescape-string
+   (string-translate str "+" " ")))
+
+(define (http:unescape-string str)
+  (let loop ([i 0] (str str))
     (match (string-search-positions "%[0-9ABCDEFabcdef]{2}" str i)
       [((i1 i2))
        (loop 
@@ -124,7 +126,7 @@
       [_ str] ) ) )
 
 (define (parse-encoded-arguments args)
-  (let ([vals (string-split (string-translate args "+" " ") "&")])
+  (let ([vals (string-split args "&")])
     (map (lambda (def)
 	   (regex-case def
 	     ["([^=]+)=(.*)" (_ name val)

