From a04077a17db282c476c348e67994a95db2d015f6 Mon Sep 17 00:00:00 2001 From: dublx Date: Fri, 22 Apr 2016 15:47:16 +0100 Subject: [PATCH] Choose between follow-redirects or core --- lib/adapters/http.js | 25 ++++++++++++++++++++----- test/unit/adapters/http.js | 26 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/lib/adapters/http.js b/lib/adapters/http.js index 84be87b..b02a50e 100644 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -3,8 +3,10 @@ var utils = require('./../utils'); var buildURL = require('./../helpers/buildURL'); var transformData = require('./../helpers/transformData'); -var http = require('follow-redirects').http; -var https = require('follow-redirects').https; +var http = require('http'); +var https = require('https'); +var httpFollow = require('follow-redirects').http; +var httpsFollow = require('follow-redirects').https; var url = require('url'); var zlib = require('zlib'); var pkg = require('./../../package.json'); @@ -12,7 +14,12 @@ var Buffer = require('buffer').Buffer; // Resolve or reject the Promise based on the status function settle(resolve, reject, response) { - (response.status >= 200 && response.status < 300 ? + var minCode = 200; + var maxCode = 300; + if (response.config.hasOwnProperty('maxRedirects')) { + maxCode = 400; + } + (response.status >= minCode && response.status < maxCode ? resolve : reject)(response); } @@ -76,8 +83,17 @@ module.exports = function httpAdapter(resolve, reject, config) { options.path = parsed.protocol + '//' + parsed.hostname + options.path; } + var transport; + if (config.maxRedirects === 0) { + transport = parsed.protocol === 'https:' ? https : http; + } else { + if (config.maxRedirects) { + options.maxRedirects = config.maxRedirects; + } + transport = parsed.protocol === 'https:' ? httpsFollow : httpFollow; + } + // Create the request - var transport = parsed.protocol === 'https:' ? https : http; var req = transport.request(options, function handleResponse(res) { if (aborted) return; @@ -107,7 +123,6 @@ module.exports = function httpAdapter(resolve, reject, config) { config: config, request: req }; - if (config.responseType === 'stream') { response.data = stream; settle(resolve, reject, response); diff --git a/test/unit/adapters/http.js b/test/unit/adapters/http.js index acd0b30..6d06bd9 100644 --- a/test/unit/adapters/http.js +++ b/test/unit/adapters/http.js @@ -79,6 +79,32 @@ module.exports = { }); }, + testNoRedirect: function (test) { + var str = 'test response'; + + server = http.createServer(function (req, res) { + var parsed = url.parse(req.url); + + if (parsed.pathname === '/one') { + res.setHeader('NoRedirect', 'true'); + res.setHeader('Location', '/two'); + res.statusCode = 302; + res.end(); + } else { + res.end(str); + } + }).listen(4444, function () { + axios.get('http://localhost:4444/one', { + maxRedirects: 0 + }).then(function (res) { + test.equal(res.status, 302); + test.equal(res.headers['noredirect'], 'true'); + test.equal(res.headers['location'], '/two'); + test.done(); + }); + }); + }, + testTransparentGunzip: function (test) { var data = { firstName: 'Fred',