0
0
Fork 0
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:
ztplz 2018-10-22 05:42:18 +08:00 committed by Ryan Dahl
parent 47c96a6152
commit c4bddc4651
2 changed files with 28 additions and 2 deletions

View file

@ -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;

View file

@ -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 */