|
1 // |
|
2 // cleaner HTTP header test infrastructure |
|
3 // |
|
4 // tests bugs: 589292, [add more here: see hg log for definitive list] |
|
5 // |
|
6 // TO ADD NEW TESTS: |
|
7 // 1) Increment up 'lastTest' to new number (say, "99") |
|
8 // 2) Add new test 'handler99' and 'completeTest99' functions. |
|
9 // 3) If your test should fail the necko channel, set |
|
10 // test_flags[99] = CL_EXPECT_FAILURE. |
|
11 // |
|
12 // TO DEBUG JUST ONE TEST: temporarily change firstTest and lastTest to equal |
|
13 // the test # you're interested in. |
|
14 // |
|
15 // For tests that need duplicate copies of headers to be sent, see |
|
16 // test_duplicate_headers.js |
|
17 |
|
18 var firstTest = 1; // set to test of interest when debugging |
|
19 var lastTest = 4; // set to test of interest when debugging |
|
20 //////////////////////////////////////////////////////////////////////////////// |
|
21 |
|
22 // Note: sets Cc and Ci variables |
|
23 |
|
24 Cu.import("resource://testing-common/httpd.js"); |
|
25 |
|
26 XPCOMUtils.defineLazyGetter(this, "URL", function() { |
|
27 return "http://localhost:" + httpserver.identity.primaryPort; |
|
28 }); |
|
29 |
|
30 var httpserver = new HttpServer(); |
|
31 var index = 0; |
|
32 var nextTest = firstTest; |
|
33 var test_flags = new Array(); |
|
34 var testPathBase = "/test_headers"; |
|
35 |
|
36 function run_test() |
|
37 { |
|
38 httpserver.start(-1); |
|
39 |
|
40 do_test_pending(); |
|
41 run_test_number(nextTest); |
|
42 } |
|
43 |
|
44 function runNextTest() |
|
45 { |
|
46 if (nextTest == lastTest) { |
|
47 endTests(); |
|
48 return; |
|
49 } |
|
50 nextTest++; |
|
51 // Make sure test functions exist |
|
52 if (eval("handler" + nextTest) == undefined) |
|
53 do_throw("handler" + nextTest + " undefined!"); |
|
54 if (eval("completeTest" + nextTest) == undefined) |
|
55 do_throw("completeTest" + nextTest + " undefined!"); |
|
56 |
|
57 run_test_number(nextTest); |
|
58 } |
|
59 |
|
60 function run_test_number(num) |
|
61 { |
|
62 testPath = testPathBase + num; |
|
63 httpserver.registerPathHandler(testPath, eval("handler" + num)); |
|
64 |
|
65 var channel = setupChannel(testPath); |
|
66 flags = test_flags[num]; // OK if flags undefined for test |
|
67 channel.asyncOpen(new ChannelListener(eval("completeTest" + num), |
|
68 channel, flags), null); |
|
69 } |
|
70 |
|
71 function setupChannel(url) |
|
72 { |
|
73 var ios = Components.classes["@mozilla.org/network/io-service;1"]. |
|
74 getService(Ci.nsIIOService); |
|
75 var chan = ios.newChannel(URL + url, "", null); |
|
76 var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); |
|
77 return httpChan; |
|
78 } |
|
79 |
|
80 function endTests() |
|
81 { |
|
82 httpserver.stop(do_test_finished); |
|
83 } |
|
84 |
|
85 //////////////////////////////////////////////////////////////////////////////// |
|
86 // Test 1: test Content-Disposition channel attributes |
|
87 function handler1(metadata, response) |
|
88 { |
|
89 response.setStatusLine(metadata.httpVersion, 200, "OK"); |
|
90 response.setHeader("Content-Disposition", "attachment; filename=foo"); |
|
91 response.setHeader("Content-Type", "text/plain", false); |
|
92 var body = "foo"; |
|
93 } |
|
94 |
|
95 function completeTest1(request, data, ctx) |
|
96 { |
|
97 try { |
|
98 var chan = request.QueryInterface(Ci.nsIChannel); |
|
99 do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT); |
|
100 do_check_eq(chan.contentDispositionFilename, "foo"); |
|
101 do_check_eq(chan.contentDispositionHeader, "attachment; filename=foo"); |
|
102 } catch (ex) { |
|
103 do_throw("error parsing Content-Disposition: " + ex); |
|
104 } |
|
105 runNextTest(); |
|
106 } |
|
107 |
|
108 //////////////////////////////////////////////////////////////////////////////// |
|
109 // Test 2: no filename |
|
110 function handler2(metadata, response) |
|
111 { |
|
112 response.setStatusLine(metadata.httpVersion, 200, "OK"); |
|
113 response.setHeader("Content-Type", "text/plain", false); |
|
114 response.setHeader("Content-Disposition", "attachment"); |
|
115 var body = "foo"; |
|
116 response.bodyOutputStream.write(body, body.length); |
|
117 } |
|
118 |
|
119 function completeTest2(request, data, ctx) |
|
120 { |
|
121 try { |
|
122 var chan = request.QueryInterface(Ci.nsIChannel); |
|
123 do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT); |
|
124 do_check_eq(chan.contentDispositionHeader, "attachment"); |
|
125 |
|
126 filename = chan.contentDispositionFilename; // should barf |
|
127 do_throw("Should have failed getting Content-Disposition filename"); |
|
128 } catch (ex) { |
|
129 do_print("correctly ate exception"); |
|
130 } |
|
131 runNextTest(); |
|
132 } |
|
133 |
|
134 //////////////////////////////////////////////////////////////////////////////// |
|
135 // Test 3: filename missing |
|
136 function handler3(metadata, response) |
|
137 { |
|
138 response.setStatusLine(metadata.httpVersion, 200, "OK"); |
|
139 response.setHeader("Content-Type", "text/plain", false); |
|
140 response.setHeader("Content-Disposition", "attachment; filename="); |
|
141 var body = "foo"; |
|
142 response.bodyOutputStream.write(body, body.length); |
|
143 } |
|
144 |
|
145 function completeTest3(request, data, ctx) |
|
146 { |
|
147 try { |
|
148 var chan = request.QueryInterface(Ci.nsIChannel); |
|
149 do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT); |
|
150 do_check_eq(chan.contentDispositionHeader, "attachment; filename="); |
|
151 |
|
152 filename = chan.contentDispositionFilename; // should barf |
|
153 do_throw("Should have failed getting Content-Disposition filename"); |
|
154 } catch (ex) { |
|
155 do_print("correctly ate exception"); |
|
156 } |
|
157 runNextTest(); |
|
158 } |
|
159 |
|
160 //////////////////////////////////////////////////////////////////////////////// |
|
161 // Test 4: inline |
|
162 function handler4(metadata, response) |
|
163 { |
|
164 response.setStatusLine(metadata.httpVersion, 200, "OK"); |
|
165 response.setHeader("Content-Type", "text/plain", false); |
|
166 response.setHeader("Content-Disposition", "inline"); |
|
167 var body = "foo"; |
|
168 response.bodyOutputStream.write(body, body.length); |
|
169 } |
|
170 |
|
171 function completeTest4(request, data, ctx) |
|
172 { |
|
173 try { |
|
174 var chan = request.QueryInterface(Ci.nsIChannel); |
|
175 do_check_eq(chan.contentDisposition, chan.DISPOSITION_INLINE); |
|
176 do_check_eq(chan.contentDispositionHeader, "inline"); |
|
177 |
|
178 filename = chan.contentDispositionFilename; // should barf |
|
179 do_throw("Should have failed getting Content-Disposition filename"); |
|
180 } catch (ex) { |
|
181 do_print("correctly ate exception"); |
|
182 } |
|
183 runNextTest(); |
|
184 } |