Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions e2e/react-start/server-functions-global-middleware/src/start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import {
createMiddleware,
createServerOnlyFn,
} from '@tanstack/react-start'
import { getRequest } from '@tanstack/react-start/server'
import {
getRequest,
getResponseHeaders,
setResponseHeader,
setResponseHeaders,
} from '@tanstack/react-start/server'

// Use a WeakMap keyed by Request object for request-scoped tracking
// This is cleaner than global state and automatically garbage collects
Expand Down Expand Up @@ -49,6 +54,14 @@ export const loggingMiddleware = createMiddleware().server(async ({ next }) => {
})
})

// This is the middleware for issue #5407
export const headerMiddleware = createMiddleware().server(async ({ next }) => {
const headers = new Headers()
headers.set('X-Header-Middleware', 'Executed')
setResponseHeaders(headers)
return next()
})

// Global function middleware that should be deduped across server functions
export const globalFunctionMiddleware = createMiddleware({
type: 'function',
Expand Down Expand Up @@ -79,5 +92,5 @@ export const startInstance = createStart(() => ({
functionMiddleware: [globalFunctionMiddleware, globalFunctionMiddleware2],
// Request middleware - includes loggingMiddleware (issue #5239 scenario)
// AND the same loggingMiddleware is also attached to server functions
requestMiddleware: [loggingMiddleware],
requestMiddleware: [loggingMiddleware, headerMiddleware],
}))
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,11 @@ test.describe('Global middleware deduplication (issue #5239)', () => {
})
})
})

test.describe('Setting response headers in middleware', () => {
test('header is set', async ({ page }) => {
const response = await page.request.get('/')
const headers = response.headers()
expect(headers['x-header-middleware']).toBe('Executed')
})
})
2 changes: 1 addition & 1 deletion packages/start-server-core/src/request-response.ts
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ export function setResponseHeaders(
headers: TypedHeaders<ResponseHeaderMap>,
): void {
const event = getH3Event()
for (const [name, value] of Object.entries(headers)) {
for (const [name, value] of headers.entries()) {
event.res.headers.set(name, value)
}
}
Expand Down
Loading