From c4bddc4651f583241193b80634a4f22abb02d582 Mon Sep 17 00:00:00 2001 From: ztplz Date: Mon, 22 Oct 2018 05:42:18 +0800 Subject: [PATCH] Implemente clone for FetchResponse (#1054) --- js/fetch.ts | 17 +++++++++++++++-- js/fetch_test.ts | 13 +++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/js/fetch.ts b/js/fetch.ts index 3559f3db84..25db32d1d2 100644 --- a/js/fetch.ts +++ b/js/fetch.ts @@ -128,6 +128,7 @@ class FetchResponse implements domTypes.Response { readonly trailer: Promise; //private bodyChunks: Uint8Array[] = []; private first = true; + private bodyData: ArrayBuffer; private bodyWaiter: Resolvable; 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 2ef58f273d..2f73544aa9 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 */