Skip to content

Commit

Permalink
Merge pull request #1477 from simov/qs-options
Browse files Browse the repository at this point in the history
Add support for qs options via qsOptions key
  • Loading branch information
simov committed Mar 21, 2015
2 parents cd375d1 + 21f9602 commit 0cfebc6
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 6 deletions.
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -566,6 +566,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()`
* `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain. If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string.
* `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 @@ -327,6 +327,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 @@ -1259,7 +1265,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 @@ -1268,11 +1274,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 @@ -1284,7 +1290,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'
})

0 comments on commit 0cfebc6

Please sign in to comment.