1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-01-21 21:50:00 -05:00

fix(ext/fetch): subview Uint8Array in Req/Resp (#18890)

This commit is contained in:
Luca Casonato 2023-04-28 14:26:21 +02:00 committed by GitHub
parent de5bd4e536
commit 84b921555f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 30 deletions

View file

@ -1893,3 +1893,19 @@ Deno.test(
await server; await server;
}, },
); );
Deno.test("Request with subarray TypedArray body", async () => {
const body = new Uint8Array([1, 2, 3, 4, 5]).subarray(1);
const req = new Request("https://example.com", { method: "POST", body });
const actual = new Uint8Array(await req.arrayBuffer());
const expected = new Uint8Array([2, 3, 4, 5]);
assertEquals(actual, expected);
});
Deno.test("Response with subarray TypedArray body", async () => {
const body = new Uint8Array([1, 2, 3, 4, 5]).subarray(1);
const req = new Response(body);
const actual = new Uint8Array(await req.arrayBuffer());
const expected = new Uint8Array([2, 3, 4, 5]);
assertEquals(actual, expected);
});

View file

@ -38,7 +38,6 @@ import {
const primordials = globalThis.__bootstrap.primordials; const primordials = globalThis.__bootstrap.primordials;
const { const {
ArrayBufferPrototype, ArrayBufferPrototype,
ArrayBufferPrototypeGetByteLength,
ArrayBufferIsView, ArrayBufferIsView,
ArrayPrototypeMap, ArrayPrototypeMap,
DataViewPrototypeGetBuffer, DataViewPrototypeGetBuffer,
@ -394,44 +393,27 @@ function extractBody(object) {
} }
} else if (ArrayBufferIsView(object)) { } else if (ArrayBufferIsView(object)) {
const tag = TypedArrayPrototypeGetSymbolToStringTag(object); const tag = TypedArrayPrototypeGetSymbolToStringTag(object);
if (tag === "Uint8Array") { if (tag !== undefined) {
// Fast(er) path for common case of Uint8Array
const copy = TypedArrayPrototypeSlice(
object,
TypedArrayPrototypeGetByteOffset(/** @type {Uint8Array} */ (object)),
TypedArrayPrototypeGetByteLength(/** @type {Uint8Array} */ (object)),
);
source = copy;
} else if (tag !== undefined) {
// TypedArray // TypedArray
const copy = TypedArrayPrototypeSlice( if (tag !== "Uint8Array") {
new Uint8Array( // TypedArray, unless it's Uint8Array
object = new Uint8Array(
TypedArrayPrototypeGetBuffer(/** @type {Uint8Array} */ (object)), TypedArrayPrototypeGetBuffer(/** @type {Uint8Array} */ (object)),
TypedArrayPrototypeGetByteOffset(/** @type {Uint8Array} */ (object)), TypedArrayPrototypeGetByteOffset(/** @type {Uint8Array} */ (object)),
TypedArrayPrototypeGetByteLength(/** @type {Uint8Array} */ (object)), TypedArrayPrototypeGetByteLength(/** @type {Uint8Array} */ (object)),
), );
); }
source = copy;
} else { } else {
// DataView // DataView
const copy = TypedArrayPrototypeSlice( object = new Uint8Array(
new Uint8Array( DataViewPrototypeGetBuffer(/** @type {DataView} */ (object)),
DataViewPrototypeGetBuffer(/** @type {DataView} */ (object)), DataViewPrototypeGetByteOffset(/** @type {DataView} */ (object)),
DataViewPrototypeGetByteOffset(/** @type {DataView} */ (object)), DataViewPrototypeGetByteLength(/** @type {DataView} */ (object)),
DataViewPrototypeGetByteLength(/** @type {DataView} */ (object)),
),
); );
source = copy;
} }
source = TypedArrayPrototypeSlice(object);
} else if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, object)) { } else if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, object)) {
const copy = TypedArrayPrototypeSlice( source = TypedArrayPrototypeSlice(new Uint8Array(object));
new Uint8Array(
object,
0,
ArrayBufferPrototypeGetByteLength(object),
),
);
source = copy;
} else if (ObjectPrototypeIsPrototypeOf(FormDataPrototype, object)) { } else if (ObjectPrototypeIsPrototypeOf(FormDataPrototype, object)) {
const res = formDataToBlob(object); const res = formDataToBlob(object);
stream = res.stream(); stream = res.stream();