diff options
author | 2012-03-03 16:41:20 -0500 | |
---|---|---|
committer | 2012-03-03 16:41:20 -0500 | |
commit | 2a42899039b15444e8445300c8562e8934e8876a (patch) | |
tree | e4a0eb42be56f403faac02622cde27ac61e323c5 | |
parent | 53e8eba14aba951cef1e1a1428612a31d88ec0a7 (diff) |
Avoid URL size limit in RPCs with large arguments
-rw-r--r-- | lib/js/urweb.js | 15 | ||||
-rw-r--r-- | src/cjr_print.sml | 12 |
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/js/urweb.js b/lib/js/urweb.js index a5ab90c5..e6c2124f 100644 --- a/lib/js/urweb.js +++ b/lib/js/urweb.js @@ -1137,10 +1137,17 @@ function unload() { } } -function requestUri(xhr, uri, needsSig) { +function requestUri(xhr, uri, needsSig, isRpc) { if (unloading) return; + var extraData = null; + + if (isRpc && uri.length > 2000) { + extraData = uri.substring(2000); + uri = uri.substring(0, 2000); + } + xhr.open("POST", uri, true); xhr.setRequestHeader("Content-type", "text/plain"); try { @@ -1161,7 +1168,7 @@ function requestUri(xhr, uri, needsSig) { } inFlight = cons(xhr, inFlight); - xhr.send(null); + xhr.send(extraData); } function xhrFinished(xhr) { @@ -1211,7 +1218,7 @@ function rc(prefix, uri, parse, k, needsSig) { } }; - requestUri(xhr, uri, needsSig); + requestUri(xhr, uri, needsSig, true); } function path_join(s1, s2) { @@ -1260,7 +1267,7 @@ function listener() { var connect = function () { xhr.onreadystatechange = orsc; tid = window.setTimeout(onTimeout, timeout * 500); - requestUri(xhr, uri, false); + requestUri(xhr, uri, false, false); } orsc = function() { diff --git a/src/cjr_print.sml b/src/cjr_print.sml index 65344ffb..29b0f5d2 100644 --- a/src/cjr_print.sml +++ b/src/cjr_print.sml @@ -2971,6 +2971,18 @@ fun p_file env (ds, ps) = newline, string "if (*request == '/') ++request;", newline, + case ek of + Rpc _ => box [string "if (uw_hasPostBody(ctx)) {", + newline, + box [string "uw_Basis_postBody pb = uw_getPostBody(ctx);", + newline, + string "if (pb.data[0])", + newline, + box [string "request = uw_Basis_strcat(ctx, request, pb.data);"], + newline], + string "}", + newline] + | _ => box [], if couldWrite ek andalso not (Settings.checkNoXsrfProtection s) then box [string "{", newline, |