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

Fix Invalid character in header ["Content-Disposition"] #30287

Merged
merged 35 commits into from Nov 1, 2021

Conversation

@ihmpavel
Copy link
Contributor Author

Hi, could some reviewer kindly have a look?
Thanks in advance 🙏

@timneutkens

Copy link
Member

@styfle styfle left a comment

Choose a reason for hiding this comment

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

Thanks!

Lets add a test for the invalid character so we know that this fixes it 👍

For example:

it('should handle non-ascii characters in image url', async () => {
const query = { w, q: 90, url: '/äöü.png' }
const res = await fetchViaHTTP(appPort, '/_next/image', query, {})
expect(res.status).toBe(200)
})

@@ -81,6 +81,7 @@
"chalk": "2.4.2",
"chokidar": "3.5.1",
"constants-browserify": "1.0.0",
"content-disposition": "0.5.3",
Copy link
Member

Choose a reason for hiding this comment

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

Can we ncc this and move it to devDependencies? Here's an example package being ncc'd

// eslint-disable-next-line camelcase
externals['amphtml-validator'] = 'next/dist/compiled/amphtml-validator'
export async function ncc_amphtml_validator(task, opts) {
await task
.source(
opts.src || relative(__dirname, require.resolve('amphtml-validator'))
)
.ncc({ packageName: 'amphtml-validator', externals })
.target('compiled/amphtml-validator')
}

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Moved to devDependencies and added to ncc

@ihmpavel
Copy link
Contributor Author

Thanks!

Lets add a test for the invalid character so we know that this fixes it 👍

For example:

it('should handle non-ascii characters in image url', async () => {
const query = { w, q: 90, url: '/äöü.png' }
const res = await fetchViaHTTP(appPort, '/_next/image', query, {})
expect(res.status).toBe(200)
})

I have updated tests with updated image name.

@ihmpavel ihmpavel requested review from ijjk and styfle October 27, 2021 10:41
@ihmpavel
Copy link
Contributor Author

@styfle Could you please take a look?

styfle
styfle previously approved these changes Nov 1, 2021
@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ihmpavel
Copy link
Contributor Author

ihmpavel commented Nov 1, 2021

@styfle That looks like the failing Jest tests and build are irrelevant to this PR (they were ok before). Could you please rerun the tests? (Maybe pulling latest canary is a right idea?)

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ihmpavel
Copy link
Contributor Author

ihmpavel commented Nov 1, 2021

@styfle For unknow reasons one test failed because of me (i do not know how), but the second one was not my fault. Could you please re-run everything? (Auto-build on Azure failed again...)

styfle
styfle previously approved these changes Nov 1, 2021
@ijjk

This comment has been minimized.

@ijjk
Copy link
Member

ijjk commented Nov 1, 2021

Failing test suites

Commit: 700f0f1

test/integration/image-component/unicode/test/index.test.js

  • Image Component Unicode Image URL > dev mode > should load static unicode image
  • Image Component Unicode Image URL > dev mode > should load internal unicode image
  • Image Component Unicode Image URL > dev mode > should load external unicode image
  • Image Component Unicode Image URL > server mode > should load static unicode image
  • Image Component Unicode Image URL > server mode > should load internal unicode image
  • Image Component Unicode Image URL > server mode > should load external unicode image
Expand output

● Image Component Unicode Image URL › dev mode › should load static unicode image

expect(received).toMatch(expected)

Expected pattern: /_next%2Fstatic%2Fmedia%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC(.+)png/
Received string:  "/_next/image?url=%2F_next%2Fstatic%2Fmedia%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.eba16dd4.png&w=828&q=75"

  21 |   it('should load static unicode image', async () => {
  22 |     const src = await browser.elementById('static').getAttribute('src')
> 23 |     expect(src).toMatch(
     |                 ^
  24 |       /_next%2Fstatic%2Fmedia%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC(.+)png/
  25 |     )
  26 |     const fullSrc = new URL(src, `http://localhost:${appPort}`)

  at Object.<anonymous> (integration/image-component/unicode/test/index.test.js:23:17)

● Image Component Unicode Image URL › dev mode › should load internal unicode image

expect(received).toMatch(expected)

Expected substring: "/_next/image?url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png"
Received string:    "/_next/image?url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.png&w=828&q=75"

  31 |   it('should load internal unicode image', async () => {
  32 |     const src = await browser.elementById('internal').getAttribute('src')
> 33 |     expect(src).toMatch(
     |                 ^
  34 |       '/_next/image?url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png'
  35 |     )
  36 |     const fullSrc = new URL(src, `http://localhost:${appPort}`)

  at Object.<anonymous> (integration/image-component/unicode/test/index.test.js:33:17)

● Image Component Unicode Image URL › dev mode › should load external unicode image

expect(received).toMatch(expected)

Expected substring: "/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png"
Received string:    "/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.png&w=828&q=75"

  41 |   it('should load external unicode image', async () => {
  42 |     const src = await browser.elementById('external').getAttribute('src')
> 43 |     expect(src).toMatch(
     |                 ^
  44 |       '/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png'
  45 |     )
  46 |     const fullSrc = new URL(src, `http://localhost:${appPort}`)

  at Object.<anonymous> (integration/image-component/unicode/test/index.test.js:43:17)

● Image Component Unicode Image URL › server mode › should load static unicode image

expect(received).toMatch(expected)

Expected pattern: /_next%2Fstatic%2Fmedia%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC(.+)png/
Received string:  "/_next/image?url=%2F_next%2Fstatic%2Fmedia%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.eba16dd4.png&w=828&q=75"

  21 |   it('should load static unicode image', async () => {
  22 |     const src = await browser.elementById('static').getAttribute('src')
> 23 |     expect(src).toMatch(
     |                 ^
  24 |       /_next%2Fstatic%2Fmedia%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC(.+)png/
  25 |     )
  26 |     const fullSrc = new URL(src, `http://localhost:${appPort}`)

  at Object.<anonymous> (integration/image-component/unicode/test/index.test.js:23:17)

● Image Component Unicode Image URL › server mode › should load internal unicode image

expect(received).toMatch(expected)

Expected substring: "/_next/image?url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png"
Received string:    "/_next/image?url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.png&w=828&q=75"

  31 |   it('should load internal unicode image', async () => {
  32 |     const src = await browser.elementById('internal').getAttribute('src')
> 33 |     expect(src).toMatch(
     |                 ^
  34 |       '/_next/image?url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png'
  35 |     )
  36 |     const fullSrc = new URL(src, `http://localhost:${appPort}`)

  at Object.<anonymous> (integration/image-component/unicode/test/index.test.js:33:17)

● Image Component Unicode Image URL › server mode › should load external unicode image

expect(received).toMatch(expected)

Expected substring: "/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png"
Received string:    "/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.png&w=828&q=75"

  41 |   it('should load external unicode image', async () => {
  42 |     const src = await browser.elementById('external').getAttribute('src')
> 43 |     expect(src).toMatch(
     |                 ^
  44 |       '/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%ADC.png'
  45 |     )
  46 |     const fullSrc = new URL(src, `http://localhost:${appPort}`)

  at Object.<anonymous> (integration/image-component/unicode/test/index.test.js:43:17)

@ihmpavel
Copy link
Contributor Author

ihmpavel commented Nov 1, 2021

@styfle I have run the tests successfully, accidentally added a letter (which caused tests to fail, but I did not notice until Test Integration (2)) and committed. I am really disappointed... On the other hand, everything required was run successfully... Fixed now...

@ijjk
Copy link
Member

ijjk commented Nov 1, 2021

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
buildDuration 18.1s 18.1s ⚠️ +88ms
buildDurationCached 3.9s 3.8s -32ms
nodeModulesSize 293 MB 293 MB ⚠️ +6.11 kB
Page Load Tests Overall increase ✓
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
/ failed reqs 0 0
/ total time (seconds) 2.872 2.883 ⚠️ +0.01
/ avg req/sec 870.48 867.03 ⚠️ -3.45
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.399 1.343 -0.06
/error-in-render avg req/sec 1787.28 1860.93 +73.65
Client Bundles (main, webpack, commons)
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
450.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42.2 kB 42.2 kB
main-HASH.js gzip 28 kB 28 kB
webpack-HASH.js gzip 1.45 kB 1.45 kB
Overall change 71.9 kB 71.9 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
polyfills-a4..dd70.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
_app-HASH.js gzip 1.23 kB 1.23 kB
_error-HASH.js gzip 194 B 194 B
amp-HASH.js gzip 312 B 312 B
css-HASH.js gzip 327 B 327 B
dynamic-HASH.js gzip 2.38 kB 2.38 kB
head-HASH.js gzip 350 B 350 B
hooks-HASH.js gzip 635 B 635 B
image-HASH.js gzip 4.44 kB 4.44 kB
index-HASH.js gzip 263 B 263 B
link-HASH.js gzip 1.87 kB 1.87 kB
routerDirect..HASH.js gzip 321 B 321 B
script-HASH.js gzip 383 B 383 B
withRouter-HASH.js gzip 318 B 318 B
334f979574ae..6f4.css gzip 106 B 106 B
Overall change 13.1 kB 13.1 kB
Client Build Manifests
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
_buildManifest.js gzip 459 B 459 B
Overall change 459 B 459 B
Rendered Page Sizes
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
index.html gzip 534 B 534 B
link.html gzip 547 B 547 B
withRouter.html gzip 527 B 527 B
Overall change 1.61 kB 1.61 kB

Default Build with SWC (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
buildDuration 19.6s 19.5s -103ms
buildDurationCached 3.8s 3.9s ⚠️ +76ms
nodeModulesSize 293 MB 293 MB ⚠️ +6.11 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
/ failed reqs 0 0
/ total time (seconds) 2.86 2.827 -0.03
/ avg req/sec 874.13 884.34 +10.21
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.347 1.356 ⚠️ +0.01
/error-in-render avg req/sec 1856 1843.86 ⚠️ -12.14
Client Bundles (main, webpack, commons)
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
450.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42.3 kB 42.3 kB
main-HASH.js gzip 28.2 kB 28.2 kB
webpack-HASH.js gzip 1.43 kB 1.43 kB
Overall change 72.1 kB 72.1 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
polyfills-a4..dd70.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
_app-HASH.js gzip 1.22 kB 1.22 kB
_error-HASH.js gzip 180 B 180 B
amp-HASH.js gzip 305 B 305 B
css-HASH.js gzip 321 B 321 B
dynamic-HASH.js gzip 2.38 kB 2.38 kB
head-HASH.js gzip 342 B 342 B
hooks-HASH.js gzip 622 B 622 B
image-HASH.js gzip 4.46 kB 4.46 kB
index-HASH.js gzip 256 B 256 B
link-HASH.js gzip 1.91 kB 1.91 kB
routerDirect..HASH.js gzip 314 B 314 B
script-HASH.js gzip 375 B 375 B
withRouter-HASH.js gzip 309 B 309 B
334f979574ae..6f4.css gzip 106 B 106 B
Overall change 13.1 kB 13.1 kB
Client Build Manifests
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
_buildManifest.js gzip 460 B 460 B
Overall change 460 B 460 B
Rendered Page Sizes
vercel/next.js canary ihmpavel/next.js image-content-disposition Change
index.html gzip 535 B 535 B
link.html gzip 548 B 548 B
withRouter.html gzip 529 B 529 B
Overall change 1.61 kB 1.61 kB
Commit: 8e13629

@ihmpavel
Copy link
Contributor Author

ihmpavel commented Nov 1, 2021

@styfle Can be merged? 🤩

@styfle styfle merged commit 2027d1f into vercel:canary Nov 1, 2021
timneutkens pushed a commit to timneutkens/next.js that referenced this pull request Nov 2, 2021
…ercel#30287)

* Image content disposition

* Add tests

* Fixed import

* Add TS types

* Revert readme.md

* Alphabet sorting

* Compile `content-disposition`

* Rename for tests

* Fix test

* Fix accidentally added letter

Co-authored-by: Steven <steven@ceriously.com>
@vercel vercel locked as resolved and limited conversation to collaborators Jan 27, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
3 participants