summaryrefslogtreecommitdiff
path: root/extensions/fetch
diff options
context:
space:
mode:
authorAndreu Botella <abb@randomunok.com>2021-06-23 16:00:23 +0200
committerGitHub <noreply@github.com>2021-06-23 16:00:23 +0200
commitedab21ebab3daa3cb0ebd5f6fca60c17098df242 (patch)
tree601557d2ff77687acc5b883201a7fbc0ce2482dd /extensions/fetch
parent2c4ce26f0bf1bf957d5c7dec28372898c60ed66c (diff)
fix(fetch): proxy body for requests created from other requests (#11093)
Additionally, if the existing `Request`'s body is disturbed, the Request creation should fail. This change also updates the step numbers in the Request constructor to match whatwg/fetch#1249.
Diffstat (limited to 'extensions/fetch')
-rw-r--r--extensions/fetch/22_body.js19
-rw-r--r--extensions/fetch/23_request.js30
2 files changed, 35 insertions, 14 deletions
diff --git a/extensions/fetch/22_body.js b/extensions/fetch/22_body.js
index 475af035f..9b5bf8eff 100644
--- a/extensions/fetch/22_body.js
+++ b/extensions/fetch/22_body.js
@@ -19,7 +19,7 @@
const { parseFormData, formDataFromEntries, formDataToBlob } =
globalThis.__bootstrap.formData;
const mimesniff = globalThis.__bootstrap.mimesniff;
- const { isReadableStreamDisturbed, errorReadableStream } =
+ const { isReadableStreamDisturbed, errorReadableStream, createProxy } =
globalThis.__bootstrap.streams;
class InnerBody {
@@ -133,6 +133,23 @@
second.length = this.length;
return second;
}
+
+ /**
+ * @returns {InnerBody}
+ */
+ createProxy() {
+ let proxyStreamOrStatic;
+ if (this.streamOrStatic instanceof ReadableStream) {
+ proxyStreamOrStatic = createProxy(this.streamOrStatic);
+ } else {
+ proxyStreamOrStatic = { ...this.streamOrStatic };
+ this.streamOrStatic.consumed = true;
+ }
+ const proxy = new InnerBody(proxyStreamOrStatic);
+ proxy.source = this.source;
+ proxy.length = this.length;
+ return proxy;
+ }
}
/**
diff --git a/extensions/fetch/23_request.js b/extensions/fetch/23_request.js
index ff2bf1d4e..93d13e8d8 100644
--- a/extensions/fetch/23_request.js
+++ b/extensions/fetch/23_request.js
@@ -257,14 +257,16 @@
// 28.
this[_signal] = abortSignal.newSignal();
+
+ // 29.
if (signal !== null) {
abortSignal.follow(this[_signal], signal);
}
- // 29.
+ // 30.
this[_headers] = headersFromHeaderList(request.headerList, "request");
- // 31.
+ // 32.
if (Object.keys(init).length > 0) {
let headers = headerListFromHeaders(this[_headers]).slice(
0,
@@ -280,13 +282,13 @@
fillHeaders(this[_headers], headers);
}
- // 32.
+ // 33.
let inputBody = null;
if (input instanceof Request) {
inputBody = input[_body];
}
- // 33.
+ // 34.
if (
(request.method === "GET" || request.method === "HEAD") &&
((init.body !== undefined && init.body !== null) ||
@@ -295,10 +297,10 @@
throw new TypeError("Request with GET/HEAD method cannot have body.");
}
- // 34.
+ // 35.
let initBody = null;
- // 35.
+ // 36.
if (init.body !== undefined && init.body !== null) {
const res = extractBody(init.body);
initBody = res.body;
@@ -307,20 +309,22 @@
}
}
- // 36.
+ // 37.
const inputOrInitBody = initBody ?? inputBody;
- // 38.
- const finalBody = inputOrInitBody;
-
// 39.
- // TODO(lucacasonato): implement this step. Is it needed?
+ let finalBody = inputOrInitBody;
// 40.
- request.body = finalBody;
+ if (initBody === null && inputBody !== null) {
+ if (input[_body] && input[_body].unusable()) {
+ throw new TypeError("Input request's body is unusable.");
+ }
+ finalBody = inputBody.createProxy();
+ }
// 41.
- // TODO(lucacasonato): Extranious? https://github.com/whatwg/fetch/issues/1249
+ request.body = finalBody;
}
get method() {