Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
4 changes: 4 additions & 0 deletions packages/server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ Allow `Forwarded`, `X-Forwarded-Proto`, and `X-Forwarded-Host` headers to overri

Additional headers sent in `Access-Control-Allow-Headers` (`string[]`).

#### `options.exposedHeaders`

Additional headers sent in `Access-Control-Expose-Headers` (`string[]`).

#### `options.generateUrl`

Control how the upload URL is generated (`(req, { proto, host, path, id }) => string)`)
Expand Down
7 changes: 5 additions & 2 deletions packages/server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {EventEmitter} from 'node:events'
import type {ServerRequest} from 'srvx/types'
import {toNodeHandler} from 'srvx/node'
import debug from 'debug'
import {EVENTS, ERRORS, EXPOSED_HEADERS, REQUEST_METHODS, TUS_RESUMABLE} from '@tus/utils'
import {EVENTS, ERRORS, REQUEST_METHODS, TUS_RESUMABLE, HEADERS} from '@tus/utils'
import type {DataStore, Upload, CancellationContext} from '@tus/utils'

import {GetHandler} from './handlers/GetHandler.js'
Expand Down Expand Up @@ -200,7 +200,10 @@ export class Server extends EventEmitter {
'Access-Control-Allow-Origin',
this.getCorsOrigin(req.headers.get('origin'))
)
headers.set('Access-Control-Expose-Headers', EXPOSED_HEADERS)
headers.set(
'Access-Control-Expose-Headers',
[...HEADERS, this.options.exposedHeaders ?? []].join(', ')
)

if (this.options.allowedCredentials === true) {
headers.set('Access-Control-Allow-Credentials', 'true')
Expand Down
13 changes: 13 additions & 0 deletions packages/server/src/test/Server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,19 @@ describe('Server', () => {
})
})

it('OPTIONS should return returns custom headers in Access-Control-Expose-Headers', (done) => {
server.options.exposedHeaders = ['Custom-Header']

request(listener)
.options('/')
.expect(204, '', (err, res) => {
res.headers.should.have.property('access-control-expose-headers')
res.headers['access-control-expose-headers'].should.containEql('Custom-Header')
server.options.exposedHeaders = []
done(err)
})
})

it('OPTIONS should return returns custom headers in Access-Control-Allow-Credentials', (done) => {
server.options.allowedCredentials = true

Expand Down
5 changes: 5 additions & 0 deletions packages/server/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ export type ServerOptions = {
*/
allowedHeaders?: string[]

/**
* Additional headers sent in `Access-Control-Expose-Headers`.
*/
exposedHeaders?: string[]

/**
* Set `Access-Control-Allow-Credentials` to true or false (the default)
*/
Expand Down