diff options
author | Luca Casonato <hello@lcas.dev> | 2023-04-28 14:26:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-28 14:26:21 +0200 |
commit | 84b921555fa481a0a2c4cffe5c897fd1c87485b7 (patch) | |
tree | 0f2e8207d52cac55740fd178cf1e162eb88a208c /ext/fetch/22_body.js | |
parent | de5bd4e536bdbd6aa3621c97a961c3c926043d1a (diff) |
fix(ext/fetch): subview Uint8Array in Req/Resp (#18890)
Diffstat (limited to 'ext/fetch/22_body.js')
-rw-r--r-- | ext/fetch/22_body.js | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/ext/fetch/22_body.js b/ext/fetch/22_body.js index 9dbd58fa4..875ec0620 100644 --- a/ext/fetch/22_body.js +++ b/ext/fetch/22_body.js @@ -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(); |