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;
|
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 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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue