|
1 | 1 | import { createServer, type Server } from "node:http"; |
2 | 2 | import { once } from "node:events"; |
| 3 | +import { createServer as createTcpServer } from "node:net"; |
3 | 4 | import express from "express"; |
4 | 5 | import { sendRemixResponse } from "@remix-run/express/dist/server"; |
5 | 6 | import { expect, test } from "vitest"; |
@@ -116,6 +117,34 @@ test("does not treat permission or service failures as an absent transcript", () |
116 | 117 | expect(isTranscriptNotFound({ name: "NoSuchKey" })).toBe(true); |
117 | 118 | }); |
118 | 119 |
|
| 120 | +test("recognizes a missing transcript when the object store omits the reason phrase", async () => { |
| 121 | + const server = createTcpServer((socket) => { |
| 122 | + socket.once("data", () => { |
| 123 | + socket.end("HTTP/1.1 404 \r\nContent-Length: 0\r\nConnection: close\r\n\r\n"); |
| 124 | + }); |
| 125 | + }); |
| 126 | + server.listen(0, "127.0.0.1"); |
| 127 | + await once(server, "listening"); |
| 128 | + const address = server.address(); |
| 129 | + if (!address || typeof address === "string") throw new Error("Expected TCP listener"); |
| 130 | + |
| 131 | + try { |
| 132 | + const client = ObjectStoreClient.create({ |
| 133 | + baseUrl: `http://127.0.0.1:${address.port}`, |
| 134 | + accessKeyId: "test-access-key", |
| 135 | + secretAccessKey: "test-secret-key", |
| 136 | + service: "s3", |
| 137 | + }); |
| 138 | + |
| 139 | + // @crumbs Exercise the adapter with a valid 404 response whose statusText is empty. |
| 140 | + await expect(client.getObjectResponse(key)).rejects.toSatisfy(isTranscriptNotFound); |
| 141 | + } finally { |
| 142 | + await new Promise<void>((resolve, reject) => |
| 143 | + server.close((error) => (error ? reject(error) : resolve())) |
| 144 | + ); |
| 145 | + } |
| 146 | +}); |
| 147 | + |
119 | 148 | minioTest( |
120 | 149 | "HEAD distinguishes permission failures from missing objects", |
121 | 150 | async ({ minioConfig }) => { |
|
0 commit comments