file_CrossSiteXHR_inner_data.sjs (2878B)
1 var data = 2 '<!DOCTYPE HTML>\n\ 3 <html>\n\ 4 <head>\n\ 5 <script>\n\ 6 window.addEventListener("message", function(e) {\n\ 7 \n\ 8 sendData = null;\n\ 9 \n\ 10 req = JSON.parse(e.data);\n\ 11 var res = {\n\ 12 didFail: false,\n\ 13 events: [],\n\ 14 progressEvents: 0\n\ 15 };\n\ 16 \n\ 17 var xhr = new XMLHttpRequest();\n\ 18 for (type of ["load", "abort", "error", "loadstart", "loadend"]) {\n\ 19 xhr.addEventListener(type, function(e) {\n\ 20 res.events.push(e.type);\n\ 21 }, false);\n\ 22 }\n\ 23 xhr.addEventListener("readystatechange", function(e) {\n\ 24 res.events.push("rs" + xhr.readyState);\n\ 25 }, false);\n\ 26 xhr.addEventListener("progress", function(e) {\n\ 27 res.progressEvents++;\n\ 28 }, false);\n\ 29 if (req.uploadProgress) {\n\ 30 xhr.upload.addEventListener(req.uploadProgress, function(e) {\n\ 31 res.progressEvents++;\n\ 32 }, false);\n\ 33 }\n\ 34 xhr.onerror = function(e) {\n\ 35 res.didFail = true;\n\ 36 };\n\ 37 xhr.onloadend = function (event) {\n\ 38 res.status = xhr.status;\n\ 39 try {\n\ 40 res.statusText = xhr.statusText;\n\ 41 } catch (e) {\n\ 42 delete(res.statusText);\n\ 43 }\n\ 44 res.responseXML = xhr.responseXML ?\n\ 45 (new XMLSerializer()).serializeToString(xhr.responseXML) :\n\ 46 null;\n\ 47 res.responseText = xhr.responseText;\n\ 48 \n\ 49 res.responseHeaders = {};\n\ 50 for (responseHeader in req.responseHeaders) {\n\ 51 res.responseHeaders[responseHeader] =\n\ 52 xhr.getResponseHeader(responseHeader);\n\ 53 }\n\ 54 res.allResponseHeaders = {};\n\ 55 var splitHeaders = xhr.getAllResponseHeaders().split("\\r\\n");\n\ 56 for (var i = 0; i < splitHeaders.length; i++) {\n\ 57 var headerValuePair = splitHeaders[i].split(":");\n\ 58 if(headerValuePair[1] != null){\n\ 59 var headerName = trimString(headerValuePair[0]);\n\ 60 var headerValue = trimString(headerValuePair[1]); \n\ 61 res.allResponseHeaders[headerName] = headerValue;\n\ 62 }\n\ 63 }\n\ 64 post(e, res);\n\ 65 }\n\ 66 \n\ 67 if (req.withCred)\n\ 68 xhr.withCredentials = true;\n\ 69 if (req.body)\n\ 70 sendData = req.body;\n\ 71 \n\ 72 res.events.push("opening");\n\ 73 xhr.open(req.method, req.url, true);\n\ 74 \n\ 75 for (header in req.headers) {\n\ 76 xhr.setRequestHeader(header, req.headers[header]);\n\ 77 }\n\ 78 \n\ 79 res.events.push("sending");\n\ 80 xhr.send(sendData);\n\ 81 \n\ 82 }, false);\n\ 83 \n\ 84 function post(e, res) {\n\ 85 e.source.postMessage(JSON.stringify(res), "*");\n\ 86 }\n\ 87 function trimString(stringValue) {\n\ 88 return stringValue.replace("/^s+|s+$/g","");\n\ 89 };\n\ 90 \n\ 91 </script>\n\ 92 </head>\n\ 93 <body>\n\ 94 Inner page\n\ 95 </body>\n\ 96 </html>'; 97 98 function handleRequest(request, response) { 99 response.setStatusLine(null, 302, "Follow me"); 100 response.setHeader("Location", "data:text/html," + escape(data)); 101 response.setHeader("Content-Type", "text/plain"); 102 response.write("Follow that guy!"); 103 }