Skip to content

appendAuthHeaders throws on immutable dev-asset responses #308

Closed

Description

@mdong1909

https://discord.com/channels/1475973262193459293/1479410313530179676/1545171663220645938

Bug report

Title: appendAuthHeaders throws "Can't modify immutable headers" on Vite
dev-asset responses, blanking pages-mode apps with auth enabled

Version: void@0.10.13 (dev server; vite dev via Vite+)

Summary: With defineAuth enabled in a pages-mode app, the dev server
returns 500 for Vite's own asset responses (/@vite/client, /@id/…,
/@fs/…, HMR modules) because appendAuthHeaders calls target.set(...) on
a Response whose headers are immutable. Every page renders blank in dev.
Reproduces with zero plugins — a fresh void init + defineAuth with
emailAndPassword is enough.

Where: dist/better-auth-shared-*.mjs

js function appendAuthHeaders(target, source) { if (!source) return; source.forEach((value, key) => { if (key.toLowerCase() === "set-cookie") { target.append(key, value); // throws on immutable headers return; } target.set(key, value); // throws on immutable headers }); }

Repro:

  1. npx void init (pages mode, React), add defineAuth(({ defaults }) => ({ ...defaults, emailAndPassword: { enabled: true } })).
  2. vp dev, open /.
  3. Console: TypeError: Can't modify immutable headers. from appendAuthHeaders; the page body is empty because /@vite/client returned 500.

Suggested fix: guard the header writes — auth headers are irrelevant on
asset responses, and dropping them beats failing the whole request:

js source.forEach((value, key) => { try { if (key.toLowerCase() === "set-cookie") { target.append(key, value); return; } target.set(key, value); } catch { // immutable response headers (Vite dev asset responses in pages mode) } });

Activity

  1. mdong1909 commented on Sep 4, 2026

    @mdong1909
    ContributorAuthor

    patch example from op

    diff --git a/dist/better-auth-shared-BQooDxbw.mjs b/dist/better-auth-shared-BQooDxbw.mjs
    index dffd76b7f502f273daf2c63cef3ad8c21b90e68b..454ba59eee004d34616f717b12a770c111b61762 100644
    --- a/dist/better-auth-shared-BQooDxbw.mjs
    +++ b/dist/better-auth-shared-BQooDxbw.mjs
    @@ -82,11 +82,17 @@ function resolveSocialProviders(env, configuredProviders) {
     function appendAuthHeaders(target, source) {
         if (!source) return;
         source.forEach((value, key) => {
    -        if (key.toLowerCase() === "set-cookie") {
    -            target.append(key, value);
    -            return;
    +        try {
    +            if (key.toLowerCase() === "set-cookie") {
    +                target.append(key, value);
    +                return;
    +            }
    +            target.set(key, value);
    +        } catch {
    +            // Immutable response headers (e.g. Vite dev asset responses in
    +            // pages mode). Auth headers are irrelevant for those responses;
    +            // dropping them beats throwing a 500 for the whole request.
             }
    -        target.set(key, value);
         });
     }
     function resolveUserConfig(userConfig, defaults, request, env, dialect) {
    
  2. mdong1909 commented on Sep 7, 2026

    @mdong1909
    ContributorAuthor

    fixed in #309

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions