Mercurial > urweb
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 (2009-12-24) |
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