Skip to content

Commit ed32418

Browse files
KhafraDevronag
authored andcommitted
wpt: add request-consume.any.js and request-headers.any.js
1 parent cc58f6e commit ed32418

File tree

3 files changed

+372
-0
lines changed

3 files changed

+372
-0
lines changed

test/wpt/status/fetch.status.json

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,57 @@
7171
"fail": [
7272
"Empty string integrity for opaque response"
7373
]
74+
},
75+
"request-headers.any.js": {
76+
"fail": [
77+
"Adding invalid request header \"Accept-Charset: KO\"",
78+
"Adding invalid request header \"accept-charset: KO\"",
79+
"Adding invalid request header \"ACCEPT-ENCODING: KO\"",
80+
"Adding invalid request header \"Accept-Encoding: KO\"",
81+
"Adding invalid request header \"Access-Control-Request-Headers: KO\"",
82+
"Adding invalid request header \"Access-Control-Request-Method: KO\"",
83+
"Adding invalid request header \"Connection: KO\"",
84+
"Adding invalid request header \"Content-Length: KO\"",
85+
"Adding invalid request header \"Cookie: KO\"",
86+
"Adding invalid request header \"Cookie2: KO\"",
87+
"Adding invalid request header \"Date: KO\"",
88+
"Adding invalid request header \"DNT: KO\"",
89+
"Adding invalid request header \"Expect: KO\"",
90+
"Adding invalid request header \"Host: KO\"",
91+
"Adding invalid request header \"Keep-Alive: KO\"",
92+
"Adding invalid request header \"Origin: KO\"",
93+
"Adding invalid request header \"Referer: KO\"",
94+
"Adding invalid request header \"Set-Cookie: KO\"",
95+
"Adding invalid request header \"TE: KO\"",
96+
"Adding invalid request header \"Trailer: KO\"",
97+
"Adding invalid request header \"Transfer-Encoding: KO\"",
98+
"Adding invalid request header \"Upgrade: KO\"",
99+
"Adding invalid request header \"Via: KO\"",
100+
"Adding invalid request header \"Proxy-: KO\"",
101+
"Adding invalid request header \"proxy-a: KO\"",
102+
"Adding invalid request header \"Sec-: KO\"",
103+
"Adding invalid request header \"sec-b: KO\"",
104+
"Adding invalid no-cors request header \"Content-Type: KO\"",
105+
"Adding invalid no-cors request header \"Potato: KO\"",
106+
"Adding invalid no-cors request header \"proxy: KO\"",
107+
"Adding invalid no-cors request header \"proxya: KO\"",
108+
"Adding invalid no-cors request header \"sec: KO\"",
109+
"Adding invalid no-cors request header \"secb: KO\"",
110+
"Check that request constructor is filtering headers provided as init parameter",
111+
"Check that no-cors request constructor is filtering headers provided as init parameter",
112+
"Check that no-cors request constructor is filtering headers provided as part of request parameter"
113+
]
114+
},
115+
"request-consume.any.js": {
116+
"fail": [
117+
"Consume String request's body as blob",
118+
"Consume ArrayBuffer request's body as blob",
119+
"Consume Uint8Array request's body as blob",
120+
"Consume Int8Array request's body as blob",
121+
"Consume Float32Array request's body as blob",
122+
"Consume DataView request's body as blob",
123+
"Consume blob response's body as blob",
124+
"Consume blob response's body as blob (empty blob as input)"
125+
]
74126
}
75127
}
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
// META: global=window,worker
2+
// META: title=Request consume
3+
// META: script=../resources/utils.js
4+
5+
function checkBodyText(request, expectedBody) {
6+
return request.text().then(function(bodyAsText) {
7+
assert_equals(bodyAsText, expectedBody, "Retrieve and verify request's body");
8+
assert_true(request.bodyUsed, "body as text: bodyUsed turned true");
9+
});
10+
}
11+
12+
function checkBodyBlob(request, expectedBody, checkContentType) {
13+
return request.blob().then(function(bodyAsBlob) {
14+
if (checkContentType)
15+
assert_equals(bodyAsBlob.type, "text/plain", "Blob body type should be computed from the request Content-Type");
16+
17+
var promise = new Promise(function (resolve, reject) {
18+
var reader = new FileReader();
19+
reader.onload = function(evt) {
20+
resolve(reader.result)
21+
};
22+
reader.onerror = function() {
23+
reject("Blob's reader failed");
24+
};
25+
reader.readAsText(bodyAsBlob);
26+
});
27+
return promise.then(function(body) {
28+
assert_equals(body, expectedBody, "Retrieve and verify request's body");
29+
assert_true(request.bodyUsed, "body as blob: bodyUsed turned true");
30+
});
31+
});
32+
}
33+
34+
function checkBodyArrayBuffer(request, expectedBody) {
35+
return request.arrayBuffer().then(function(bodyAsArrayBuffer) {
36+
validateBufferFromString(bodyAsArrayBuffer, expectedBody, "Retrieve and verify request's body");
37+
assert_true(request.bodyUsed, "body as arrayBuffer: bodyUsed turned true");
38+
});
39+
}
40+
41+
function checkBodyJSON(request, expectedBody) {
42+
return request.json().then(function(bodyAsJSON) {
43+
var strBody = JSON.stringify(bodyAsJSON)
44+
assert_equals(strBody, expectedBody, "Retrieve and verify request's body");
45+
assert_true(request.bodyUsed, "body as json: bodyUsed turned true");
46+
});
47+
}
48+
49+
function checkBodyFormData(request, expectedBody) {
50+
return request.formData().then(function(bodyAsFormData) {
51+
assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
52+
assert_true(request.bodyUsed, "body as formData: bodyUsed turned true");
53+
});
54+
}
55+
56+
function checkRequestBody(body, expected, bodyType) {
57+
promise_test(function(test) {
58+
var request = new Request("", {"method": "POST", "body": body, "headers": [["Content-Type", "text/PLAIN"]] });
59+
assert_false(request.bodyUsed, "bodyUsed is false at init");
60+
return checkBodyText(request, expected);
61+
}, "Consume " + bodyType + " request's body as text");
62+
promise_test(function(test) {
63+
var request = new Request("", {"method": "POST", "body": body });
64+
assert_false(request.bodyUsed, "bodyUsed is false at init");
65+
return checkBodyBlob(request, expected);
66+
}, "Consume " + bodyType + " request's body as blob");
67+
promise_test(function(test) {
68+
var request = new Request("", {"method": "POST", "body": body });
69+
assert_false(request.bodyUsed, "bodyUsed is false at init");
70+
return checkBodyArrayBuffer(request, expected);
71+
}, "Consume " + bodyType + " request's body as arrayBuffer");
72+
promise_test(function(test) {
73+
var request = new Request("", {"method": "POST", "body": body });
74+
assert_false(request.bodyUsed, "bodyUsed is false at init");
75+
return checkBodyJSON(request, expected);
76+
}, "Consume " + bodyType + " request's body as JSON");
77+
}
78+
79+
var textData = JSON.stringify("This is response's body");
80+
var blob = new Blob([textData], { "type" : "text/plain" });
81+
82+
checkRequestBody(textData, textData, "String");
83+
84+
var string = "\"123456\"";
85+
function getArrayBuffer() {
86+
var arrayBuffer = new ArrayBuffer(8);
87+
var int8Array = new Int8Array(arrayBuffer);
88+
for (var cptr = 0; cptr < 8; cptr++)
89+
int8Array[cptr] = string.charCodeAt(cptr);
90+
return arrayBuffer;
91+
}
92+
93+
function getArrayBufferWithZeros() {
94+
var arrayBuffer = new ArrayBuffer(10);
95+
var int8Array = new Int8Array(arrayBuffer);
96+
for (var cptr = 0; cptr < 8; cptr++)
97+
int8Array[cptr + 1] = string.charCodeAt(cptr);
98+
return arrayBuffer;
99+
}
100+
101+
checkRequestBody(getArrayBuffer(), string, "ArrayBuffer");
102+
checkRequestBody(new Uint8Array(getArrayBuffer()), string, "Uint8Array");
103+
checkRequestBody(new Int8Array(getArrayBufferWithZeros(), 1, 8), string, "Int8Array");
104+
checkRequestBody(new Float32Array(getArrayBuffer()), string, "Float32Array");
105+
checkRequestBody(new DataView(getArrayBufferWithZeros(), 1, 8), string, "DataView");
106+
107+
promise_test(function(test) {
108+
var formData = new FormData();
109+
formData.append("name", "value")
110+
var request = new Request("", {"method": "POST", "body": formData });
111+
assert_false(request.bodyUsed, "bodyUsed is false at init");
112+
return checkBodyFormData(request, formData);
113+
}, "Consume FormData request's body as FormData");
114+
115+
function checkBlobResponseBody(blobBody, blobData, bodyType, checkFunction) {
116+
promise_test(function(test) {
117+
var response = new Response(blobBody);
118+
assert_false(response.bodyUsed, "bodyUsed is false at init");
119+
return checkFunction(response, blobData);
120+
}, "Consume blob response's body as " + bodyType);
121+
}
122+
123+
checkBlobResponseBody(blob, textData, "blob", checkBodyBlob);
124+
checkBlobResponseBody(blob, textData, "text", checkBodyText);
125+
checkBlobResponseBody(blob, textData, "json", checkBodyJSON);
126+
checkBlobResponseBody(blob, textData, "arrayBuffer", checkBodyArrayBuffer);
127+
checkBlobResponseBody(new Blob([""]), "", "blob (empty blob as input)", checkBodyBlob);
128+
129+
var goodJSONValues = ["null", "1", "true", "\"string\""];
130+
goodJSONValues.forEach(function(value) {
131+
promise_test(function(test) {
132+
var request = new Request("", {"method": "POST", "body": value});
133+
return request.json().then(function(v) {
134+
assert_equals(v, JSON.parse(value));
135+
});
136+
}, "Consume JSON from text: '" + JSON.stringify(value) + "'");
137+
});
138+
139+
var badJSONValues = ["undefined", "{", "a", "["];
140+
badJSONValues.forEach(function(value) {
141+
promise_test(function(test) {
142+
var request = new Request("", {"method": "POST", "body": value});
143+
return promise_rejects_js(test, SyntaxError, request.json());
144+
}, "Trying to consume bad JSON text as JSON: '" + value + "'");
145+
});
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
// META: global=window,worker
2+
// META: title=Request Headers
3+
4+
var validRequestHeaders = [
5+
["Content-Type", "OK"],
6+
["Potato", "OK"],
7+
["proxy", "OK"],
8+
["proxya", "OK"],
9+
["sec", "OK"],
10+
["secb", "OK"],
11+
["Set-Cookie2", "OK"],
12+
];
13+
var invalidRequestHeaders = [
14+
["Accept-Charset", "KO"],
15+
["accept-charset", "KO"],
16+
["ACCEPT-ENCODING", "KO"],
17+
["Accept-Encoding", "KO"],
18+
["Access-Control-Request-Headers", "KO"],
19+
["Access-Control-Request-Method", "KO"],
20+
["Connection", "KO"],
21+
["Content-Length", "KO"],
22+
["Cookie", "KO"],
23+
["Cookie2", "KO"],
24+
["Date", "KO"],
25+
["DNT", "KO"],
26+
["Expect", "KO"],
27+
["Host", "KO"],
28+
["Keep-Alive", "KO"],
29+
["Origin", "KO"],
30+
["Referer", "KO"],
31+
["Set-Cookie", "KO"],
32+
["TE", "KO"],
33+
["Trailer", "KO"],
34+
["Transfer-Encoding", "KO"],
35+
["Upgrade", "KO"],
36+
["Via", "KO"],
37+
["Proxy-", "KO"],
38+
["proxy-a", "KO"],
39+
["Sec-", "KO"],
40+
["sec-b", "KO"],
41+
];
42+
43+
var validRequestNoCorsHeaders = [
44+
["Accept", "OK"],
45+
["Accept-Language", "OK"],
46+
["content-language", "OK"],
47+
["content-type", "application/x-www-form-urlencoded"],
48+
["content-type", "application/x-www-form-urlencoded;charset=UTF-8"],
49+
["content-type", "multipart/form-data"],
50+
["content-type", "multipart/form-data;charset=UTF-8"],
51+
["content-TYPE", "text/plain"],
52+
["CONTENT-type", "text/plain;charset=UTF-8"],
53+
];
54+
var invalidRequestNoCorsHeaders = [
55+
["Content-Type", "KO"],
56+
["Potato", "KO"],
57+
["proxy", "KO"],
58+
["proxya", "KO"],
59+
["sec", "KO"],
60+
["secb", "KO"],
61+
];
62+
63+
validRequestHeaders.forEach(function(header) {
64+
test(function() {
65+
var request = new Request("");
66+
request.headers.set(header[0], header[1]);
67+
assert_equals(request.headers.get(header[0]), header[1]);
68+
}, "Adding valid request header \"" + header[0] + ": " + header[1] + "\"");
69+
});
70+
invalidRequestHeaders.forEach(function(header) {
71+
test(function() {
72+
var request = new Request("");
73+
request.headers.set(header[0], header[1]);
74+
assert_equals(request.headers.get(header[0]), null);
75+
}, "Adding invalid request header \"" + header[0] + ": " + header[1] + "\"");
76+
});
77+
78+
validRequestNoCorsHeaders.forEach(function(header) {
79+
test(function() {
80+
var requestNoCors = new Request("", {"mode": "no-cors"});
81+
requestNoCors.headers.set(header[0], header[1]);
82+
assert_equals(requestNoCors.headers.get(header[0]), header[1]);
83+
}, "Adding valid no-cors request header \"" + header[0] + ": " + header[1] + "\"");
84+
});
85+
invalidRequestNoCorsHeaders.forEach(function(header) {
86+
test(function() {
87+
var requestNoCors = new Request("", {"mode": "no-cors"});
88+
requestNoCors.headers.set(header[0], header[1]);
89+
assert_equals(requestNoCors.headers.get(header[0]), null);
90+
}, "Adding invalid no-cors request header \"" + header[0] + ": " + header[1] + "\"");
91+
});
92+
93+
test(function() {
94+
var headers = new Headers([["Cookie2", "potato"]]);
95+
var request = new Request("", {"headers": headers});
96+
assert_equals(request.headers.get("Cookie2"), null);
97+
}, "Check that request constructor is filtering headers provided as init parameter");
98+
99+
test(function() {
100+
var headers = new Headers([["Content-Type", "potato"]]);
101+
var request = new Request("", {"headers": headers, "mode": "no-cors"});
102+
assert_equals(request.headers.get("Content-Type"), null);
103+
}, "Check that no-cors request constructor is filtering headers provided as init parameter");
104+
105+
test(function() {
106+
var headers = new Headers([["Content-Type", "potato"]]);
107+
var initialRequest = new Request("", {"headers": headers});
108+
var request = new Request(initialRequest, {"mode": "no-cors"});
109+
assert_equals(request.headers.get("Content-Type"), null);
110+
}, "Check that no-cors request constructor is filtering headers provided as part of request parameter");
111+
112+
test(function() {
113+
var initialHeaders = new Headers([["Content-Type", "potato"]]);
114+
var initialRequest = new Request("", {"headers" : initialHeaders});
115+
var request = new Request(initialRequest);
116+
assert_equals(request.headers.get("Content-Type"), "potato");
117+
}, "Request should get its content-type from the init request");
118+
119+
test(function() {
120+
var initialHeaders = new Headers([["Content-Type", "potato"]]);
121+
var initialRequest = new Request("", {"headers" : initialHeaders});
122+
var headers = new Headers([]);
123+
var request = new Request(initialRequest, {"headers" : headers});
124+
assert_false(request.headers.has("Content-Type"));
125+
}, "Request should not get its content-type from the init request if init headers are provided");
126+
127+
test(function() {
128+
var initialHeaders = new Headers([["Content-Type-Extra", "potato"]]);
129+
var initialRequest = new Request("", {"headers" : initialHeaders, "body" : "this is my plate", "method" : "POST"});
130+
var request = new Request(initialRequest);
131+
assert_equals(request.headers.get("Content-Type"), "text/plain;charset=UTF-8");
132+
}, "Request should get its content-type from the body if none is provided");
133+
134+
test(function() {
135+
var initialHeaders = new Headers([["Content-Type", "potato"]]);
136+
var initialRequest = new Request("", {"headers" : initialHeaders, "body" : "this is my plate", "method" : "POST"});
137+
var request = new Request(initialRequest);
138+
assert_equals(request.headers.get("Content-Type"), "potato");
139+
}, "Request should get its content-type from init headers if one is provided");
140+
141+
test(function() {
142+
var array = [["hello", "worldAHH"]];
143+
var object = {"hello": 'worldOOH'};
144+
var headers = new Headers(array);
145+
146+
assert_equals(headers.get("hello"), "worldAHH");
147+
148+
var request1 = new Request("", {"headers": headers});
149+
var request2 = new Request("", {"headers": array});
150+
var request3 = new Request("", {"headers": object});
151+
152+
assert_equals(request1.headers.get("hello"), "worldAHH");
153+
assert_equals(request2.headers.get("hello"), "worldAHH");
154+
assert_equals(request3.headers.get("hello"), "worldOOH");
155+
}, "Testing request header creations with various objects");
156+
157+
promise_test(function(test) {
158+
var request = new Request("", {"headers" : [["Content-Type", ""]], "body" : "this is my plate", "method" : "POST"});
159+
return request.blob().then(function(blob) {
160+
assert_equals(blob.type, "", "Blob type should be the empty string");
161+
});
162+
}, "Testing empty Request Content-Type header");
163+
164+
test(function() {
165+
const request1 = new Request("");
166+
assert_equals(request1.headers, request1.headers);
167+
168+
const request2 = new Request("", {"headers": {"X-Foo": "bar"}});
169+
assert_equals(request2.headers, request2.headers);
170+
const headers = request2.headers;
171+
request2.headers.set("X-Foo", "quux");
172+
assert_equals(headers, request2.headers);
173+
headers.set("X-Other-Header", "baz");
174+
assert_equals(headers, request2.headers);
175+
}, "Test that Request.headers has the [SameObject] extended attribute");

0 commit comments

Comments
 (0)