diff options
-rw-r--r-- | cli/js/web/body.ts | 3 | ||||
-rw-r--r-- | cli/js/web/streams/internals.ts | 5 | ||||
-rw-r--r-- | cli/tests/unit/fetch_test.ts | 33 |
3 files changed, 40 insertions, 1 deletions
diff --git a/cli/js/web/body.ts b/cli/js/web/body.ts index 7a5b63d32..672b7de5a 100644 --- a/cli/js/web/body.ts +++ b/cli/js/web/body.ts @@ -2,6 +2,7 @@ import * as blob from "./blob.ts"; import * as encoding from "./text_encoding.ts"; import * as domTypes from "./dom_types.d.ts"; import { ReadableStreamImpl } from "./streams/readable_stream.ts"; +import { isReadableStreamDisturbed } from "./streams/internals.ts"; import { getHeaderValueParams, hasHeaderValueOf } from "./util.ts"; import { MultipartParser } from "./fetch/multipart.ts"; @@ -116,7 +117,7 @@ export class Body implements domTypes.Body { } get bodyUsed(): boolean { - if (this.body && this.body.locked) { + if (this.body && isReadableStreamDisturbed(this.body)) { return true; } return false; diff --git a/cli/js/web/streams/internals.ts b/cli/js/web/streams/internals.ts index ff8fc25fe..d0d35a1c3 100644 --- a/cli/js/web/streams/internals.ts +++ b/cli/js/web/streams/internals.ts @@ -367,6 +367,11 @@ export function isReadableStreamLocked(stream: ReadableStreamImpl): boolean { return stream[sym.reader] ? true : false; } +export function isReadableStreamDisturbed(stream: ReadableStream): boolean { + assert(isReadableStream(stream)); + return stream[sym.disturbed] ? true : false; +} + export function isTransformStream( x: unknown ): x is TransformStreamImpl<any, any> { diff --git a/cli/tests/unit/fetch_test.ts b/cli/tests/unit/fetch_test.ts index 57414d652..554cf31e9 100644 --- a/cli/tests/unit/fetch_test.ts +++ b/cli/tests/unit/fetch_test.ts @@ -100,6 +100,39 @@ unitTest({ perms: { net: true } }, async function fetchBodyUsed(): Promise< assertEquals(response.bodyUsed, true); }); +unitTest( + { perms: { net: true } }, + async function fetchBodyUsedReader(): Promise<void> { + const response = await fetch( + "http://localhost:4545/cli/tests/fixture.json" + ); + assert(response.body !== null); + + const reader = response.body.getReader(); + // Getting a reader should lock the stream but does not consume the body + // so bodyUsed should not be true + assertEquals(response.bodyUsed, false); + reader.releaseLock(); + await response.json(); + assertEquals(response.bodyUsed, true); + } +); + +unitTest( + { perms: { net: true } }, + async function fetchBodyUsedCancelStream(): Promise<void> { + const response = await fetch( + "http://localhost:4545/cli/tests/fixture.json" + ); + assert(response.body !== null); + + assertEquals(response.bodyUsed, false); + const promise = response.body.cancel(); + assertEquals(response.bodyUsed, true); + await promise; + } +); + unitTest({ perms: { net: true } }, async function fetchAsyncIterator(): Promise< void > { |