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

Serverless loader: handle empty request url #10953

Closed
wants to merge 1 commit into from
Closed

Serverless loader: handle empty request url #10953

wants to merge 1 commit into from

Conversation

plumdog
Copy link

@plumdog plumdog commented Mar 10, 2020

I found this when deploying to AWS API Gateway (via https://github.com/vincent-herlemont/next-aws-lambda-webpack-plugin to generate code for each AWS Lambda).

I found that the value of req.url could be '', and that this meant that parsedUrl.pathname was null, and so this errored. I think this was introduced in #10261, so this issue exists from 9.2.2 onward.

For a bit more context: AWS API Gateway gives a URL like https://identifier123.execute-api.eu-west-1.amazonaws.com/prod/ where "prod" here is the "stage name". Requests both with and without the trailing slash invoke the root Lambda function, with the value of req.url being '/' and '' respectively.

It might be that this is an oddity specific to API Gateway (or how I have deployed code to API Gateway) or it could be something that occurs more widely.

@ijjk
Copy link
Member

ijjk commented Mar 11, 2020

Stats from current PR

Default Server Mode
General Overall increase ⚠️
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
buildDuration 9.2s 9.4s ⚠️ +243ms
nodeModulesSize 56.5 MB 56.5 MB ⚠️ +44 B
Client Bundles (main, webpack, commons)
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
main-HASH.js gzip 5.77 kB 5.77 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..cfaa.js gzip 9.77 kB 9.77 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 55.4 kB 55.4 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
main-HASH.module.js gzip 4.78 kB 4.78 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.71 kB 6.71 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 51.4 kB 51.4 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
polyfills-HASH.js gzip 18.9 kB 18.9 kB
Overall change 18.9 kB 18.9 kB
Client Pages
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_app.js gzip 1.09 kB 1.09 kB
_error.js gzip 2.96 kB 2.96 kB
hooks.js gzip 664 B 664 B
index.js gzip 222 B 222 B
link.js gzip 1.89 kB 1.89 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 7.38 kB 7.38 kB
Client Pages Modern
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_app.module.js gzip 594 B 594 B
_error.module.js gzip 2.06 kB 2.06 kB
hooks.module.js gzip 370 B 370 B
index.module.js gzip 212 B 212 B
link.module.js gzip 1.48 kB 1.48 kB
routerDirect..dule.js gzip 271 B 271 B
withRouter.m..dule.js gzip 270 B 270 B
Overall change 5.26 kB 5.26 kB
Client Build Manifests
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
index.html gzip 916 B 916 B
link.html gzip 925 B 925 B
withRouter.html gzip 914 B 914 B
Overall change 2.75 kB 2.75 kB

Serverless Mode (Decrease detected ✓)
General Overall increase ⚠️
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
buildDuration 9.9s 10s ⚠️ +126ms
nodeModulesSize 56.5 MB 56.5 MB ⚠️ +44 B
Client Bundles (main, webpack, commons)
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
main-HASH.js gzip 5.77 kB 5.77 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..cfaa.js gzip 9.77 kB 9.77 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 55.4 kB 55.4 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
main-HASH.module.js gzip 4.78 kB 4.78 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.71 kB 6.71 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 51.4 kB 51.4 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
polyfills-HASH.js gzip 18.9 kB 18.9 kB
Overall change 18.9 kB 18.9 kB
Client Pages
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_app.js gzip 1.09 kB 1.09 kB
_error.js gzip 2.96 kB 2.96 kB
hooks.js gzip 664 B 664 B
index.js gzip 222 B 222 B
link.js gzip 1.89 kB 1.89 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 7.38 kB 7.38 kB
Client Pages Modern
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_app.module.js gzip 594 B 594 B
_error.module.js gzip 2.06 kB 2.06 kB
hooks.module.js gzip 370 B 370 B
index.module.js gzip 212 B 212 B
link.module.js gzip 1.48 kB 1.48 kB
routerDirect..dule.js gzip 271 B 271 B
withRouter.m..dule.js gzip 270 B 270 B
Overall change 5.26 kB 5.26 kB
Client Build Manifests
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall decrease ✓
zeit/next.js canary plumdog/next.js handle-index-no-trailing-slash Change
_error.js gzip 293 kB 293 kB -397 B
404.html gzip 1.32 kB 1.32 kB
hooks.html gzip 956 B 956 B
index.js gzip 293 kB 293 kB ⚠️ +298 B
link.js gzip 301 kB 301 kB ⚠️ +26 B
routerDirect.js gzip 299 kB 300 kB ⚠️ +210 B
withRouter.js gzip 300 kB 299 kB -209 B
Overall change 1.49 MB 1.49 MB -72 B

@timneutkens
Copy link
Member

Seems like a bug in the specific implementation that you're using though, cc @ijjk can review this.

@@ -262,7 +262,7 @@ const nextServerlessLoader: loader.Loader = function() {

const parsedUrl = handleRewrites(parse(req.url, true))

if (parsedUrl.pathname.match(/_next\\/data/)) {
if (parsedUrl.pathname && parsedUrl.pathname.match(/_next\\/data/)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure that this should ever be the case with a proper set-up. On ZEIT Now we ensure that the req.url is always valid. It looks like this section of code isn't making sure to set req.url to / when doing the replace so this makes me think the issue should be moved to that repo 🤔

@@ -315,6 +315,11 @@ const runTests = (dev = false, looseMode = false) => {
expect(data.pageProps.params).toEqual({})
})

it('should not error at the root with no trailing slash', async () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test doesn't fail without the above change due to this not causing req.url to be empty

@plumdog
Copy link
Author

plumdog commented Mar 12, 2020

OK, so if I understand correctly, while it's true that the bit of code I found doesn't handle req.url being '', this is because the thing invoking the code in this package shouldn't let req.url be ''.

So I suppose if there's a fix needed in this repo it would be to check (probably early in request handling) if req.url is not as expected and error with an appropriate message, not to change the line of code that I changed?

@timneutkens
Copy link
Member

So I suppose if there's a fix needed in this repo it would be to check (probably early in request handling) if req.url is not as expected and error with an appropriate message, not to change the line of code that I changed?

Correct

@plumdog
Copy link
Author

plumdog commented Mar 12, 2020

@timneutkens ok, understood. Many thanks for explaining, and I'll follow with the other project.

@plumdog plumdog closed this Mar 12, 2020
@plumdog plumdog deleted the handle-index-no-trailing-slash branch March 12, 2020 11:13
@vercel vercel locked as resolved and limited conversation to collaborators Jan 31, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants