Skip to content

Commit

Permalink
Add support for qs options via qsOptions key
Browse files Browse the repository at this point in the history
  • Loading branch information
simov committed Mar 13, 2015
1 parent 5e7b73d commit 282865f
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 6 deletions.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -565,6 +565,7 @@ 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`
* `qsOptions` - object containing options to pass to the `qs` or `querystring` module
* `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
13 changes: 9 additions & 4 deletions request.js
Expand Up @@ -329,6 +329,9 @@ Request.prototype.init = function (options) {
if (!self.qsLib) {
self.qsLib = (options.useQuerystring ? querystring : qs)
}
if (!self.qsOptions) {
self.qsOptions = options.qsOptions
}

debug(options)
if (!self.pool && self.pool !== false) {
Expand Down Expand Up @@ -1229,7 +1232,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.qsOptions)
} else {
base = {}
}
Expand All @@ -1238,11 +1241,11 @@ Request.prototype.qs = function (q, clobber) {
base[i] = q[i]
}

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

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

self.uri = url.parse(self.uri.href.split('?')[0] + '?' + rfc3986(qs))
self.url = self.uri
Expand All @@ -1254,7 +1257,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.qsOptions).toString('utf8')
self.body = rfc3986(self.body)
return self
}
Expand Down
11 changes: 10 additions & 1 deletion tests/test-qs.js
Expand Up @@ -6,13 +6,15 @@ 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
// - qsOptions : an object to be passed to request's `qsOptions` 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,
qsOptions: options.qsOptions
}
, requestOptsQuerystring = {
uri : uri,
Expand Down Expand Up @@ -101,3 +103,10 @@ 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 qsOptions key', {
qs : { order : ['bar', 'desc'] },
qsOptions: { arrayFormat : 'brackets' },
expected : esc('/?order[]=bar&order[]=desc'),
expectedQuerystring : '/?order=bar&order=desc'
})

0 comments on commit 282865f

Please sign in to comment.