Skip to content

Commit a3eb9a2

Browse files
author
Christopher Hiller
committed
closes hapijs#2480: Ability to pass options to qs for payload parsing
- added optional `qsParserOptions` parameter to `Request.setUrl()` - added test illustrating use case prompting hapijs#2480 - updated `API.md` to reflect new parameter; added info about `stripTrailingSlash` as well
1 parent d52ecd2 commit a3eb9a2

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

API.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2716,12 +2716,14 @@ Each request object includes the following properties:
27162716
definition.
27172717
- `url` - the parsed request URI.
27182718

2719-
#### `request.setUrl(url)`
2719+
#### `request.setUrl(url, [stripTrailingSlash], [qsParserOptions])`
27202720

27212721
_Available only in `'onRequest'` extension methods._
27222722

27232723
Changes the request URI before the router begins processing the request where:
27242724
- `url` - the new request path value.
2725+
- `stripTrailingSlash` - if truthy, strip the trailing slash from the path.
2726+
- `qsParserOptions` - an object of options to pass to [Qs.parse()](https://www.npmjs.com/package/qs#parsing-objects), which parses the URL's query string, if present.
27252727

27262728
```js
27272729
var Hapi = require('hapi');

lib/request.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,10 @@ exports = module.exports = internals.Request = function (connection, req, res, o
168168
Hoek.inherits(internals.Request, Events.EventEmitter);
169169

170170

171-
internals.Request.prototype._setUrl = function (url, stripTrailingSlash) {
171+
internals.Request.prototype._setUrl = function (url, stripTrailingSlash, qsParserOptions) {
172172

173173
this.url = Url.parse(url, false);
174-
this.url.query = Qs.parse(this.url.query); // Override parsed value
174+
this.url.query = Qs.parse(this.url.query, qsParserOptions); // Override parsed value
175175
this.query = this.url.query;
176176
this.path = this.url.pathname || ''; // pathname excludes query
177177

test/request.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,31 @@ describe('Request', function () {
744744
done();
745745
});
746746
});
747+
748+
it('accepts querystring parser options', function (done) {
749+
750+
var url = 'http://localhost/page?a=1&b=1&c=1&d=1&e=1&f=1&g=1&h=1&i=1&j=1&k=1&l=1&m=1&n=1&o=1&p=1&q=1&r=1&s=1&t=1&u=1&v=1&w=1&x=1&y=1&z=1';
751+
var qsParserOptions = {
752+
parameterLimit: 26
753+
};
754+
var server = new Hapi.Server();
755+
server.connection();
756+
server.ext('onRequest', function (request, reply) {
757+
758+
request.setUrl(url, null, qsParserOptions);
759+
return reply(request.query);
760+
});
761+
762+
server.inject('/', function (res) {
763+
764+
expect(res.result).to.deep.equal({
765+
a: '1', b: '1', c: '1', d: '1', e: '1', f: '1', g: '1', h: '1', i: '1',
766+
j: '1', k: '1', l: '1', m: '1', n: '1', o: '1', p: '1', q: '1', r: '1',
767+
s: '1', t: '1', u: '1', v: '1', w: '1', x: '1', y: '1', z: '1'
768+
});
769+
done();
770+
});
771+
});
747772
});
748773

749774
describe('log()', { parallel: false }, function () {

0 commit comments

Comments
 (0)