From 1e477cfc4af593088b2feb259264cf1f7addefda Mon Sep 17 00:00:00 2001
From: Daniel Ehrenberg <ehrenbed@carleton.edu>
Date: Fri, 1 Feb 2008 18:38:29 -0600
Subject: [PATCH] URL encoding/decoding uses UTF-8 now

---
 extra/http/http-tests.factor |  2 ++
 extra/http/http.factor       | 19 ++++++++-----------
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/extra/http/http-tests.factor b/extra/http/http-tests.factor
index 853ac28f72..5146502644 100644
--- a/extra/http/http-tests.factor
+++ b/extra/http/http-tests.factor
@@ -14,3 +14,5 @@ IN: temporary
 [ "hello world"   ] [ "hello world%x"  url-decode ] unit-test
 [ "hello%20world" ] [ "hello world"    url-encode ] unit-test
 [ "%20%21%20"     ] [ " ! "            url-encode ] unit-test
+
+[ "\u001234hi\u002045" ] [ "\u001234hi\u002045" url-encode url-decode ] unit-test
diff --git a/extra/http/http.factor b/extra/http/http.factor
index 7beb3b9da0..1bd9e18d98 100755
--- a/extra/http/http.factor
+++ b/extra/http/http.factor
@@ -1,7 +1,7 @@
 ! Copyright (C) 2003, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: hashtables io kernel math namespaces math.parser assocs
-sequences strings splitting ascii ;
+sequences strings splitting ascii io.utf8 ;
 IN: http
 
 : header-line ( line -- )
@@ -22,16 +22,13 @@ IN: http
     over digit? or
     swap "/_-." member? or ; foldable
 
+: push-utf8 ( string -- )
+    1string encode-utf8 [ CHAR: % , >hex 2 CHAR: 0 pad-left % ] each ;
+
 : url-encode ( str -- str )
-    [
-        [
-            dup url-quotable? [
-                ,
-            ] [
-                CHAR: % , >hex 2 CHAR: 0 pad-left %
-            ] if
-        ] each
-    ] "" make ;
+    [ [
+        dup url-quotable? [ , ] [ push-utf8 ] if
+    ] each ] "" make ;
 
 : url-decode-hex ( index str -- )
     2dup length 2 - >= [
@@ -58,7 +55,7 @@ IN: http
     ] if ;
 
 : url-decode ( str -- str )
-    [ 0 swap url-decode-iter ] "" make ;
+    [ 0 swap url-decode-iter ] "" make decode-utf8 ;
 
 : hash>query ( hash -- str )
     [ [ url-encode ] 2apply "=" swap 3append ] { } assoc>map