mcansh / remix-fastify

Fastify server request handler for Remix
https://remix-fastify.onrender.com
MIT License
189 stars 26 forks source link

http2 is failing with #421

Open punkpeye opened 3 weeks ago

punkpeye commented 3 weeks ago
capturing exception: could not handle request (058f571aa3784fe995c9e28941c65312) TypeError: Headers.append: ":method" is an invalid header name.
    at webidl.errors.exception (/Users/punkpeye/Developer/punkpeye/glama/node_modules/.pnpm/undici@6.19.8/node_modules/undici/lib/web/fetch/webidl.js:13:10)
    at webidl.errors.invalidArgument (/Users/punkpeye/Developer/punkpeye/glama/node_modules/.pnpm/undici@6.19.8/node_modules/undici/lib/web/fetch/webidl.js:29:24)
    at appendHeader (/Users/punkpeye/Developer/punkpeye/glama/node_modules/.pnpm/undici@6.19.8/node_modules/undici/lib/web/fetch/headers.js:89:25)
    at Headers.append (/Users/punkpeye/Developer/punkpeye/glama/node_modules/.pnpm/undici@6.19.8/node_modules/undici/lib/web/fetch/headers.js:390:12)

If I enable http2 in fastify, then the requests fail with the above error.

punkpeye commented 3 weeks ago

Not sure if this is the solution, but refactoring createRemixHeaders helped.

(
  fastifyHeaders: FastifyRequest['headers'],
): Headers => {
  const headers = new Headers();

  for (const [key, value] of Object.entries(fastifyHeaders)) {
    if (key.startsWith(':')) {
      if (key === ':authority' && typeof value === 'string') {
        headers.set('host', value);
      }

      continue;
    }

    if (Array.isArray(value)) {
      for (const member of value) headers.append(key, member);
    } else if (value) {
      headers.append(key, value);
    }
  }

  return headers;
};
mcansh commented 3 weeks ago

wait jk, i got it by removing installGlobals

old what does your server look like? im not able to reproduce using the following ```ts import fs from "node:fs"; import process from "node:process"; import chalk from "chalk"; import { remixFastify } from "@mcansh/remix-fastify"; import { installGlobals } from "@remix-run/node"; import { fastify } from "fastify"; import sourceMapSupport from "source-map-support"; import getPort, { portNumbers } from "get-port"; installGlobals(); sourceMapSupport.install(); const app = fastify({ http2: true, https: { key: fs.readFileSync("server-key.pem"), cert: fs.readFileSync("server-cert.pem"), }, }); await app.register(remixFastify); const host = process.env.HOST === "true" ? "0.0.0.0" : "127.0.0.1"; const desiredPort = Number(process.env.PORT) || 3000; const portToUse = await getPort({ port: portNumbers(desiredPort, desiredPort + 100), }); let address = await app.listen({ port: portToUse, host }); if (portToUse !== desiredPort) { console.warn( chalk.yellow( `⚠️ Port ${desiredPort} is not available, using ${portToUse} instead.`, ), ); } console.log(chalk.green(`✅ app ready: ${address}`)); ```