Skip to content

Commit 04baa77

Browse files
committed
@tus/server: introduce options.exposedHeaders
1 parent 64cb30f commit 04baa77

File tree

4 files changed

+27
-2
lines changed

4 files changed

+27
-2
lines changed

packages/server/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ Allow `Forwarded`, `X-Forwarded-Proto`, and `X-Forwarded-Host` headers to overri
9898

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

101+
#### `options.exposedHeaders`
102+
103+
Additional headers sent in `Access-Control-Expose-Headers` (`string[]`).
104+
101105
#### `options.generateUrl`
102106

103107
Control how the upload URL is generated (`(req, { proto, host, path, id }) => string)`)

packages/server/src/server.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {EventEmitter} from 'node:events'
44
import type {ServerRequest} from 'srvx/types'
55
import {toNodeHandler} from 'srvx/node'
66
import debug from 'debug'
7-
import {EVENTS, ERRORS, EXPOSED_HEADERS, REQUEST_METHODS, TUS_RESUMABLE} from '@tus/utils'
7+
import {EVENTS, ERRORS, REQUEST_METHODS, TUS_RESUMABLE, HEADERS} from '@tus/utils'
88
import type {DataStore, Upload, CancellationContext} from '@tus/utils'
99

1010
import {GetHandler} from './handlers/GetHandler.js'
@@ -200,7 +200,10 @@ export class Server extends EventEmitter {
200200
'Access-Control-Allow-Origin',
201201
this.getCorsOrigin(req.headers.get('origin'))
202202
)
203-
headers.set('Access-Control-Expose-Headers', EXPOSED_HEADERS)
203+
headers.set(
204+
'Access-Control-Expose-Headers',
205+
[...HEADERS, this.options.exposedHeaders ?? []].join(', ')
206+
)
204207

205208
if (this.options.allowedCredentials === true) {
206209
headers.set('Access-Control-Allow-Credentials', 'true')

packages/server/src/test/Server.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ describe('Server', () => {
163163
})
164164
})
165165

166+
it('OPTIONS should return returns custom headers in Access-Control-Expose-Headers', (done) => {
167+
server.options.exposedHeaders = ['Custom-Header']
168+
169+
request(listener)
170+
.options('/')
171+
.expect(204, '', (err, res) => {
172+
res.headers.should.have.property('access-control-expose-headers')
173+
res.headers['access-control-expose-headers'].should.containEql('Custom-Header')
174+
server.options.exposedHeaders = []
175+
done(err)
176+
})
177+
})
178+
166179
it('OPTIONS should return returns custom headers in Access-Control-Allow-Credentials', (done) => {
167180
server.options.allowedCredentials = true
168181

packages/server/src/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ export type ServerOptions = {
3131
*/
3232
allowedHeaders?: string[]
3333

34+
/**
35+
* Additional headers sent in `Access-Control-Expose-Headers`.
36+
*/
37+
exposedHeaders?: string[]
38+
3439
/**
3540
* Set `Access-Control-Allow-Credentials` to true or false (the default)
3641
*/

0 commit comments

Comments
 (0)