# HG changeset patch # User Adam Chlipala # Date 1330810880 18000 # Node ID ea292bf9431fe9446e2f6a8ee3f9b095b29ff8d0 # Parent a7b70c7b3f1a9916935287393b257dfe4fb902c5 Avoid URL size limit in RPCs with large arguments diff -r a7b70c7b3f1a -r ea292bf9431f lib/js/urweb.js --- a/lib/js/urweb.js Sat Mar 03 16:20:54 2012 -0500 +++ b/lib/js/urweb.js Sat Mar 03 16:41:20 2012 -0500 @@ -1137,10 +1137,17 @@ } } -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 @@ } inFlight = cons(xhr, inFlight); - xhr.send(null); + xhr.send(extraData); } function xhrFinished(xhr) { @@ -1211,7 +1218,7 @@ } }; - requestUri(xhr, uri, needsSig); + requestUri(xhr, uri, needsSig, true); } function path_join(s1, s2) { @@ -1260,7 +1267,7 @@ var connect = function () { xhr.onreadystatechange = orsc; tid = window.setTimeout(onTimeout, timeout * 500); - requestUri(xhr, uri, false); + requestUri(xhr, uri, false, false); } orsc = function() { diff -r a7b70c7b3f1a -r ea292bf9431f src/cjr_print.sml --- a/src/cjr_print.sml Sat Mar 03 16:20:54 2012 -0500 +++ b/src/cjr_print.sml Sat Mar 03 16:41:20 2012 -0500 @@ -2971,6 +2971,18 @@ 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,