Visitar URL original
Releases · expressjs/express · GitHub
Skip to content

Releases: expressjs/express

v5.3.0

Choose a tag to compare

@UlisesGascon UlisesGascon released this 09 Oct 12:50
cf6722b

Highlights

🐞 Bug fixes

  • Fixed HTTP header conflict between Content-Length and Transfer-Encoding in res.send - by @YuryShkoda in #4893

    Fixed the behavior of res.send() to prevent conflicts between Content-Length and Transfer-Encoding HTTP headers in responses. The Content-Length header in res.send() is now only added when a Transfer-Encoding header is not present, complying with the HTTP specification that states both headers should not coexist in the same response. ETag generation is unaffected by the presence of a Transfer-Encoding header - by @cuishuang in #7459

🚀 Improvements

  • Allow conditional revalidation for QUERY requests. req.fresh previously only validated freshness for GET and HEAD requests, so QUERY responses never returned 304 despite a matching validator. Since QUERY is a safe, idempotent, and cacheable method that supports conditional requests, it is now included in the freshness check - by @Cherry in #7366

    // QUERY /reports with If-None-Match: "12345"
    app.query('/reports', (req, res) => {
      res.set('ETag', '"12345"');
      res.send(results); // now responds 304 Not Modified
    });
  • Improve HTML structure in res.redirect() responses when HTML format is accepted by adding <!DOCTYPE html>, <title>, and <body> tags for better browser compatibility - by @Bernice55231 in #5167

  • When calling app.render with options set to null, the locals object is handled correctly, preventing unexpected errors and making the method behave the same as when options is omitted or an empty object is passed - by AkaHarshit in #6903

    app.render('index', null, callback); // now works as expected
  • Upgrade content-type to ^2.0.0, bringing a faster parser (~1.5x quicker Content-Type parsing/formatting in res.send()) along with a behavior change: res.send() now keeps any existing parameters when adding the charset and no longer throws on a Content-Type that fails to parse. type-is is upgraded to ^2.1.0 as part of the same change - by @blakeembrey in #7234

    res.set('Content-Type', 'text/plain; foo=bar').send('hey');
    // -> Content-Type: text/plain; foo=bar; charset=utf-8
  • The default error handler now logs the full error object instead of only its stack trace, so nested details such as Error.cause and library-specific properties (e.g. Sequelize's parent/original) are no longer swallowed - by @Nitin-Mohapatra in #6464

  • Upgrade content-disposition to ^2.0.1, which changes the Content-Disposition header emitted by res.download(), res.attachment(), and res.sendFile(): file names that are valid HTTP tokens are no longer wrapped in quotes. This is equivalent per RFC 6266, but applications asserting on the exact header bytes should update their expectations - by @blakeembrey in #7233

    res.attachment('user.html');
    // before -> Content-Disposition: attachment; filename="user.html"
    // after  -> Content-Disposition: attachment; filename=user.html
  • Upgrade body-parser to ^2.3.0, which fixes CVE-2026-12590 (GHSA-v422-hmwv-36x6): an invalid limit option value caused request body size enforcement to be silently disabled (fail-open), allowing a denial of service via arbitrarily large payloads. Invalid limit values now throw at parser initialization instead of being ignored - by @Mayvis in #7390

⚡ Performance

  • Avoid duplicate Content-Type header processing in res.send() when sending string responses without an explicit Content-Type header - by @bjohansebas in #6991

What's Changed

Read more

v4.22.2

Choose a tag to compare

@jonchurch jonchurch released this 11 May 18:54

What's Changed

  • fix: restore >20 array parsing for req.query repeated keys (8d09bfe6)
    • This also unifies array-cap behavior across notations. Indexed notation (a[0]=...) was historically capped at qs's default arrayLimit of 20 even in older qs versions; after this change it also allows up to 1000 items.
  • deps: qs@~6.15.1
  • deps: body-parser@~1.20.5

New Contributors

Full Changelog: v4.22.1...v4.22.2

v5.2.1

Choose a tag to compare

@jonchurch jonchurch released this 01 Dec 20:54

What's Changed

Important

The prior release (5.2.0) included an erroneous breaking change related to the extended query parser. There is no actual security vulnerability associated with this behavior (CVE-2024-51999 has been rejected). The change has been fully reverted in this release.

Full Changelog: v5.2.0...v5.2.1

v5.2.0

Choose a tag to compare

@UlisesGascon UlisesGascon released this 01 Dec 16:21
4007ad1

Important: Security

What's Changed

New Contributors

Full Changelog: v5.1.0...v5.2.0

v4.22.1

Choose a tag to compare

@jonchurch jonchurch released this 01 Dec 20:55

What's Changed

Important

The prior release (4.22.0) included an erroneous breaking change related to the extended query parser. There is no actual security vulnerability associated with this behavior (CVE-2024-51999 has been rejected). The change has been fully reverted in this release.

Full Changelog: 4.22.0...v4.22.1

4.22.0

Choose a tag to compare

@UlisesGascon UlisesGascon released this 01 Dec 16:19
49744ab

Important: Security

What's Changed

Full Changelog: 4.21.2...4.22.0

5.0.1

Choose a tag to compare

@UlisesGascon UlisesGascon released this 08 Oct 19:41
d14b2de

What's Changed

Full Changelog: v5.0.0...5.0.1

v5.1.0

Choose a tag to compare

@wesleytodd wesleytodd released this 31 Mar 14:04

What's Changed

New Contributors

Full Changelog: 5.0.1...v5.1.0

4.21.2

Choose a tag to compare

@jonchurch jonchurch released this 05 Dec 22:41
1faf228

What's Changed

Full Changelog: 4.21.1...4.21.2

4.21.1

Choose a tag to compare

@UlisesGascon UlisesGascon released this 08 Oct 18:38
8e229f9

What's Changed

Full Changelog: 4.21.0...4.21.1