diff --git a/request.js b/request.js index 39c338a0c..90220d2ba 100644 --- a/request.js +++ b/request.js @@ -1482,7 +1482,7 @@ Request.prototype.json = function (val) { self._json = true if (typeof val === 'boolean') { - if (self.body !== undefined) { + if (self.body !== undefined && self.getHeader('content-type') !== 'application/x-www-form-urlencoded') { self.body = safeStringify(self.body) if (!self.hasHeader('content-type')) { self.setHeader('content-type', 'application/json') diff --git a/tests/test-form-urlencoded.js b/tests/test-form-urlencoded.js new file mode 100644 index 000000000..eef384192 --- /dev/null +++ b/tests/test-form-urlencoded.js @@ -0,0 +1,44 @@ +'use strict' + +var http = require('http') + , request = require('../index') + , tape = require('tape') + + +tape('application/x-www-form-urlencoded', function(t) { + + var server = http.createServer(function(req, res) { + + t.equal(req.headers['content-type'], 'application/x-www-form-urlencoded') + t.equal(req.headers.accept, 'application/json') + + var data = '' + req.setEncoding('utf8') + + req.on('data', function(d) { + data += d + }) + + req.on('end', function() { + t.equal(data, 'some=url&encoded=data') + + res.writeHead(200) + res.end('done') + + t.end() + }) + }) + + server.listen(8080, function() { + + request.post('http://localhost:8080', { + form: {some: 'url', encoded: 'data'}, + json: true + }, function(err, res, body) { + t.equal(err, null) + t.equal(res.statusCode, 200) + t.equal(body, 'done') + server.close() + }) + }) +})