Skip to content

Commit 5cb096c

Browse files
authored
Merge pull request #126 from proxyco/issue-109
#109 Implement a whitelist for headers as an option to LambdaAPI
2 parents b2a8503 + 3df6a24 commit 5cb096c

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export declare interface Options {
9494
};
9595
serializer?: SerializerFunction;
9696
version?: string;
97+
errorHeaderWhitelist?: string[];
9798
}
9899

99100
export declare class Request {

index.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class API {
2626
this._callbackName = props && props.callback ? props.callback.trim() : 'callback'
2727
this._mimeTypes = props && props.mimeTypes && typeof props.mimeTypes === 'object' ? props.mimeTypes : {}
2828
this._serializer = props && props.serializer && typeof props.serializer === 'function' ? props.serializer : JSON.stringify
29+
this._errorHeaderWhitelist = props && (props.errorHeaderWhitelist || []).map(header => header.toLowerCase())
2930

3031
// Set sampling info
3132
this._sampleCounts = {}
@@ -253,8 +254,17 @@ class API {
253254
// Error messages should never be base64 encoded
254255
response._isBase64 = false
255256

256-
// Strip the headers (TODO: find a better way to handle this)
257-
response._headers = {}
257+
// Strip the headers, keep whitelist
258+
const strippedHeaders = Object.entries(response._headers).reduce((acc, [headerName, value]) => {
259+
if (!this._errorHeaderWhitelist.includes(headerName.toLowerCase())) return acc
260+
261+
return {
262+
...acc,
263+
[headerName]: value
264+
}
265+
}, {})
266+
267+
response._headers = strippedHeaders
258268

259269
let message
260270

test/headers.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
const expect = require('chai').expect // Assertion library
44

55
// Init API instance
6-
const api = require('../index')({ version: 'v1.0' })
6+
7+
const api = require('../index')({
8+
version: 'v1.0',
9+
errorHeaderWhitelist: [
10+
'Access-Control-Allow-Origin',
11+
'Access-Control-Allow-Methods',
12+
]
13+
})
714

815
let event = {
916
httpMethod: 'get',
@@ -93,6 +100,13 @@ api.get('/removeHeader', function(req,res) {
93100
})
94101
})
95102

103+
api.get('/whitelistHeaders', function(req,res) {
104+
res.status(200).header('TestStrippedHeader', 'RemoveMe')
105+
res.status(200).header('access-control-allow-methods', ['GET, OPTIONS'])
106+
res.status(200).header('access-control-allow-origin', ['example.com'])
107+
throw new Error('TestError')
108+
})
109+
96110
api.get('/cors', function(req,res) {
97111
res.cors().json({})
98112
})
@@ -244,6 +258,20 @@ describe('Header Tests:', function() {
244258
})
245259
}) // end it
246260

261+
it('Pass whitelisted headers on error', async function() {
262+
let _event = Object.assign({},event,{ path: '/whitelistHeaders'})
263+
let result = await new Promise(r => api.run(_event,{},(e,res) => { r(res) }))
264+
expect(result).to.deep.equal({
265+
multiValueHeaders: {
266+
'content-type': ['application/json'],
267+
'access-control-allow-methods': ['GET, OPTIONS'],
268+
'access-control-allow-origin': ['example.com'],
269+
}, statusCode: 500,
270+
body: '{"error":"TestError"}',
271+
isBase64Encoded: false
272+
})
273+
}) // end it
274+
247275
}) // end Standard tests
248276

249277
describe('CORS Tests:', function() {

0 commit comments

Comments
 (0)