|
1 /* |
|
2 * Test Chunked-Encoded response parsing. |
|
3 */ |
|
4 |
|
5 //////////////////////////////////////////////////////////////////////////////// |
|
6 // Test infrastructure |
|
7 |
|
8 Cu.import("resource://testing-common/httpd.js"); |
|
9 |
|
10 XPCOMUtils.defineLazyGetter(this, "URL", function() { |
|
11 return "http://localhost:" + httpserver.identity.primaryPort; |
|
12 }); |
|
13 |
|
14 var httpserver = new HttpServer(); |
|
15 var index = 0; |
|
16 var test_flags = new Array(); |
|
17 var testPathBase = "/chunked_hdrs"; |
|
18 |
|
19 function run_test() |
|
20 { |
|
21 httpserver.start(-1); |
|
22 |
|
23 do_test_pending(); |
|
24 run_test_number(1); |
|
25 } |
|
26 |
|
27 function run_test_number(num) |
|
28 { |
|
29 testPath = testPathBase + num; |
|
30 httpserver.registerPathHandler(testPath, eval("handler" + num)); |
|
31 |
|
32 var channel = setupChannel(testPath); |
|
33 flags = test_flags[num]; // OK if flags undefined for test |
|
34 channel.asyncOpen(new ChannelListener(eval("completeTest" + num), |
|
35 channel, flags), null); |
|
36 } |
|
37 |
|
38 function setupChannel(url) |
|
39 { |
|
40 var ios = Components.classes["@mozilla.org/network/io-service;1"]. |
|
41 getService(Ci.nsIIOService); |
|
42 var chan = ios.newChannel(URL + url, "", null); |
|
43 var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); |
|
44 return httpChan; |
|
45 } |
|
46 |
|
47 function endTests() |
|
48 { |
|
49 httpserver.stop(do_test_finished); |
|
50 } |
|
51 |
|
52 //////////////////////////////////////////////////////////////////////////////// |
|
53 // Test 1: FAIL because of overflowed chunked size. The parser uses long so |
|
54 // the test case uses >64bit to fail on all platforms. |
|
55 test_flags[1] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL; |
|
56 |
|
57 function handler1(metadata, response) |
|
58 { |
|
59 var body = "12345678123456789\r\ndata never reached"; |
|
60 |
|
61 response.seizePower(); |
|
62 response.write("HTTP/1.1 200 OK\r\n"); |
|
63 response.write("Content-Type: text/plain\r\n"); |
|
64 response.write("Transfer-Encoding: chunked\r\n"); |
|
65 response.write("\r\n"); |
|
66 response.write(body); |
|
67 response.finish(); |
|
68 } |
|
69 |
|
70 function completeTest1(request, data, ctx) |
|
71 { |
|
72 do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED); |
|
73 |
|
74 run_test_number(2); |
|
75 } |
|
76 |
|
77 //////////////////////////////////////////////////////////////////////////////// |
|
78 // Test 2: FAIL because of non-hex in chunked length |
|
79 |
|
80 test_flags[2] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL; |
|
81 |
|
82 function handler2(metadata, response) |
|
83 { |
|
84 var body = "junkintheway 123\r\ndata never reached"; |
|
85 |
|
86 response.seizePower(); |
|
87 response.write("HTTP/1.1 200 OK\r\n"); |
|
88 response.write("Content-Type: text/plain\r\n"); |
|
89 response.write("Transfer-Encoding: chunked\r\n"); |
|
90 response.write("\r\n"); |
|
91 response.write(body); |
|
92 response.finish(); |
|
93 } |
|
94 |
|
95 function completeTest2(request, data, ctx) |
|
96 { |
|
97 do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED); |
|
98 run_test_number(3); |
|
99 } |
|
100 |
|
101 //////////////////////////////////////////////////////////////////////////////// |
|
102 // Test 3: OK in spite of non-hex digits after size in the length field |
|
103 |
|
104 test_flags[3] = CL_ALLOW_UNKNOWN_CL; |
|
105 |
|
106 function handler3(metadata, response) |
|
107 { |
|
108 var body = "c junkafter\r\ndata reached"; |
|
109 |
|
110 response.seizePower(); |
|
111 response.write("HTTP/1.1 200 OK\r\n"); |
|
112 response.write("Content-Type: text/plain\r\n"); |
|
113 response.write("Transfer-Encoding: chunked\r\n"); |
|
114 response.write("\r\n"); |
|
115 response.write(body); |
|
116 response.finish(); |
|
117 } |
|
118 |
|
119 function completeTest3(request, data, ctx) |
|
120 { |
|
121 do_check_eq(request.status, 0); |
|
122 run_test_number(4); |
|
123 } |
|
124 |
|
125 //////////////////////////////////////////////////////////////////////////////// |
|
126 // Test 4: Verify a fully compliant chunked response. |
|
127 |
|
128 test_flags[4] = CL_ALLOW_UNKNOWN_CL; |
|
129 |
|
130 function handler4(metadata, response) |
|
131 { |
|
132 var body = "c\r\ndata reached\r\n\0\r\n\r\n"; |
|
133 |
|
134 response.seizePower(); |
|
135 response.write("HTTP/1.1 200 OK\r\n"); |
|
136 response.write("Content-Type: text/plain\r\n"); |
|
137 response.write("Transfer-Encoding: chunked\r\n"); |
|
138 response.write("\r\n"); |
|
139 response.write(body); |
|
140 response.finish(); |
|
141 } |
|
142 |
|
143 function completeTest4(request, data, ctx) |
|
144 { |
|
145 do_check_eq(request.status, 0); |
|
146 run_test_number(5); |
|
147 } |
|
148 |
|
149 //////////////////////////////////////////////////////////////////////////////// |
|
150 // Test 5: A chunk size larger than 32 bit but smaller than 64bit also fails |
|
151 // This is probabaly subject to get improved at some point. |
|
152 |
|
153 test_flags[5] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL; |
|
154 |
|
155 function handler5(metadata, response) |
|
156 { |
|
157 var body = "123456781\r\ndata never reached"; |
|
158 |
|
159 response.seizePower(); |
|
160 response.write("HTTP/1.1 200 OK\r\n"); |
|
161 response.write("Content-Type: text/plain\r\n"); |
|
162 response.write("Transfer-Encoding: chunked\r\n"); |
|
163 response.write("\r\n"); |
|
164 response.write(body); |
|
165 response.finish(); |
|
166 } |
|
167 |
|
168 function completeTest5(request, data, ctx) |
|
169 { |
|
170 do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED); |
|
171 endTests(); |
|
172 // run_test_number(6); |
|
173 } |