Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,13 +259,19 @@ function createETagGenerator (options) {
/**
* Parse an extended query string with qs.
*
* Sets parameterLimit to Infinity to avoid silently truncating
* query parameters. The default qs limit of 1000 parameters
* would cause data loss without any warning. If users need a
* limit for security, they can provide a custom query parser.
*
* @param {String} str
* @return {Object}
* @private
*/

function parseExtendedQueryString(str) {
return qs.parse(str, {
allowPrototypes: true
allowPrototypes: true,
parameterLimit: Infinity
});
}
22 changes: 22 additions & 0 deletions test/req.query.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,28 @@ describe('req', function(){
.get('/?user.name=tj')
.expect(200, '{"user.name":"tj"}', done);
});

it('should not truncate parameters over 1000', function (done) {
var app = createApp('extended');

// Create a query string with 1500 parameters
var params = [];
for (var i = 0; i < 1500; i++) {
params.push('a' + i + '=' + i);
}
var query = params.join('&');

request(app)
.get('/?' + query)
.expect(200)
.expect(function (res) {
var keys = Object.keys(res.body);
if (keys.length !== 1500) {
throw new Error('Expected 1500 parameters, got ' + keys.length);
}
})
.end(done);
});
});

describe('when "query parser" is simple', function () {
Expand Down