summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcos Casagrande <marcoscvp90@gmail.com>2022-10-07 13:59:30 +0200
committerGitHub <noreply@github.com>2022-10-07 13:59:30 +0200
commita5d55fe6eaa9ba32908cdff5a88215dd2466d415 (patch)
treecd14d5702f9c1b7ed98084e315a0d332f17442b8
parente136bd86b3bf0a14d3379b389a44547d332b9ca5 (diff)
fix(ext/fetch): support empty formdata (#16165)
This PR adds support for empty `FormData` parsing in `Response`/`Request` ```js new Response(new FormData()).formData() ``` ref: https://github.com/web-platform-tests/wpt/issues/28607
-rw-r--r--ext/fetch/21_formdata.js14
-rw-r--r--tools/wpt/expectation.json20
2 files changed, 16 insertions, 18 deletions
diff --git a/ext/fetch/21_formdata.js b/ext/fetch/21_formdata.js
index 5532cc5a3..34103858f 100644
--- a/ext/fetch/21_formdata.js
+++ b/ext/fetch/21_formdata.js
@@ -393,9 +393,19 @@
* @returns {FormData}
*/
parse() {
- // Body must be at least 2 boundaries + \r\n + -- on the last boundary.
+ // To have fields body must be at least 2 boundaries + \r\n + --
+ // on the last boundary.
if (this.body.length < (this.boundary.length * 2) + 4) {
- throw new TypeError("Form data too short to be valid.");
+ const decodedBody = core.decode(this.body);
+ const lastBoundary = this.boundary + "--";
+ // check if it's an empty valid form data
+ if (
+ decodedBody === lastBoundary ||
+ decodedBody === lastBoundary + "\r\n"
+ ) {
+ return new FormData();
+ }
+ throw new TypeError("Unable to parse body as form data.");
}
const formData = new FormData();
diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json
index 4afa46066..4c5269d1a 100644
--- a/tools/wpt/expectation.json
+++ b/tools/wpt/expectation.json
@@ -3077,14 +3077,8 @@
"response-static-json.any.worker.html": true
},
"body": {
- "formdata.any.html": [
- "Consume empty response.formData() as FormData",
- "Consume empty request.formData() as FormData"
- ],
- "formdata.any.worker.html": [
- "Consume empty response.formData() as FormData",
- "Consume empty request.formData() as FormData"
- ],
+ "formdata.any.html": true,
+ "formdata.any.worker.html": true,
"mime-type.any.html": true,
"mime-type.any.worker.html": true
},
@@ -3231,14 +3225,8 @@
"response.text() rejects if already aborted",
"Call text() twice on aborted response"
],
- "request.any.html": [
- "Calling formData() on an aborted request",
- "Aborting a request after calling formData()"
- ],
- "request.any.worker.html": [
- "Calling formData() on an aborted request",
- "Aborting a request after calling formData()"
- ],
+ "request.any.html": true,
+ "request.any.worker.html": true,
"cache.https.any.html": false,
"cache.https.any.worker.html": false
}