follow-redirects
Advanced tools
Comparing version 0.0.2 to 0.0.3
141
index.js
@@ -22,86 +22,89 @@ var nativeHttps = require('https'), | ||
h.request = function (options, callback, redirectOptions) { | ||
h.request = function (h) { | ||
return function (options, callback, redirectOptions) { | ||
redirectOptions = redirectOptions || {}; | ||
redirectOptions = redirectOptions || {}; | ||
var max = (typeof options === 'object' && 'maxRedirects' in options) ? options.maxRedirects : exports.maxRedirects; | ||
var max = (typeof options === 'object' && 'maxRedirects' in options) ? options.maxRedirects : exports.maxRedirects; | ||
var redirect = _.extend({ | ||
count: 0, | ||
max: max, | ||
clientRequest: null, | ||
userCallback: callback | ||
}, redirectOptions); | ||
var redirect = _.extend({ | ||
count: 0, | ||
max: max, | ||
clientRequest: null, | ||
userCallback: callback | ||
}, redirectOptions); | ||
//console.log(redirect.count); | ||
//console.log(redirect.max); | ||
/** | ||
* Emit error if too many redirects | ||
*/ | ||
if (redirect.count > redirect.max) { | ||
var err = new Error('Max redirects exceeded. To allow more redirects, pass options.maxRedirects property.'); | ||
redirect.clientRequest.emit('error', err); | ||
return redirect.clientRequest; | ||
} | ||
//console.log(redirect.count); | ||
//console.log(redirect.max); | ||
/** | ||
* Emit error if too many redirects | ||
*/ | ||
if (redirect.count > redirect.max) { | ||
var err = new Error('Max redirects exceeded. To allow more redirects, pass options.maxRedirects property.'); | ||
redirect.clientRequest.emit('error', err); | ||
return redirect.clientRequest; | ||
} | ||
redirect.count++; | ||
redirect.count++; | ||
/** | ||
* Parse URL from options | ||
*/ | ||
var reqUrl; | ||
if (typeof options === 'string') { | ||
reqUrl = options; | ||
} | ||
else { | ||
reqUrl = url.format(_.extend({ protocol: protocol }, options)); | ||
} | ||
/** | ||
* Parse URL from options | ||
*/ | ||
var reqUrl; | ||
if (typeof options === 'string') { | ||
reqUrl = options; | ||
} | ||
else { | ||
reqUrl = url.format(_.extend({ protocol: protocol }, options)); | ||
} | ||
/* | ||
* Build client request | ||
*/ | ||
var clientRequest = this.__proto__.request(options, redirectCallback(reqUrl, redirect)); | ||
/* | ||
* Build client request | ||
*/ | ||
var clientRequest = h.__proto__.request(options, redirectCallback(reqUrl, redirect)); | ||
// Save user's clientRequest so we can emit errors later | ||
if (!redirect.clientRequest) redirect.clientRequest = clientRequest; | ||
// Save user's clientRequest so we can emit errors later | ||
if (!redirect.clientRequest) redirect.clientRequest = clientRequest; | ||
/** | ||
* ClientRequest callback for redirects | ||
*/ | ||
function redirectCallback (reqUrl, redirect) { | ||
return function (res) { | ||
// status must be 300-399 for redirects | ||
if (res.statusCode < 300 || res.statusCode > 399) { | ||
//console.log('[' + res.statusCode + '] callback user on url ' + reqUrl); | ||
return redirect.userCallback(res); | ||
} | ||
/** | ||
* ClientRequest callback for redirects | ||
*/ | ||
function redirectCallback (reqUrl, redirect) { | ||
return function (res) { | ||
// status must be 300-399 for redirects | ||
if (res.statusCode < 300 || res.statusCode > 399) { | ||
//console.log('[' + res.statusCode + '] callback user on url ' + reqUrl); | ||
return redirect.userCallback(res); | ||
} | ||
// no `Location:` header => nowhere to redirect | ||
if (!('location' in res.headers)) { | ||
//console.log('[no location header] callback user on url ' + reqUrl); | ||
return redirect.userCallback(res); | ||
} | ||
// no `Location:` header => nowhere to redirect | ||
if (!('location' in res.headers)) { | ||
//console.log('[no location header] callback user on url ' + reqUrl); | ||
return redirect.userCallback(res); | ||
} | ||
// save the original clientRequest to our redirectOptions so we can emit errors later | ||
// save the original clientRequest to our redirectOptions so we can emit errors later | ||
// need to use url.resolve() in case location is a relative URL | ||
var redirectUrl = url.resolve(reqUrl, res.headers['location']); | ||
// we need to call the right api (http vs https) depending on protocol | ||
var proto = url.parse(redirectUrl).protocol; | ||
proto = proto.substr(0, proto.length - 1); | ||
//console.log('Redirecting from ' + reqUrl + ' to ' + redirectUrl); | ||
return module.exports[proto].get(redirectUrl, redirectCallback(reqUrl, redirect), redirect); | ||
}; | ||
// need to use url.resolve() in case location is a relative URL | ||
var redirectUrl = url.resolve(reqUrl, res.headers['location']); | ||
// we need to call the right api (http vs https) depending on protocol | ||
var proto = url.parse(redirectUrl).protocol; | ||
proto = proto.substr(0, proto.length - 1); | ||
//console.log('Redirecting from ' + reqUrl + ' to ' + redirectUrl); | ||
return module.exports[proto].get(redirectUrl, redirectCallback(reqUrl, redirect), redirect); | ||
}; | ||
} | ||
return clientRequest; | ||
} | ||
}(h); | ||
return clientRequest; | ||
} | ||
// see https://github.com/joyent/node/blob/master/lib/http.js#L1623 | ||
h.get = function (options, cb, redirectOptions) { | ||
var req = this.request(options, cb, redirectOptions); | ||
req.end(); | ||
return req; | ||
}; | ||
h.get = function (h) { | ||
return function (options, cb, redirectOptions) { | ||
var req = h.request(options, cb, redirectOptions); | ||
req.end(); | ||
return req; | ||
}; | ||
}(h); | ||
} |
{ | ||
"name": "follow-redirects", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"description": "HTTP and HTTPS modules that follow redirects.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -65,18 +65,19 @@ var https = require('../').https, | ||
*/ | ||
//console.log((proto + '.' + 'request(' + url + ')').blue); | ||
//var req = http.request(url, function(res) { | ||
////console.log('STATUS: ' + res.statusCode); | ||
////console.log('HEADERS: ' + JSON.stringify(res.headers)); | ||
//res.setEncoding('utf8'); | ||
//res.on('data', function (chunk) { | ||
//console.log('BODY: ' + chunk); | ||
//}); | ||
//}); | ||
console.log((proto + '.' + 'request(' + url + ')').blue); | ||
var request = http.request; | ||
var req = request(url, function(res) { | ||
//console.log('STATUS: ' + res.statusCode); | ||
//console.log('HEADERS: ' + JSON.stringify(res.headers)); | ||
res.setEncoding('utf8'); | ||
res.on('data', function (chunk) { | ||
console.log('BODY: ' + chunk); | ||
}); | ||
}); | ||
//req.on('error', function(e) { | ||
//console.log('problem with request: ' + e.message); | ||
//}); | ||
req.on('error', function(e) { | ||
console.log('problem with request: ' + e.message); | ||
}); | ||
//req.end(); | ||
req.end(); | ||
}; | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
7065
160