diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/fetch.ts | 17 | ||||
-rw-r--r-- | js/fetch_test.ts | 13 |
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 */ |