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:
parent
de5bd4e536
commit
84b921555f
2 changed files with 28 additions and 30 deletions
|
@ -1893,3 +1893,19 @@ Deno.test(
|
|||
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);
|
||||
});
|
||||
|
|
|
@ -38,7 +38,6 @@ import {
|
|||
const primordials = globalThis.__bootstrap.primordials;
|
||||
const {
|
||||
ArrayBufferPrototype,
|
||||
ArrayBufferPrototypeGetByteLength,
|
||||
ArrayBufferIsView,
|
||||
ArrayPrototypeMap,
|
||||
DataViewPrototypeGetBuffer,
|
||||
|
@ -394,44 +393,27 @@ function extractBody(object) {
|
|||
}
|
||||
} else if (ArrayBufferIsView(object)) {
|
||||
const tag = TypedArrayPrototypeGetSymbolToStringTag(object);
|
||||
if (tag === "Uint8Array") {
|
||||
// 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) {
|
||||
if (tag !== undefined) {
|
||||
// TypedArray
|
||||
const copy = TypedArrayPrototypeSlice(
|
||||
new Uint8Array(
|
||||
if (tag !== "Uint8Array") {
|
||||
// TypedArray, unless it's Uint8Array
|
||||
object = new Uint8Array(
|
||||
TypedArrayPrototypeGetBuffer(/** @type {Uint8Array} */ (object)),
|
||||
TypedArrayPrototypeGetByteOffset(/** @type {Uint8Array} */ (object)),
|
||||
TypedArrayPrototypeGetByteLength(/** @type {Uint8Array} */ (object)),
|
||||
),
|
||||
);
|
||||
source = copy;
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// DataView
|
||||
const copy = TypedArrayPrototypeSlice(
|
||||
new Uint8Array(
|
||||
DataViewPrototypeGetBuffer(/** @type {DataView} */ (object)),
|
||||
DataViewPrototypeGetByteOffset(/** @type {DataView} */ (object)),
|
||||
DataViewPrototypeGetByteLength(/** @type {DataView} */ (object)),
|
||||
),
|
||||
object = new Uint8Array(
|
||||
DataViewPrototypeGetBuffer(/** @type {DataView} */ (object)),
|
||||
DataViewPrototypeGetByteOffset(/** @type {DataView} */ (object)),
|
||||
DataViewPrototypeGetByteLength(/** @type {DataView} */ (object)),
|
||||
);
|
||||
source = copy;
|
||||
}
|
||||
source = TypedArrayPrototypeSlice(object);
|
||||
} else if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, object)) {
|
||||
const copy = TypedArrayPrototypeSlice(
|
||||
new Uint8Array(
|
||||
object,
|
||||
0,
|
||||
ArrayBufferPrototypeGetByteLength(object),
|
||||
),
|
||||
);
|
||||
source = copy;
|
||||
source = TypedArrayPrototypeSlice(new Uint8Array(object));
|
||||
} else if (ObjectPrototypeIsPrototypeOf(FormDataPrototype, object)) {
|
||||
const res = formDataToBlob(object);
|
||||
stream = res.stream();
|
||||
|
|
Loading…
Add table
Reference in a new issue