changeset 1087:e81434513720

Proper JavaScript-side URI escaping/de-escaping; fix C-side URL encoding of big characters
author Adam Chlipala <adamc@hcoop.net>
date Thu, 24 Dec 2009 10:44:53 -0500
parents 99aebdf30257
children 5f72a66402f7
files lib/js/urweb.js src/c/urweb.c tests/jsuni.ur tests/jsuni.urp tests/jsuni.urs
diffstat 5 files changed, 26 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lib/js/urweb.js	Thu Dec 24 10:02:48 2009 -0500
+++ b/lib/js/urweb.js	Thu Dec 24 10:44:53 2009 -0500
@@ -583,8 +583,7 @@
 function uf(s) {
   if (s.length == 0)
     return "_";
-  return (s.charAt(0) == '_' ? "_" : "")
-        + escape(s).replace(new RegExp ("/", "g"), "%2F").replace(new RegExp ("\\+", "g"), "%2B");
+  return (s.charAt(0) == '_' ? "_" : "") + encodeURIComponent(s);
 }
 
 function uu(s) {
@@ -592,7 +591,7 @@
     s = s.substring(1);
   } else if (s.length >= 3 && s.charAt(0) == '%' && s.charAt(1) == '5' && (s.charAt(2) == 'f' || s.charAt(2) == 'F'))
     s = s.substring(3);
-  return unescape(s.replace(new RegExp ("\\+", "g"), " "));
+  return decodeURIComponent(s.replace(new RegExp ("\\+", "g"), " "));
 }
 
 function ub(b) {
--- a/src/c/urweb.c	Thu Dec 24 10:02:48 2009 -0500
+++ b/src/c/urweb.c	Thu Dec 24 10:44:53 2009 -0500
@@ -1590,7 +1590,7 @@
     *p++ = '_';
 
   for (; *s; s++) {
-    char c = *s;
+    unsigned char c = *s;
 
     if (c == ' ')
       *p++ = '+';
@@ -1667,7 +1667,7 @@
     uw_writec_unsafe(ctx, '_');
 
   for (; *s; s++) {
-    char c = *s;
+    unsigned char c = *s;
 
     if (c == ' ')
       uw_writec_unsafe(ctx, '+');
@@ -1737,7 +1737,7 @@
   }
 
   for (s1 = r; *s2; ++s1, ++s2) {
-    char c = *s2;
+    unsigned char c = *s2;
 
     switch (c) {
     case '+':
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/jsuni.ur	Thu Dec 24 10:44:53 2009 -0500
@@ -0,0 +1,17 @@
+fun main () =
+    s1 <- source "";
+    s2 <- source "";
+
+    let
+        fun echo s = return s
+
+        fun echoer () =
+            v1 <- get s1;
+            v1' <- rpc (echo v1);
+            set s2 v1'
+    in
+        return <xml><body>
+          <dyn signal={v <- signal s2; return (cdata v)}/><hr/>
+          <ctextbox source={s1}/> <button onclick={echoer ()}/>
+        </body></xml>
+    end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/jsuni.urp	Thu Dec 24 10:44:53 2009 -0500
@@ -0,0 +1,3 @@
+debug
+
+jsuni
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/jsuni.urs	Thu Dec 24 10:44:53 2009 -0500
@@ -0,0 +1,1 @@
+val main : unit -> transaction page