diff --git a/.changeset/twenty-windows-raise.md b/.changeset/twenty-windows-raise.md new file mode 100644 index 00000000..3ac3e78a --- /dev/null +++ b/.changeset/twenty-windows-raise.md @@ -0,0 +1,5 @@ +--- +'@hono/react-renderer': patch +--- + +fix: overwriting headers when stream is enabled diff --git a/packages/react-renderer/src/react-renderer.ts b/packages/react-renderer/src/react-renderer.ts index 90941997..e83bf916 100644 --- a/packages/react-renderer/src/react-renderer.ts +++ b/packages/react-renderer/src/react-renderer.ts @@ -30,15 +30,15 @@ const createRenderer = React.createElement(RequestContext.Provider, { value: c }, node), options.readableStreamOptions ) - return c.body(stream, { - headers: - options.stream === true - ? { - 'Transfer-Encoding': 'chunked', - 'Content-Type': 'text/html; charset=UTF-8', - } - : options.stream, - }) + if (options.stream === true) { + c.header('Transfer-Encoding', 'chunked') + c.header('Content-Type', 'text/html; charset=UTF-8') + } else { + for (const [key, value] of Object.entries(options.stream)) { + c.header(key, value) + } + } + return c.body(stream) } else { const docType = typeof options?.docType === 'string' diff --git a/packages/react-renderer/test/react-renderer.test.tsx b/packages/react-renderer/test/react-renderer.test.tsx index f7a07681..048b8df4 100644 --- a/packages/react-renderer/test/react-renderer.test.tsx +++ b/packages/react-renderer/test/react-renderer.test.tsx @@ -105,6 +105,23 @@ describe('Basic', () => { '

Hello

' ) }) + + it('Should return as streaming content with headers added in a handler', async () => { + const app = new Hono() + app.use(reactRenderer(({ children }) => <>{children}, { stream: true })) + app.get('/', (c) => { + c.header('X-Message-Set', 'Hello') + c.header('X-Message-Append', 'Hello', { append: true }) + return c.render(

Hi

, { title: 'Hi' }) + }) + const res = await app.request('/') + expect(res.status).toBe(200) + expect(res.headers.get('Transfer-Encoding')).toBe('chunked') + expect(res.headers.get('Content-Type')).toBe('text/html; charset=UTF-8') + expect(res.headers.get('X-Message-Set')).toBe('Hello') + expect(res.headers.get('X-Message-Append')).toBe('Hello') + expect(await res.text()).toBe('

Hi

') + }) }) describe('Streaming', () => {