diff --git a/packages/http-server/src/index.ts b/packages/http-server/src/index.ts index 27ce303d8..4fda40ad4 100644 --- a/packages/http-server/src/index.ts +++ b/packages/http-server/src/index.ts @@ -282,10 +282,12 @@ export function createRequestListener( } catch (e: any) { // MIME types aren't case sensitive const accept = req.headers.accept?.toLowerCase() ?? ""; + const userAgent = req.headers["user-agent"]?.toLowerCase() ?? ""; if ( - accept.includes("text/html") || - accept.includes("*/*") || - accept.includes("text/*") + !userAgent.includes("curl/") && + (accept.includes("text/html") || + accept.includes("*/*") || + accept.includes("text/*")) ) { // Send pretty HTML error page if client accepts it const Youch: typeof import("youch").default = require("youch"); diff --git a/packages/http-server/test/index.spec.ts b/packages/http-server/test/index.spec.ts index caad77b9d..1bf157c96 100644 --- a/packages/http-server/test/index.spec.ts +++ b/packages/http-server/test/index.spec.ts @@ -368,6 +368,13 @@ test("createRequestListener: displays appropriately-formatted error page", async t.is(headers["content-type"], "text/html; charset=UTF-8"); [, headers] = await request(port, "/", { accept: "image/png, */*" }); t.is(headers["content-type"], "text/html; charset=UTF-8"); + + // Check pretty HTML error page isn't returned for cURL + [, headers] = await request(port, "/", { + accept: "*/*", + "user-agent": "curl/7.77.0", + }); + t.is(headers["content-type"], "text/plain; charset=UTF-8"); }); test("createRequestListener: includes live reload script in html responses if enabled", async (t) => { const mf = useMiniflareWithHandler({ HTTPPlugin }, {}, (globals) => {