summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/fetch.ts17
-rw-r--r--js/fetch_test.ts13
2 files changed, 28 insertions, 2 deletions
diff --git a/js/fetch.ts b/js/fetch.ts
index 3559f3db8..25db32d1d 100644
--- a/js/fetch.ts
+++ b/js/fetch.ts
@@ -128,6 +128,7 @@ class FetchResponse implements domTypes.Response {
readonly trailer: Promise<domTypes.Headers>;
//private bodyChunks: Uint8Array[] = [];
private first = true;
+ private bodyData: ArrayBuffer;
private bodyWaiter: Resolvable<ArrayBuffer>;
constructor(
@@ -138,6 +139,7 @@ class FetchResponse implements domTypes.Response {
this.bodyWaiter = createResolvable();
this.trailer = createResolvable();
this.headers = new DenoHeaders(headersList);
+ this.bodyData = body_;
setTimeout(() => {
this.bodyWaiter.resolve(body_);
}, 0);
@@ -175,8 +177,19 @@ class FetchResponse implements domTypes.Response {
}
clone(): domTypes.Response {
- notImplemented();
- return {} as domTypes.Response;
+ if (this.bodyUsed) {
+ throw new TypeError(
+ "Failed to execute 'clone' on 'Response': Response body is already used"
+ );
+ }
+
+ const iterators = this.headers.entries();
+ const headersList: Array<[string, string]> = [];
+ for (const header of iterators) {
+ headersList.push(header);
+ }
+
+ return new FetchResponse(this.status, this.bodyData.slice(0), headersList);
}
onHeader?: (res: FetchResponse) => void;
diff --git a/js/fetch_test.ts b/js/fetch_test.ts
index 2ef58f273..2f73544aa 100644
--- a/js/fetch_test.ts
+++ b/js/fetch_test.ts
@@ -44,6 +44,19 @@ testPerm({ net: true }, async function fetchBlob() {
assertEqual(blob.size, Number(headers.get("Content-Length")));
});
+testPerm({ net: true }, async function responseClone() {
+ const response = await fetch("http://localhost:4545/package.json");
+ const response1 = response.clone();
+ assert(response !== response1);
+ assertEqual(response.status, response1.status);
+ assertEqual(response.statusText, response1.statusText);
+ const ab = await response.arrayBuffer();
+ const ab1 = await response1.arrayBuffer();
+ for (let i = 0; i < ab.byteLength; i++) {
+ assertEqual(ab[i], ab1[i]);
+ }
+});
+
// Logic heavily copied from web-platform-tests, make
// sure pass mostly header basic test
/* tslint:disable-next-line:max-line-length */