Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Causing several bugs when empty headers #462

Closed
codpot opened this issue Sep 23, 2021 · 1 comment · Fixed by #463
Closed

Causing several bugs when empty headers #462

codpot opened this issue Sep 23, 2021 · 1 comment · Fixed by #463
Labels

Comments

@codpot
Copy link
Contributor

codpot commented Sep 23, 2021

Due to Node.js http.IncomingMessage message.headers is Object, Express.js also returning {} when empty http headers.

https://nodejs.org/api/http.html#http_message_headers

https://github.com/expressjs/express/blob/06d11755c99fe4c1cddf8b889a687448b568472d/lib/request.js#L38

https://github.com/expressjs/express/blob/06d11755c99fe4c1cddf8b889a687448b568472d/lib/request.js#L82

const express = require('express');
const app = express();

app.use((req, res, next) => {
  console.log(req.headers);
  next();
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(5000);
curl -v http:https://localhost:5000/ -H 'User-Agent:' -H 'Accept:' -H 'Host:'

image

image

So that, several express based libraries treat Express.js req.headers as Nonnullable Object.

Following line cause problem.

https://github.com/vendia/serverless-express/blob/6adac653fe1daf1dd44ff6aa17dbf08f07662173/src/event-sources/utils.js#L36

AWS Console -> API Gateway -> APIs -> Resources -> Test with empty Headers causing problems.

2021-09-23T08:52:34.010Z	08748566-1f43-409d-9f2b-0b1fc9cf805a	ERROR	TypeError: Cannot read property 'origin' of null
    at /var/task/node_modules/cors/lib/index.js:219:40
    at optionsCallback (/var/task/node_modules/cors/lib/index.js:199:9)
    at corsMiddleware (/var/task/node_modules/cors/lib/index.js:204:7)
    at Layer.handle [as handle_request] (/var/task/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/var/task/node_modules/express/lib/router/index.js:317:13)
    at /var/task/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/var/task/node_modules/express/lib/router/index.js:335:12)
    at next (/var/task/node_modules/express/lib/router/index.js:275:10)
    at /var/task/dist/src/lambda/main.js:18:9
    at Layer.handle [as handle_request] (/var/task/node_modules/express/lib/router/layer.js:95:5)
2021-09-23T08:07:35.502Z	689819f8-4baf-4a91-9a0a-9206c111b24c	ERROR	TypeError: Cannot read property 'if-modified-since' of null
    at fresh (/var/task/node_modules/fresh/index.js:35:33)
    at IncomingMessage.fresh (/var/task/node_modules/express/lib/request.js:477:12)
    at ServerResponse.send (/var/task/node_modules/express/lib/response.js:206:11)
    at /var/task/node_modules/@nestjs/swagger/dist/swagger-module.js:37:54
    at Layer.handle [as handle_request] (/var/task/node_modules/express/lib/router/layer.js:95:5)
    at next (/var/task/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/var/task/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/var/task/node_modules/express/lib/router/layer.js:95:5)
    at /var/task/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/var/task/node_modules/express/lib/router/index.js:335:12)

Also, tested with POST method with empty headers and non-empty body causing problem in serverless-express.

https://github.com/vendia/serverless-express/blob/6adac653fe1daf1dd44ff6aa17dbf08f07662173/src/event-sources/utils.js#L44

2021-09-23T08:54:32.228Z	787d03d9-ec52-49cf-96ea-762d875bea70	ERROR	Unhandled Promise Rejection 	
{
    "errorType": "Runtime.UnhandledPromiseRejection",
    "errorMessage": "TypeError: Cannot set property 'content-length' of null",
    "reason": {
        "errorType": "TypeError",
        "errorMessage": "Cannot set property 'content-length' of null",
        "stack": [
            "TypeError: Cannot set property 'content-length' of null",
            "    at getRequestValuesFromEvent (/var/task/node_modules/@vendia/serverless-express/src/event-sources/utils.js:44:31)",
            "    at Object.getRequestValuesFromApiGatewayEvent [as getRequest] (/var/task/node_modules/@vendia/serverless-express/src/event-sources/aws/api-gateway-v1.js:3:60)",
            "    at forwardRequestToNodeServer (/var/task/node_modules/@vendia/serverless-express/src/transport.js:133:37)",
            "    at /var/task/node_modules/@vendia/serverless-express/src/configure.js:71:9",
            "    at new Promise (<anonymous>)",
            "    at proxy (/var/task/node_modules/@vendia/serverless-express/src/configure.js:58:12)",
            "    at handler (/var/task/node_modules/@vendia/serverless-express/src/configure.js:95:12)",
            "    at Runtime.handler (/var/task/dist/src/lambda/main.js:53:12)",
            "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
        ]
    },
    "promise": {},
    "stack": [
        "Runtime.UnhandledPromiseRejection: TypeError: Cannot set property 'content-length' of null",
        "    at process.<anonymous> (/var/runtime/index.js:35:15)",
        "    at process.emit (events.js:400:28)",
        "    at process.emit (domain.js:470:12)",
        "    at processPromiseRejections (internal/process/promises.js:245:33)",
        "    at processTicksAndRejections (internal/process/task_queues.js:96:32)"
    ]
}

TL;DR
When event.multiValueHeaders and event.headers are null, headers need to return {} not null.

codpot added a commit to codpot/serverless-express that referenced this issue Sep 23, 2021
Due to in several express.js libraries treats req.headers as NonNullable Object,
when event headers is null causing bugs.

When incoming headers from API Gateway is null, it should transform to {}.

Fix CodeGenieApp#462
brett-vendia pushed a commit that referenced this issue Oct 13, 2021
Due to in several express.js libraries treats req.headers as NonNullable Object,
when event headers is null causing bugs.

When incoming headers from API Gateway is null, it should transform to {}.

Fix #462
github-actions bot pushed a commit that referenced this issue Oct 13, 2021
## [4.5.1](v4.5.0...v4.5.1) (2021-10-13)

### Bug Fixes

* bug when empty event headers ([#462](#462)) ([#463](#463)) ([2b66164](2b66164))
@github-actions
Copy link

🎉 This issue has been resolved in version 4.5.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

OneDev0411 added a commit to OneDev0411/serverless-express that referenced this issue Mar 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant