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