diff options
-rw-r--r-- | test/bun.js/fetch-gzip.test.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/test/bun.js/fetch-gzip.test.ts b/test/bun.js/fetch-gzip.test.ts index a75e01701..d2637121c 100644 --- a/test/bun.js/fetch-gzip.test.ts +++ b/test/bun.js/fetch-gzip.test.ts @@ -113,4 +113,65 @@ it("fetch() with a gzip response works (multiple chunks)", async () => { ), ), ).toBe(true); + server.stop(); +}); + +it("fetch() with a gzip response works (multiple chunks, TCP server)", async (done) => { + const compressed = await Bun.file( + import.meta.dir + "/fixture.html.gz", + ).arrayBuffer(); + const server = Bun.listen({ + port: 4024, + hostname: "0.0.0.0", + socket: { + async open(socket) { + var corked: any[] = []; + var cork = true; + async function write(chunk) { + await new Promise<void>((resolve, reject) => { + if (cork) { + corked.push(chunk); + } + + if (!cork && corked.length) { + socket.write(corked.join("")); + corked.length = 0; + } + + if (!cork) { + socket.write(chunk); + } + + resolve(); + }); + } + await write("HTTP/1.1 200 OK\r\n"); + await write("Content-Encoding: gzip\r\n"); + await write("Content-Type: text/html; charset=utf-8\r\n"); + await write("Content-Length: " + compressed.byteLength + "\r\n"); + await write("X-WTF: " + "lol".repeat(1000) + "\r\n"); + await write("\r\n"); + for (var i = 100; i < compressed.byteLength; i += 100) { + cork = false; + await write(compressed.slice(i - 100, i)); + } + await write(compressed.slice(i - 100)); + await socket.end(); + }, + drain(socket) {}, + }, + }); + await 1; + + const res = await fetch(`http://${server.hostname}:${server.port}`, {}); + const arrayBuffer = await res.arrayBuffer(); + expect( + new Buffer(arrayBuffer).equals( + new Buffer( + await Bun.file(import.meta.dir + "/fixture.html").arrayBuffer(), + ), + ), + ).toBe(true); + server.stop(); + done(); }); |