Skip to content

Commit

Permalink
feat: add utilities for http headers
Browse files Browse the repository at this point in the history
  • Loading branch information
nozomuikuta committed Aug 2, 2022
1 parent 56bfe0a commit aadd4b0
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 0 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ Instead of adding helpers to `req` and `res`, h3 exposes them as composable util
- `useQuery(req)`
- `send(res, data, type?)`
- `sendRedirect(res, location, code=302)`
- `getHeaders(req)`
- `getHeader(req, name)`
- `setHeader(res, name, value)`
- `appendHeader(res, name, value)`
- `createError({ statusCode, statusMessage, data? })`
- `sendError(res, error, debug?)`
Expand Down
15 changes: 15 additions & 0 deletions src/utils/request.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { IncomingMessage } from 'http'
import type { IncomingHttpHeaders } from 'http'
import { getQuery as _getQuery } from 'ufo'
import { createError } from '../error'
import type { HTTPMethod } from '../types'
Expand Down Expand Up @@ -43,3 +45,16 @@ export function assertMethod (event: CompatibilityEvent, expected: HTTPMethod |
})
}
}

export function getHeaders (event: CompatibilityEvent): IncomingHttpHeaders {
return event instanceof IncomingMessage
? event.headers
: event.req.headers
}

export function getHeader (event: CompatibilityEvent, name: string): IncomingHttpHeaders[string] {
const headers = getHeaders(event)
const value = headers[name.toLowerCase()]

return value
}
5 changes: 5 additions & 0 deletions src/utils/response.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { OutgoingMessage } from 'http'
import { createError } from '../error'
import type { CompatibilityEvent } from '../event'
import { MIMES } from './consts'
Expand Down Expand Up @@ -34,6 +35,10 @@ export function sendRedirect (event: CompatibilityEvent, location: string, code
return send(event, html, MIMES.html)
}

export function setHeader (event: CompatibilityEvent, name: string, value: Parameters<OutgoingMessage['setHeader']>[1]): void {
event.res.setHeader(name, value)
}

export function appendHeader (event: CompatibilityEvent, name: string, value: string): void {
let current = event.res.getHeader(name)

Expand Down
71 changes: 71 additions & 0 deletions test/header.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import supertest, { SuperTest, Test } from 'supertest'
import { describe, it, expect, beforeEach } from 'vitest'
import { createApp, App, getHeaders, getHeader, setHeader, appendHeader } from '../src'

describe('', () => {
let app: App
let request: SuperTest<Test>

beforeEach(() => {
app = createApp({ debug: false })
request = supertest(app)
})

describe('getHeaders', () => {
it('can return request headers', async () => {
app.use('/', (request) => {
const headers = getHeaders(request)
expect(headers).toEqual(request.headers)
})
await request.get('/').set('Accept', 'application/json')
})
})

describe('getHeader', () => {
it('can return a value of request header corresponding to the given name', async () => {
app.use('/', (request) => {
expect(getHeader(request, 'accept')).toEqual('application/json')
expect(getHeader(request, 'Accept')).toEqual('application/json')
})
await request.get('/').set('Accept', 'application/json')
})
})

describe('setHeader', () => {
it('can set a string value to response header corresponding to the given name', async () => {
app.use('/', (request) => {
setHeader(request, 'Nuxt-HTTP-Header', 'string-value')
})
const result = await request.get('/')
expect(result.headers['nuxt-http-header']).toEqual('string-value')
})

it('can set a number value to response header corresponding to the given name', async () => {
app.use('/', (request) => {
setHeader(request, 'Nuxt-HTTP-Header', 12345)
})
const result = await request.get('/')
expect(result.headers['nuxt-http-header']).toEqual('12345')
})

it('can set an array value to response header corresponding to the given name', async () => {
app.use('/', (request) => {
setHeader(request, 'Nuxt-HTTP-Header', ['value 1', 'value 2'])
setHeader(request, 'Nuxt-HTTP-Header', ['value 3', 'value 4'])
})
const result = await request.get('/')
expect(result.headers['nuxt-http-header']).toEqual('value 3, value 4')
})
})

describe('appendHeader', () => {
it('can append a value to response header corresponding to the given name', async () => {
app.use('/', (request) => {
appendHeader(request, 'Nuxt-HTTP-Header', 'value 1')
appendHeader(request, 'Nuxt-HTTP-Header', 'value 2')
})
const result = await request.get('/')
expect(result.headers['nuxt-http-header']).toEqual('value 1, value 2')
})
})
})

0 comments on commit aadd4b0

Please sign in to comment.