Branch data Line data Source code
1 [ + ]: 2 : import assert from 'node:assert/strict';
2 : 2 : import { XMLHttpRequest } from '../../../lib/whatwg-xhr.js';
3 : 2 : import { FormData } from '../../../lib/whatwg-xhr.js';
4 : 2 :
5 [ + ]: 2 : export default (activeURL) => {
6 : 1 :
7 : 1 : request(
8 [ + ]: 1 : function _String() { return ""; },
9 : 1 : {"Content-Type": ""},
10 : 1 : "",
11 : 1 : 'setRequestHeader("") sends a blank string'
12 : 1 : );
13 : 1 : request(
14 [ + ]: 1 : function _String() { return ""; },
15 : 1 : {"Content-Type": " "},
16 : 1 : "",
17 : 1 : 'setRequestHeader(" ") sends the string " "'
18 : 1 : );
19 : 1 : request(
20 [ + ]: 1 : function _String() { return ""; },
21 : 1 : {"Content-Type": null},
22 : 1 : "null",
23 : 1 : 'setRequestHeader(null) sends the string "null"'
24 : 1 : );
25 : 1 : request(
26 [ + ]: 1 : function _String() { return ""; },
27 : 1 : {"Content-Type": undefined},
28 : 1 : "undefined",
29 : 1 : 'setRequestHeader(undefined) sends the string "undefined"'
30 : 1 : );
31 : 1 : request(
32 [ + ]: 1 : function _String() { return "test"; },
33 : 1 : {},
34 : 1 : "text/plain;charset=UTF-8",
35 : 1 : 'String request has correct default Content-Type of "text/plain;charset=UTF-8"'
36 : 1 : );
37 : 1 : request(
38 [ + ]: 1 : function _String() { return "test()"; },
39 : 1 : {"Content-Type": "text/javascript;charset=ASCII"},
40 : 1 : "text/javascript;charset=UTF-8",
41 : 1 : "String request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
42 : 1 : );
43 : 1 : /*
44 : 1 : request(
45 : 1 : function _XMLDocument() { return new DOMParser().parseFromString("<xml/>", "application/xml"); },
46 : 1 : {"Content-Type": ""},
47 : 1 : "",
48 : 1 : 'XML Document request respects setRequestHeader("")'
49 : 1 : );
50 : 1 : request(
51 : 1 : function _XMLDocument() { return new DOMParser().parseFromString("<xml/>", "application/xml"); },
52 : 1 : {},
53 : 1 : "application/xml;charset=UTF-8",
54 : 1 : 'XML Document request has correct default Content-Type of "application/xml;charset=UTF-8"'
55 : 1 : );
56 : 1 : request(
57 : 1 : function _XMLDocument() { return new DOMParser().parseFromString("<xml/>", "application/xml"); },
58 : 1 : {"Content-Type": "application/xhtml+xml;charset=ASCII"},
59 : 1 : "application/xhtml+xml;charset=UTF-8",
60 : 1 : "XML Document request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
61 : 1 : );
62 : 1 : request(
63 : 1 : function _HTMLDocument() { return new DOMParser().parseFromString("<html></html>", "text/html"); },
64 : 1 : {"Content-Type": ""},
65 : 1 : "",
66 : 1 : 'HTML Document request respects setRequestHeader("")'
67 : 1 : );
68 : 1 : request(
69 : 1 : function _HTMLDocument() { return new DOMParser().parseFromString("<html></html>", "text/html"); },
70 : 1 : {},
71 : 1 : "text/html;charset=UTF-8",
72 : 1 : 'HTML Document request has correct default Content-Type of "text/html;charset=UTF-8"'
73 : 1 : );
74 : 1 : request(
75 : 1 : function _HTMLDocument() { return new DOMParser().parseFromString("<html></html>", "text/html"); },
76 : 1 : {"Content-Type": "text/html+junk;charset=ASCII"},
77 : 1 : "text/html+junk;charset=UTF-8",
78 : 1 : "HTML Document request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
79 : 1 : );
80 : 1 : */
81 : 1 : request(
82 [ + ]: 1 : function _Blob() { return new Blob(["test"]); },
83 : 1 : {"Content-Type": ""},
84 : 1 : "",
85 : 1 : 'Blob request respects setRequestHeader("") to be specified'
86 : 1 : );
87 : 1 : request(
88 [ + ]: 1 : function _Blob() { return new Blob(["test"]); },
89 : 1 : {},
90 : 1 : undefined,
91 : 1 : "Blob request with unset type sends no Content-Type without setRequestHeader() call"
92 : 1 : );
93 : 1 : request(
94 [ + ]: 1 : function _Blob() { return new Blob(["test"]); },
95 : 1 : {"Content-Type": "application/xml;charset=ASCII"},
96 : 1 : "application/xml;charset=ASCII",
97 : 1 : "Blob request with unset type keeps setRequestHeader() Content-Type and charset"
98 : 1 : );
99 : 1 : request(
100 [ + ]: 1 : function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=ASCII"}); },
101 : 1 : {"Content-Type": ""},
102 : 1 : "",
103 : 1 : 'Blob request with set type respects setRequestHeader("") to be specified'
104 : 1 : );
105 : 1 : request(
106 [ + ]: 1 : function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=ASCII"}); },
107 : 1 : {},
108 : 1 : "application/xml;charset=ascii", // new Blob lowercases the type argument
109 : 1 : "Blob request with set type uses that it for Content-Type unless setRequestHeader()"
110 : 1 : );
111 : 1 : request(
112 [ + ]: 1 : function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=UTF8"}); },
113 : 1 : {"Content-Type": "application/xml+junk;charset=ASCII"},
114 : 1 : "application/xml+junk;charset=ASCII",
115 : 1 : "Blob request with set type keeps setRequestHeader() Content-Type and charset"
116 : 1 : );
117 : 1 : request(
118 [ + ]: 1 : function _ArrayBuffer() { return new ArrayBuffer(10); },
119 : 1 : {"Content-Type": ""},
120 : 1 : "",
121 : 1 : 'ArrayBuffer request respects setRequestHeader("")'
122 : 1 : );
123 : 1 : request(
124 [ + ]: 1 : function _ArrayBuffer() { return new ArrayBuffer(10); },
125 : 1 : {},
126 : 1 : undefined,
127 : 1 : "ArrayBuffer request sends no Content-Type without setRequestHeader() call"
128 : 1 : );
129 : 1 : request(
130 [ + ]: 1 : function _ArrayBuffer() { return new ArrayBuffer(10); },
131 : 1 : {"Content-Type": "application/xml;charset=ASCII"},
132 : 1 : "application/xml;charset=ASCII",
133 : 1 : "ArrayBuffer request keeps setRequestHeader() Content-Type and charset"
134 : 1 : );
135 : 1 : request(
136 [ + ]: 1 : function _Uint8Array() { return new Uint8Array(new ArrayBuffer(10)); },
137 : 1 : {"Content-Type": ""},
138 : 1 : "",
139 : 1 : 'ArrayBufferView request respects setRequestHeader("")'
140 : 1 : );
141 : 1 : request(
142 [ + ]: 1 : function _Uint8Array() { return new Uint8Array(new ArrayBuffer(10)); },
143 : 1 : {},
144 : 1 : undefined,
145 : 1 : "ArrayBufferView request sends no Content-Type without setRequestHeader() call"
146 : 1 : );
147 : 1 : request(
148 [ + ]: 1 : function _Uint8Array() { return new Uint8Array(new ArrayBuffer(10)); },
149 : 1 : {"Content-Type": "application/xml;charset=ASCII"},
150 : 1 : "application/xml;charset=ASCII",
151 : 1 : "ArrayBufferView request keeps setRequestHeader() Content-Type and charset"
152 : 1 : );
153 : 1 : /*
154 : 1 : request(
155 : 1 : function _FormData() { return new FormData(); },
156 : 1 : {"Content-Type": ""},
157 : 1 : "",
158 : 1 : 'FormData request respects setRequestHeader("")'
159 : 1 : );
160 : 1 : request(
161 : 1 : function _FormData() { return new FormData(); },
162 : 1 : {},
163 : 1 : /multipart\/form-data; boundary=(.*)/,
164 : 1 : 'FormData request has correct default Content-Type of "multipart\/form-data; boundary=_"'
165 : 1 : );
166 : 1 : request(
167 : 1 : function _FormData() { return new FormData(); },
168 : 1 : {"Content-Type": "application/xml;charset=ASCII"},
169 : 1 : "application/xml;charset=ASCII",
170 : 1 : "FormData request keeps setRequestHeader() Content-Type and charset"
171 : 1 : );
172 : 1 : */
173 : 1 : request(
174 [ + ]: 1 : function _URLSearchParams() { return new URLSearchParams("q=testQ&topic=testTopic") },
175 : 1 : {"Content-Type": ""},
176 : 1 : "",
177 : 1 : 'URLSearchParams respects setRequestHeader("")'
178 : 1 : );
179 : 1 : request(
180 [ + ]: 1 : function _URLSearchParams() { return new URLSearchParams("q=testQ&topic=testTopic") },
181 : 1 : {},
182 : 1 : "application/x-www-form-urlencoded;charset=UTF-8",
183 : 1 : 'URLSearchParams request has correct default Content-Type of "application/x-www-form-urlencoded;charset=UTF-8"'
184 : 1 : );
185 : 1 : request(
186 [ + ]: 1 : function _URLSearchParams() { return new URLSearchParams("q=testQ&topic=testTopic") },
187 : 1 : {"Content-Type": "application/xml;charset=ASCII"},
188 : 1 : "application/xml;charset=UTF-8",
189 : 1 : "URLSearchParams request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
190 : 1 :
191 : 1 : // the default Content-Type for URLSearchParams has a charset specified (utf-8) in
192 : 1 : // https://fetch.spec.whatwg.org/#bodyinit, so the user's must be changed to match it
193 : 1 : // as per https://xhr.spec.whatwg.org/#the-send%28%29-method step 4.
194 : 1 : );
195 : 1 :
196 [ + ]: 1 : function request(inputGenerator, headersToSend, expectedType, title){
197 : 21 :
198 : 21 : const toSend = inputGenerator();
199 : 21 :
200 : 21 : const xhr = new XMLHttpRequest();
201 : 21 :
202 : 21 : xhr.open('POST', `${activeURL}/inspect-headers.py?filter_name=Content-Type`, false);
203 : 21 :
204 [ + ]: 21 : for(let header in headersToSend){
205 : 15 : if(headersToSend.hasOwnProperty(header)){
206 : 15 : xhr.setRequestHeader(header, headersToSend[header]);
207 : 15 : }
208 : 15 : }
209 : 21 :
210 : 21 : xhr.send(toSend);
211 : 21 :
212 : 21 : const actual = xhr.responseText;
213 : 21 :
214 [ + ][ + ]: 21 : if(expectedType === undefined || expectedType === null){
215 : 3 : assert.strictEqual(actual, '');
216 [ + ]: 3 : }
217 : 18 : else
218 [ - ]: 18 : if(expectedType instanceof RegExp){
219 : 0 : assert(expectedType.test(equal));
220 : 0 : }
221 : 18 : else{
222 : 18 : assert.strictEqual(actual, `Content-Type: ${expectedType}\n`);
223 : 18 : }
224 : 21 : }
225 : 1 : }
226 : 2 :
227 : 2 : /*
228 : 2 : * setrequestheader-content-type.htm
229 : 2 : *
230 : 2 :
231 : 2 : <!DOCTYPE html>
232 : 2 : <html>
233 : 2 : <head>
234 : 2 : <title>XMLHttpRequest: setRequestHeader() - Content-Type header</title>
235 : 2 : <meta name="timeout" content="long">
236 : 2 : <script src="/resources/testharness.js"></script>
237 : 2 : <script src="/resources/testharnessreport.js"></script>
238 : 2 : <link rel="help" href="https://xhr.spec.whatwg.org/#the-setrequestheader()-method">
239 : 2 : </head>
240 : 2 : <body>
241 : 2 : <div id="log"></div>
242 : 2 : <script>
243 : 2 : function request(inputGenerator, headersToSend, expectedType, title) {
244 : 2 : test(function() {
245 : 2 : const toSend = inputGenerator(),
246 : 2 : client = new XMLHttpRequest()
247 : 2 : client.open("POST", "resources/inspect-headers.py?filter_name=Content-Type", false)
248 : 2 : for(header in headersToSend) {
249 : 2 : if (headersToSend.hasOwnProperty(header)) {
250 : 2 : client.setRequestHeader(header, headersToSend[header]);
251 : 2 : }
252 : 2 : }
253 : 2 : client.send(toSend)
254 : 2 :
255 : 2 : const actual = client.responseText
256 : 2 : if (expectedType === undefined || expectedType === null) {
257 : 2 : assert_equals(actual, "");
258 : 2 : } else if (expectedType instanceof RegExp) {
259 : 2 : assert_regexp_match(actual, expectedType);
260 : 2 : } else {
261 : 2 : assert_equals(actual, "Content-Type: " + expectedType + "\n");
262 : 2 : }
263 : 2 : }, title)
264 : 2 : }
265 : 2 : request(
266 : 2 : function _String() { return ""; },
267 : 2 : {"Content-Type": ""},
268 : 2 : "",
269 : 2 : 'setRequestHeader("") sends a blank string'
270 : 2 : )
271 : 2 : request(
272 : 2 : function _String() { return ""; },
273 : 2 : {"Content-Type": " "},
274 : 2 : "",
275 : 2 : 'setRequestHeader(" ") sends the string " "'
276 : 2 : )
277 : 2 : request(
278 : 2 : function _String() { return ""; },
279 : 2 : {"Content-Type": null},
280 : 2 : "null",
281 : 2 : 'setRequestHeader(null) sends the string "null"'
282 : 2 : )
283 : 2 : request(
284 : 2 : function _String() { return ""; },
285 : 2 : {"Content-Type": undefined},
286 : 2 : "undefined",
287 : 2 : 'setRequestHeader(undefined) sends the string "undefined"'
288 : 2 : )
289 : 2 : request(
290 : 2 : function _String() { return "test"; },
291 : 2 : {},
292 : 2 : "text/plain;charset=UTF-8",
293 : 2 : 'String request has correct default Content-Type of "text/plain;charset=UTF-8"'
294 : 2 : )
295 : 2 : request(
296 : 2 : function _String() { return "test()"; },
297 : 2 : {"Content-Type": "text/javascript;charset=ASCII"},
298 : 2 : "text/javascript;charset=UTF-8",
299 : 2 : "String request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
300 : 2 : )
301 : 2 : request(
302 : 2 : function _XMLDocument() { return new DOMParser().parseFromString("<xml/>", "application/xml"); },
303 : 2 : {"Content-Type": ""},
304 : 2 : "",
305 : 2 : 'XML Document request respects setRequestHeader("")'
306 : 2 : )
307 : 2 : request(
308 : 2 : function _XMLDocument() { return new DOMParser().parseFromString("<xml/>", "application/xml"); },
309 : 2 : {},
310 : 2 : "application/xml;charset=UTF-8",
311 : 2 : 'XML Document request has correct default Content-Type of "application/xml;charset=UTF-8"'
312 : 2 : )
313 : 2 : request(
314 : 2 : function _XMLDocument() { return new DOMParser().parseFromString("<xml/>", "application/xml"); },
315 : 2 : {"Content-Type": "application/xhtml+xml;charset=ASCII"},
316 : 2 : "application/xhtml+xml;charset=UTF-8",
317 : 2 : "XML Document request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
318 : 2 : )
319 : 2 : request(
320 : 2 : function _HTMLDocument() { return new DOMParser().parseFromString("<html></html>", "text/html"); },
321 : 2 : {"Content-Type": ""},
322 : 2 : "",
323 : 2 : 'HTML Document request respects setRequestHeader("")'
324 : 2 : )
325 : 2 : request(
326 : 2 : function _HTMLDocument() { return new DOMParser().parseFromString("<html></html>", "text/html"); },
327 : 2 : {},
328 : 2 : "text/html;charset=UTF-8",
329 : 2 : 'HTML Document request has correct default Content-Type of "text/html;charset=UTF-8"'
330 : 2 : )
331 : 2 : request(
332 : 2 : function _HTMLDocument() { return new DOMParser().parseFromString("<html></html>", "text/html"); },
333 : 2 : {"Content-Type": "text/html+junk;charset=ASCII"},
334 : 2 : "text/html+junk;charset=UTF-8",
335 : 2 : "HTML Document request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
336 : 2 : )
337 : 2 : request(
338 : 2 : function _Blob() { return new Blob(["test"]); },
339 : 2 : {"Content-Type": ""},
340 : 2 : "",
341 : 2 : 'Blob request respects setRequestHeader("") to be specified'
342 : 2 : )
343 : 2 : request(
344 : 2 : function _Blob() { return new Blob(["test"]); },
345 : 2 : {},
346 : 2 : undefined,
347 : 2 : "Blob request with unset type sends no Content-Type without setRequestHeader() call"
348 : 2 : )
349 : 2 : request(
350 : 2 : function _Blob() { return new Blob(["test"]); },
351 : 2 : {"Content-Type": "application/xml;charset=ASCII"},
352 : 2 : "application/xml;charset=ASCII",
353 : 2 : "Blob request with unset type keeps setRequestHeader() Content-Type and charset"
354 : 2 : )
355 : 2 : request(
356 : 2 : function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=ASCII"}); },
357 : 2 : {"Content-Type": ""},
358 : 2 : "",
359 : 2 : 'Blob request with set type respects setRequestHeader("") to be specified'
360 : 2 : )
361 : 2 : request(
362 : 2 : function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=ASCII"}); },
363 : 2 : {},
364 : 2 : "application/xml;charset=ascii", // new Blob lowercases the type argument
365 : 2 : "Blob request with set type uses that it for Content-Type unless setRequestHeader()"
366 : 2 : )
367 : 2 : request(
368 : 2 : function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=UTF8"}); },
369 : 2 : {"Content-Type": "application/xml+junk;charset=ASCII"},
370 : 2 : "application/xml+junk;charset=ASCII",
371 : 2 : "Blob request with set type keeps setRequestHeader() Content-Type and charset"
372 : 2 : )
373 : 2 : request(
374 : 2 : function _ArrayBuffer() { return new ArrayBuffer(10); },
375 : 2 : {"Content-Type": ""},
376 : 2 : "",
377 : 2 : 'ArrayBuffer request respects setRequestHeader("")'
378 : 2 : )
379 : 2 : request(
380 : 2 : function _ArrayBuffer() { return new ArrayBuffer(10); },
381 : 2 : {},
382 : 2 : undefined,
383 : 2 : "ArrayBuffer request sends no Content-Type without setRequestHeader() call"
384 : 2 : )
385 : 2 : request(
386 : 2 : function _ArrayBuffer() { return new ArrayBuffer(10); },
387 : 2 : {"Content-Type": "application/xml;charset=ASCII"},
388 : 2 : "application/xml;charset=ASCII",
389 : 2 : "ArrayBuffer request keeps setRequestHeader() Content-Type and charset"
390 : 2 : )
391 : 2 : request(
392 : 2 : function _Uint8Array() { return new Uint8Array(new ArrayBuffer(10)); },
393 : 2 : {"Content-Type": ""},
394 : 2 : "",
395 : 2 : 'ArrayBufferView request respects setRequestHeader("")'
396 : 2 : )
397 : 2 : request(
398 : 2 : function _Uint8Array() { return new Uint8Array(new ArrayBuffer(10)); },
399 : 2 : {},
400 : 2 : undefined,
401 : 2 : "ArrayBufferView request sends no Content-Type without setRequestHeader() call"
402 : 2 : )
403 : 2 : request(
404 : 2 : function _Uint8Array() { return new Uint8Array(new ArrayBuffer(10)); },
405 : 2 : {"Content-Type": "application/xml;charset=ASCII"},
406 : 2 : "application/xml;charset=ASCII",
407 : 2 : "ArrayBufferView request keeps setRequestHeader() Content-Type and charset"
408 : 2 : )
409 : 2 : request(
410 : 2 : function _FormData() { return new FormData(); },
411 : 2 : {"Content-Type": ""},
412 : 2 : "",
413 : 2 : 'FormData request respects setRequestHeader("")'
414 : 2 : )
415 : 2 : request(
416 : 2 : function _FormData() { return new FormData(); },
417 : 2 : {},
418 : 2 : /multipart\/form-data; boundary=(.*)/,
419 : 2 : 'FormData request has correct default Content-Type of "multipart\/form-data; boundary=_"'
420 : 2 : )
421 : 2 : request(
422 : 2 : function _FormData() { return new FormData(); },
423 : 2 : {"Content-Type": "application/xml;charset=ASCII"},
424 : 2 : "application/xml;charset=ASCII",
425 : 2 : "FormData request keeps setRequestHeader() Content-Type and charset"
426 : 2 : )
427 : 2 : request(
428 : 2 : function _URLSearchParams() { return new URLSearchParams("q=testQ&topic=testTopic") },
429 : 2 : {"Content-Type": ""},
430 : 2 : "",
431 : 2 : 'URLSearchParams respects setRequestHeader("")'
432 : 2 : )
433 : 2 : request(
434 : 2 : function _URLSearchParams() { return new URLSearchParams("q=testQ&topic=testTopic") },
435 : 2 : {},
436 : 2 : "application/x-www-form-urlencoded;charset=UTF-8",
437 : 2 : 'URLSearchParams request has correct default Content-Type of "application/x-www-form-urlencoded;charset=UTF-8"'
438 : 2 : )
439 : 2 : request(
440 : 2 : function _URLSearchParams() { return new URLSearchParams("q=testQ&topic=testTopic") },
441 : 2 : {"Content-Type": "application/xml;charset=ASCII"},
442 : 2 : "application/xml;charset=UTF-8",
443 : 2 : "URLSearchParams request keeps setRequestHeader() Content-Type, with charset adjusted to UTF-8"
444 : 2 : // the default Content-Type for URLSearchParams has a charset specified (utf-8) in
445 : 2 : // https://fetch.spec.whatwg.org/#bodyinit, so the user's must be changed to match it
446 : 2 : // as per https://xhr.spec.whatwg.org/#the-send%28%29-method step 4.
447 : 2 : )
448 : 2 : </script>
449 : 2 : </body>
450 : 2 : </html>
451 : 2 :
452 : 2 : *
453 : 2 : * setrequestheader-content-type.htm
454 : 2 : */
|