mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
Implemente clone for FetchResponse (#1054)
This commit is contained in:
parent
47c96a6152
commit
c4bddc4651
2 changed files with 28 additions and 2 deletions
17
js/fetch.ts
17
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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue