summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-12-24 10:44:53 -0500
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-12-24 10:44:53 -0500
commit811e5474313fc8fc959bee1a58e51c4c55f350ec (patch)
treecf76b77aad3472dffdc66f3b00386d2fbe0b84b9
parent0c607fbf24eb6e55f99f80ee725c02f94cc10d1a (diff)
Proper JavaScript-side URI escaping/de-escaping; fix C-side URL encoding of big characters
-rw-r--r--lib/js/urweb.js5
-rw-r--r--src/c/urweb.c6
-rw-r--r--tests/jsuni.ur17
-rw-r--r--tests/jsuni.urp3
-rw-r--r--tests/jsuni.urs1
5 files changed, 26 insertions, 6 deletions
diff --git a/lib/js/urweb.js b/lib/js/urweb.js
index 15c9df7e..bd575cc9 100644
--- a/lib/js/urweb.js
+++ b/lib/js/urweb.js
@@ -583,8 +583,7 @@ function pflo(s) {
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 @@ function uu(s) {
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) {
diff --git a/src/c/urweb.c b/src/c/urweb.c
index 472f6eb4..1f8271d5 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -1590,7 +1590,7 @@ char *uw_Basis_urlifyString(uw_context ctx, uw_Basis_string s) {
*p++ = '_';
for (; *s; s++) {
- char c = *s;
+ unsigned char c = *s;
if (c == ' ')
*p++ = '+';
@@ -1667,7 +1667,7 @@ uw_unit uw_Basis_urlifyString_w(uw_context ctx, uw_Basis_string s) {
uw_writec_unsafe(ctx, '_');
for (; *s; s++) {
- char c = *s;
+ unsigned char c = *s;
if (c == ' ')
uw_writec_unsafe(ctx, '+');
@@ -1737,7 +1737,7 @@ static uw_Basis_string uw_unurlifyString_to(int fromClient, uw_context ctx, char
}
for (s1 = r; *s2; ++s1, ++s2) {
- char c = *s2;
+ unsigned char c = *s2;
switch (c) {
case '+':
diff --git a/tests/jsuni.ur b/tests/jsuni.ur
new file mode 100644
index 00000000..9a1e3e90
--- /dev/null
+++ b/tests/jsuni.ur
@@ -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
diff --git a/tests/jsuni.urp b/tests/jsuni.urp
new file mode 100644
index 00000000..0eb968e3
--- /dev/null
+++ b/tests/jsuni.urp
@@ -0,0 +1,3 @@
+debug
+
+jsuni
diff --git a/tests/jsuni.urs b/tests/jsuni.urs
new file mode 100644
index 00000000..6ac44e0b
--- /dev/null
+++ b/tests/jsuni.urs
@@ -0,0 +1 @@
+val main : unit -> transaction page