Skip to content

Commit b15a72c

Browse files
committed
fix: add query strings to lambda@edge
1 parent a9b414e commit b15a72c

File tree

12 files changed

+13472
-41
lines changed

12 files changed

+13472
-41
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ coverage
66
sam-template.packaged.yaml
77
vendia-serverless-express-*.tgz
88
dist/
9-
examples/nextjs
9+
examples/nextjs
10+
examples/nestjs

__tests__/integration.js

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const bodyParser = require('body-parser')
55
const ejs = require('ejs').__express
66
const serverlessExpress = require('../src/index')
77
const {
8-
log,
98
makeEvent,
109
makeResponse,
1110
EACH_MATRIX
@@ -20,7 +19,7 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
2019
app = express()
2120
router = express.Router()
2221
app.use('/', router)
23-
serverlessExpressInstance = serverlessExpress({ app, log })
22+
serverlessExpressInstance = serverlessExpress({ app })
2423
})
2524

2625
test('handler returns promise', () => {
@@ -66,7 +65,6 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
6665
})
6766

6867
test('GET JSON', async () => {
69-
// TODO: Fix lambdaEdge query strings
7068
const multiValueQueryStringParameters = {
7169
singleNormal: ['1'],
7270
singleSpecial: ['hello world!'],
@@ -92,16 +90,14 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
9290
const response = await serverlessExpressInstance.handler(event)
9391
const expectedResponse = makeResponse({
9492
eventSourceName,
95-
body: eventSourceName === 'lambdaEdge'
96-
? '{}'
97-
: JSON.stringify({
98-
...queryStringParameters,
99-
arr: multiValueQueryStringParameters.arr
100-
}),
93+
body: JSON.stringify({
94+
...queryStringParameters,
95+
arr: multiValueQueryStringParameters.arr
96+
}),
10197
multiValueHeaders: {
10298
'content-length': ['82'],
103-
etag: eventSourceName === 'lambdaEdge' ? ['W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"'] : ['W/"52-QR4hWttXm/4xeZPYy7nze/EjYXg"'],
104-
'x-custom-header': eventSourceName === 'lambdaEdge' ? ['undefined'] : ['1']
99+
etag: ['W/"52-QR4hWttXm/4xeZPYy7nze/EjYXg"'],
100+
'x-custom-header': ['1']
105101
}
106102
})
107103
expect(response).toEqual(expectedResponse)
@@ -130,7 +126,7 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
130126
path: '/users',
131127
httpMethod: 'GET'
132128
})
133-
const serverlessExpressInstanceWithCallbackResolutionMode = serverlessExpress({ app, log, resolutionMode: 'CALLBACK' })
129+
const serverlessExpressInstanceWithCallbackResolutionMode = serverlessExpress({ app, resolutionMode: 'CALLBACK' })
134130
serverlessExpressInstanceWithCallbackResolutionMode.handler(event, {}, callback)
135131
})
136132

@@ -157,7 +153,7 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
157153
path: '/users',
158154
httpMethod: 'GET'
159155
})
160-
const serverlessExpressInstanceWithContextResolutionMode = serverlessExpress({ app, log, resolutionMode: 'CONTEXT' })
156+
const serverlessExpressInstanceWithContextResolutionMode = serverlessExpress({ app, resolutionMode: 'CONTEXT' })
161157
serverlessExpressInstanceWithContextResolutionMode.handler(event, context)
162158
})
163159

examples/lambda-edge/package-lock.json

Lines changed: 13424 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/lambda-edge/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
},
2525
"license": "Apache-2.0",
2626
"dependencies": {
27-
"@vendia/serverless-express": "^4.0.0",
27+
"@vendia/serverless-express": "^4.1.1",
2828
"body-parser": "^1.19.0",
2929
"compression": "^1.7.4",
3030
"cors": "^2.8.5",

examples/lambda-edge/src/lambda.js

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,4 @@
11
const serverlessExpress = require('@vendia/serverless-express')
22
const app = require('./app')
33

4-
// NOTE: If you get ERR_CONTENT_DECODING_FAILED in your browser, this is likely
5-
// due to a compressed response (e.g. gzip) which has not been handled correctly
6-
// by serverless-express and/or API Gateway. Add the necessary MIME types to
7-
// binaryMimeTypes below, then redeploy (`npm run package-deploy`)
8-
const binaryMimeTypes = [
9-
// '*/*'
10-
]
11-
12-
const se = serverlessExpress({
13-
app,
14-
binaryMimeTypes
15-
})
16-
17-
exports.handler = se.handler
4+
exports.handler = serverlessExpress({ app }).handler
-12.8 KB
Binary file not shown.

jest-helpers/lambda-edge-event.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ function makeLambdaEdgeEvent (values = {}) {
110110
const mergedEvent = mergeDeep(baseEvent, values)
111111

112112
if (!mergedEvent.request.uri) mergedEvent.request.uri = values.path
113+
114+
if (!mergedEvent.request.querystring && values.multiValueQueryStringParameters) {
115+
const multiValueQueryStringParametersToArray = []
116+
Object.entries(values.multiValueQueryStringParameters)
117+
.forEach(([qKey, qValues]) => {
118+
qValues.forEach(qValue => {
119+
multiValueQueryStringParametersToArray.push([qKey, qValue])
120+
})
121+
})
122+
const querystring = new URLSearchParams(multiValueQueryStringParametersToArray)
123+
mergedEvent.request.querystring = querystring.toString()
124+
}
125+
113126
if (!mergedEvent.request.method) mergedEvent.request.method = values.httpMethod
114127

115128
if (!mergedEvent.request.body.data) {
@@ -165,7 +178,6 @@ function makeLambdaEdgeResponse (values = {}) {
165178
values.bodyEncoding = values.isBase64Encoded ? 'base64' : 'text'
166179
delete values.isBase64Encoded
167180
const mergedResponse = mergeDeep(baseResponse, values)
168-
169181
if (values.body) {
170182
mergedResponse.body.data = values.body
171183
}

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@
6060
"jest": {
6161
"collectCoverageFrom": [
6262
"src/**"
63+
],
64+
"testPathIgnorePatterns": [
65+
"examples/nestjs"
6366
]
6467
},
6568
"devDependencies": {

src/event-sources/aws/lambda-edge.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1+
const url = require('url')
12
const { getEventBody } = require('../utils')
23

34
// Lambda@Edge fails if certain headers are returned
45
const RESPONSE_HEADERS_DENY_LIST = ['content-length']
56

67
function getRequestValuesFromLambdaEdgeEvent ({ event }) {
7-
const cloudFormationRequest = event.Records[0].cf.request
8+
const cloudFrontRequest = event.Records[0].cf.request
89
const {
910
headers: headersMap,
10-
uri: path,
11+
uri,
1112
method,
13+
querystring,
1214
body: requestBodyObject = {},
1315
clientIp
14-
} = cloudFormationRequest
16+
} = cloudFrontRequest
1517
let body = null
1618

1719
const headers = {}
@@ -29,7 +31,11 @@ function getRequestValuesFromLambdaEdgeEvent ({ event }) {
2931
headers['content-length'] = Buffer.byteLength(body, isBase64Encoded ? 'base64' : 'utf8')
3032
}
3133

32-
// TODO: include querystring params in path
34+
const path = url.format({
35+
pathname: uri,
36+
search: querystring
37+
})
38+
3339
const { host } = headers
3440
return {
3541
method,

src/logger.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
const {
2+
LOG_LEVEL = process.env.NODE_ENV === 'development' ? 'debug' : 'error'
3+
} = process.env
14
const logger = {
25
// TODO: allow users to set log level without having to provide the other log methods
3-
level: process.env.NODE_ENV === 'development' ? 'debug' : 'error',
6+
level: LOG_LEVEL,
47
error (message, additional) {
58
if (!logger.level.includes('debug', 'verbose', 'info', 'warn', 'error')) return
69
console.error({

0 commit comments

Comments
 (0)