Skip to content

Commit 61ccf2e

Browse files
Cherrybjohansebas
andauthored
feat: allow conditional revalidation for QUERY requests (v4) (#7377)
* feat: allow conditional revalidation for QUERY requests * docs: history --------- Co-authored-by: Sebastian Beltran <bjohansebas@gmail.com>
1 parent 715101b commit 61ccf2e

3 files changed

Lines changed: 46 additions & 2 deletions

File tree

‎History.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
unreleased
2+
==========
3+
4+
* Allow conditional revalidation for QUERY requests
5+
- `req.fresh` now includes QUERY in the freshness check, so QUERY responses can return 304 when a validator matches
6+
17
4.22.2 / 2026-05-11
28
==========
39

‎lib/request.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,8 +469,8 @@ defineGetter(req, 'fresh', function(){
469469
var res = this.res
470470
var status = res.statusCode
471471

472-
// GET or HEAD for weak freshness validation only
473-
if ('GET' !== method && 'HEAD' !== method) return false;
472+
// GET, HEAD, or QUERY for weak freshness validation only
473+
if ('GET' !== method && 'HEAD' !== method && 'QUERY' !== method) return false;
474474

475475
// 2xx or 304 as per rfc2616 14.26
476476
if ((status >= 200 && status < 300) || 304 === status) {

‎test/req.fresh.js‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
var express = require('../')
44
, request = require('supertest');
5+
var shouldSkipQuery = require('./support/utils').shouldSkipQuery
56

67
describe('req', function(){
78
describe('.fresh', function(){
@@ -46,5 +47,42 @@ describe('req', function(){
4647
.get('/')
4748
.expect(200, 'false', done);
4849
})
50+
51+
it('should return true for a QUERY request with a body when the resource is not modified', function(done){
52+
if (shouldSkipQuery(process.versions.node)) {
53+
this.skip()
54+
}
55+
var app = express();
56+
var etag = '"12345"';
57+
58+
app.use(function(req, res){
59+
res.set('ETag', etag);
60+
res.send(req.fresh);
61+
});
62+
63+
request(app)
64+
.query('/')
65+
.set('If-None-Match', etag)
66+
.send({ ids: ['a', 'b'] })
67+
.expect(304, done);
68+
})
69+
70+
it('should return false for a QUERY request with a body when the resource is modified', function(done){
71+
if (shouldSkipQuery(process.versions.node)) {
72+
this.skip()
73+
}
74+
var app = express();
75+
76+
app.use(function(req, res){
77+
res.set('ETag', '"123"');
78+
res.send(req.fresh);
79+
});
80+
81+
request(app)
82+
.query('/')
83+
.set('If-None-Match', '"12345"')
84+
.send({ ids: ['a', 'b'] })
85+
.expect(200, 'false', done);
86+
})
4987
})
5088
})

0 commit comments

Comments
 (0)