aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/fetch-gzip.test.ts
blob: a75e017018411da2b5731e365ae1321aa7f20866 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import { concatArrayBuffers } from "bun";
import { it, describe, expect } from "bun:test";
import fs from "fs";
import { gc } from "./gc";

it("fetch() with a buffered gzip response works (one chunk)", async () => {
  var server = Bun.serve({
    port: 6025,

    async fetch(req) {
      return new Response(
        await Bun.file(import.meta.dir + "/fixture.html.gz").arrayBuffer(),
        {
          headers: {
            "Content-Encoding": "gzip",
            "Content-Type": "text/html; charset=utf-8",
          },
        },
      );
    },
  });

  const res = await fetch(
    `http://${server.hostname}:${server.port}`,
    {},
    { verbose: true },
  );
  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();
});

it("fetch() with a gzip response works (one chunk)", async () => {
  var server = Bun.serve({
    port: 6023,

    fetch(req) {
      return new Response(Bun.file(import.meta.dir + "/fixture.html.gz"), {
        headers: {
          "Content-Encoding": "gzip",
          "Content-Type": "text/html; charset=utf-8",
        },
      });
    },
  });

  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();
});

it("fetch() with a gzip response works (multiple chunks)", async () => {
  var server = Bun.serve({
    port: 6024,

    fetch(req) {
      return new Response(
        new ReadableStream({
          type: "direct",
          async pull(controller) {
            var chunks: ArrayBuffer[] = [];
            const buffer = await Bun.file(
              import.meta.dir + "/fixture.html.gz",
            ).arrayBuffer();
            var remaining = buffer;
            for (var i = 100; i < buffer.byteLength; i += 100) {
              var chunk = remaining.slice(0, i);
              remaining = remaining.slice(i);
              controller.write(chunk);
              chunks.push(chunk);
              await controller.flush();
            }

            await controller.flush();
            // sanity check
            expect(
              new Buffer(concatArrayBuffers(chunks)).equals(new Buffer(buffer)),
            ).toBe(true);

            controller.end();
          },
        }),
        {
          headers: {
            "Content-Encoding": "gzip",
            "Content-Type": "text/html; charset=utf-8",
            "Content-Length": "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);
});