feat : it work on my machice
CI / Verify (push) Failing after 1m16s
CI / Build immutable images and deploy (push) Skipped

This commit is contained in:
2026-10-10 03:24:34 +07:00 Unverified
parent 941b252163
commit 00bbc4e4ca
2 changed files with 20 additions and 5 deletions
+18 -3
View File
@@ -1,4 +1,4 @@
import { afterEach, describe, expect, it } from "vitest";
import { afterEach, describe, expect, it, vi } from "vitest";
import { boundedBody, errorResponse, HttpError, readJson, requireSameOrigin, withUploadSlot } from "./http";
import { trustedClientAddress } from "./rate-limit";
@@ -6,6 +6,7 @@ const originalAuthUrl = process.env.BETTER_AUTH_URL;
const originalClientIpHeader = process.env.TRUSTED_CLIENT_IP_HEADER;
afterEach(() => {
vi.restoreAllMocks();
if (originalAuthUrl === undefined) delete process.env.BETTER_AUTH_URL;
else process.env.BETTER_AUTH_URL = originalAuthUrl;
if (originalClientIpHeader === undefined) delete process.env.TRUSTED_CLIENT_IP_HEADER;
@@ -54,11 +55,25 @@ describe("request boundaries", () => {
await expect(withUploadSlot(async () => "ok")).resolves.toBe("ok");
});
it("returns retry timing and hides internal errors", async () => {
it("preserves explicit HTTP errors and retry timing", async () => {
const response = errorResponse(new HttpError(429, "too-many-requests", 10));
expect(response.status).toBe(429);
expect(response.headers.get("retry-after")).toBe("10");
expect(await errorResponse(new Error("secret password")).text()).not.toContain("password");
expect(await response.json()).toEqual({ error: "too-many-requests" });
const unavailable = errorResponse(new HttpError(503, "dependency-unavailable", 5));
expect(unavailable.status).toBe(503);
expect(unavailable.headers.get("retry-after")).toBe("5");
expect(await unavailable.json()).toEqual({ error: "dependency-unavailable" });
});
it.each([new Error("secret password"), "unexpected thrown value", null])("returns 500 for unexpected errors and logs the original cause: %s", async (cause) => {
const log = vi.spyOn(console, "error").mockImplementation(() => {});
const response = errorResponse(cause);
expect(response.status).toBe(500);
expect(await response.json()).toEqual({ error: "internal-server-error" });
expect(response.headers.get("cache-control")).toBe("no-store");
expect(response.headers.get("retry-after")).toBeNull();
expect(log).toHaveBeenCalledWith("Unhandled request error", cause);
});
it("ignores spoofed forwarding headers unless explicitly configured", () => {
+2 -2
View File
@@ -10,8 +10,8 @@ export function securityLog(event: string, details: { actorId?: string; targetId
}
export function errorResponse(cause: unknown): Response {
const error = cause instanceof HttpError ? cause : new HttpError(503, "service-unavailable");
if (!(cause instanceof HttpError)) securityLog("dependency-unavailable", { status: 503 });
const error = cause instanceof HttpError ? cause : new HttpError(500, "internal-server-error");
if (!(cause instanceof HttpError)) console.error("Unhandled request error", cause);
return Response.json({ error: error.message }, {
status: error.status,
headers: {