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

Add support for qs options via qsOptions key #1477

Merged
merged 2 commits into from Mar 21, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -565,6 +565,8 @@ The first argument can be either a `url` or an `options` object. The only requir

* `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()`
* `qs` - object containing querystring values to be appended to the `uri`
* `qsParseOptions` - object containing options to pass to the [qs.parse](https://github.com/hapijs/qs#parsing-objects) method or [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method
* `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method or to the [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method. For example, to change the way arrays are converted to query strings pass the `arrayFormat` option with one of `indices|brackets|repeat`
* `useQuerystring` - If true, use `querystring` to stringify and parse
querystrings, otherwise use `qs` (default: `false`). Set this option to
`true` if you need arrays to be serialized as `foo=bar&foo=baz` instead of the
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -29,7 +29,7 @@
"json-stringify-safe": "~5.0.0",
"mime-types": "~2.0.1",
"node-uuid": "~1.4.0",
"qs": "~2.3.1",
"qs": "~2.4.0",
"tunnel-agent": "~0.4.0",
"tough-cookie": ">=0.12.0",
"http-signature": "~0.10.0",
Expand Down
16 changes: 12 additions & 4 deletions request.js
Expand Up @@ -329,6 +329,12 @@ Request.prototype.init = function (options) {
if (!self.qsLib) {
self.qsLib = (options.useQuerystring ? querystring : qs)
}
if (!self.qsParseOptions) {
self.qsParseOptions = options.qsParseOptions
}
if (!self.qsStringifyOptions) {
self.qsStringifyOptions = options.qsStringifyOptions
}

debug(options)
if (!self.pool && self.pool !== false) {
Expand Down Expand Up @@ -1229,7 +1235,7 @@ Request.prototype.qs = function (q, clobber) {
var self = this
var base
if (!clobber && self.uri.query) {
base = self.qsLib.parse(self.uri.query)
base = self.qsLib.parse(self.uri.query, self.qsParseOptions)
} else {
base = {}
}
Expand All @@ -1238,11 +1244,11 @@ Request.prototype.qs = function (q, clobber) {
base[i] = q[i]
}

if (self.qsLib.stringify(base) === ''){
if (self.qsLib.stringify(base, self.qsStringifyOptions) === ''){
return self
}

var qs = self.qsLib.stringify(base)
var qs = self.qsLib.stringify(base, self.qsStringifyOptions)

self.uri = url.parse(self.uri.href.split('?')[0] + '?' + rfc3986(qs))
self.url = self.uri
Expand All @@ -1254,7 +1260,9 @@ Request.prototype.form = function (form) {
var self = this
if (form) {
self.setHeader('content-type', 'application/x-www-form-urlencoded')
self.body = (typeof form === 'string') ? form.toString('utf8') : self.qsLib.stringify(form).toString('utf8')
self.body = (typeof form === 'string')
? form.toString('utf8')
: self.qsLib.stringify(form, self.qsStringifyOptions).toString('utf8')
self.body = rfc3986(self.body)
return self
}
Expand Down
22 changes: 21 additions & 1 deletion tests/test-qs.js
Expand Up @@ -6,13 +6,17 @@ var request = require('../index')
// Run a querystring test. `options` can have the following keys:
// - suffix : a string to be added to the URL
// - qs : an object to be passed to request's `qs` option
// - qsParseOptions : an object to be passed to request's `qsParseOptions` option
// - qsStringifyOptions : an object to be passed to request's `qsStringifyOptions` option
// - afterRequest : a function to execute after creating the request
// - expected : the expected path of the request
// - expectedQuerystring : expected path when using the querystring library
function runTest(name, options) {
var uri = 'http://www.google.com' + (options.suffix || '')
, requestOptsQs = {
uri : uri
uri : uri,
qsParseOptions: options.qsParseOptions,
qsStringifyOptions: options.qsStringifyOptions
}
, requestOptsQuerystring = {
uri : uri,
Expand Down Expand Up @@ -101,3 +105,19 @@ runTest('a query with an array for a value', {
expected : esc('/?order[0]=bar&order[1]=desc'),
expectedQuerystring : '/?order=bar&order=desc'
})

runTest('pass options to the qs module via the qsParseOptions key', {
suffix : '?a=1;b=2',
qs: {},
qsParseOptions: { delimiter : ';' },
qsStringifyOptions: { delimiter : ';' },
expected : esc('/?a=1;b=2'),
expectedQuerystring : '/?a=1%3Bb%3D2'
})

runTest('pass options to the qs module via the qsStringifyOptions key', {
qs : { order : ['bar', 'desc'] },
qsStringifyOptions: { arrayFormat : 'brackets' },
expected : esc('/?order[]=bar&order[]=desc'),
expectedQuerystring : '/?order=bar&order=desc'
})