Comparing version 1.2.2 to 1.3.0
@@ -17,2 +17,3 @@ var Promise = require('native-or-bluebird'); | ||
status: xhr.status === 1223 ? 204 : xhr.status, | ||
statusText: xhr.statusText, | ||
headers: get_headers_1.parse(xhr.getAllResponseHeaders()), | ||
@@ -19,0 +20,0 @@ body: responseType ? xhr.response : xhr.responseText, |
var http_1 = require('http'); | ||
var https_1 = require('https'); | ||
var agent = require('infinity-agent'); | ||
var through2 = require('through2'); | ||
var stream_1 = require('stream'); | ||
var urlLib = require('url'); | ||
var extend = require('xtend'); | ||
var arrify = require('arrify'); | ||
var get_headers_1 = require('get-headers'); | ||
@@ -26,92 +26,97 @@ var Promise = require('native-or-bluebird'); | ||
function open(request) { | ||
return new Promise(function (resolve, reject) { | ||
var maxRedirects = num(request.options.maxRedirects, 5); | ||
var followRedirects = request.options.followRedirects !== false; | ||
var requestCount = 0; | ||
var confirmRedirect = typeof request.options.followRedirects === 'function' ? | ||
request.options.followRedirects : falsey; | ||
var requestProxy = through2(function (chunk, enc, cb) { | ||
request.uploadedBytes = request.uploadedBytes + chunk.length; | ||
this.push(chunk); | ||
cb(); | ||
}, function (cb) { | ||
request.uploadedBytes = request.uploadLength; | ||
cb(); | ||
}); | ||
var responseProxy = through2(function (chunk, enc, cb) { | ||
request.downloadedBytes = request.downloadedBytes + chunk.length; | ||
this.push(chunk); | ||
cb(); | ||
}, function (cb) { | ||
request.downloadedBytes = request.downloadLength; | ||
cb(); | ||
}); | ||
function get(url, opts, body) { | ||
if (requestCount++ > maxRedirects) { | ||
reject(request.error("Exceeded maximum of " + maxRedirects + " redirects", 'EMAXREDIRECTS')); | ||
return; | ||
} | ||
var arg = extend(urlLib.parse(url), opts); | ||
var isHttp = arg.protocol !== 'https:'; | ||
var engine = isHttp ? http_1.request : https_1.request; | ||
arg.agent = request.options.agent || (isHttp ? agent.http.globalAgent : agent.https.globalAgent); | ||
arg.rejectUnauthorized = request.options.rejectUnauthorized !== false; | ||
var req = engine(arg); | ||
req.once('response', function (res) { | ||
var status = res.statusCode; | ||
var redirect = REDIRECT_STATUS[status]; | ||
if (followRedirects && redirect != null && res.headers.location) { | ||
var newUrl = urlLib.resolve(url, res.headers.location); | ||
res.resume(); | ||
if (redirect === REDIRECT_TYPE.FOLLOW_WITH_GET) { | ||
get(newUrl, { method: 'GET' }); | ||
return; | ||
} | ||
if (redirect === REDIRECT_TYPE.FOLLOW_WITH_CONFIRMATION) { | ||
if (arg.method === 'GET' || arg.method === 'HEAD') { | ||
get(newUrl, opts, body); | ||
return; | ||
var maxRedirects = num(request.options.maxRedirects, 5); | ||
var followRedirects = request.options.followRedirects !== false; | ||
var requestCount = 0; | ||
var confirmRedirect = typeof request.options.followRedirects === 'function' ? | ||
request.options.followRedirects : falsey; | ||
function get(url, method, body) { | ||
if (requestCount++ > maxRedirects) { | ||
return Promise.reject(request.error("Exceeded maximum of " + maxRedirects + " redirects", 'EMAXREDIRECTS')); | ||
} | ||
return appendCookies(request) | ||
.then(function () { | ||
return new Promise(function (resolve, reject) { | ||
var arg = urlLib.parse(url); | ||
var isHttp = arg.protocol !== 'https:'; | ||
var engine = isHttp ? http_1.request : https_1.request; | ||
arg.method = method; | ||
arg.headers = request.get(); | ||
arg.agent = request.options.agent; | ||
arg.rejectUnauthorized = request.options.rejectUnauthorized !== false; | ||
if (!arg.agent) { | ||
arg.agent = isHttp ? agent.http.globalAgent : agent.https.globalAgent; | ||
} | ||
var req = engine(arg); | ||
var requestProxy = new stream_1.PassThrough(); | ||
var responseProxy = new stream_1.PassThrough(); | ||
requestProxy.on('data', function (chunk) { | ||
request.uploadedBytes = request.uploadedBytes + chunk.length; | ||
}); | ||
requestProxy.on('end', function () { | ||
request.uploadedBytes = request.uploadLength; | ||
}); | ||
responseProxy.on('data', function (chunk) { | ||
request.downloadedBytes = request.downloadedBytes + chunk.length; | ||
}); | ||
responseProxy.on('end', function () { | ||
request.downloadedBytes = request.downloadLength; | ||
}); | ||
function response(res) { | ||
var status = res.statusCode; | ||
var redirect = REDIRECT_STATUS[status]; | ||
if (followRedirects && redirect != null && res.headers.location) { | ||
var newUrl = urlLib.resolve(url, res.headers.location); | ||
res.resume(); | ||
request.remove('Cookie'); | ||
if (redirect === REDIRECT_TYPE.FOLLOW_WITH_GET) { | ||
request.set('Content-Length', '0'); | ||
return get(newUrl, 'GET'); | ||
} | ||
if (confirmRedirect(req, res)) { | ||
get(newUrl, opts, body); | ||
return; | ||
if (redirect === REDIRECT_TYPE.FOLLOW_WITH_CONFIRMATION) { | ||
if (arg.method === 'GET' || arg.method === 'HEAD') { | ||
return get(newUrl, method, body); | ||
} | ||
if (confirmRedirect(req, res)) { | ||
return get(newUrl, method, body); | ||
} | ||
} | ||
} | ||
request.downloadLength = num(res.headers['content-length'], 0); | ||
res.pipe(responseProxy); | ||
return Promise.resolve({ | ||
body: responseProxy, | ||
status: status, | ||
statusText: res.statusMessage, | ||
headers: get_headers_1.http(res), | ||
url: url | ||
}); | ||
} | ||
request.downloadLength = num(res.headers['content-length'], 0); | ||
res.pipe(responseProxy); | ||
return resolve({ | ||
body: responseProxy, | ||
status: status, | ||
headers: get_headers_1.http(res), | ||
url: url | ||
req.once('response', function (message) { | ||
return resolve(setCookies(request, message).then(function () { return response(message); })); | ||
}); | ||
}); | ||
req.once('abort', function () { | ||
return reject(request.error('Request aborted', 'EABORT')); | ||
}); | ||
req.once('error', function (error) { | ||
return reject(request.error("Unable to connect to \"" + url + "\"", 'EUNAVAILABLE', error)); | ||
}); | ||
requestProxy.once('error', reject); | ||
request.raw = req; | ||
request.uploadLength = num(req.getHeader('content-length'), 0); | ||
requestProxy.pipe(req); | ||
if (body) { | ||
if (typeof body.pipe === 'function') { | ||
body.pipe(requestProxy); | ||
req.once('abort', function () { | ||
return reject(request.error('Request aborted', 'EABORT')); | ||
}); | ||
req.once('error', function (error) { | ||
return reject(request.error("Unable to connect to \"" + url + "\"", 'EUNAVAILABLE', error)); | ||
}); | ||
requestProxy.once('error', reject); | ||
request.raw = req; | ||
request.uploadLength = num(req.getHeader('content-length'), 0); | ||
requestProxy.pipe(req); | ||
if (body) { | ||
if (typeof body.pipe === 'function') { | ||
body.pipe(requestProxy); | ||
} | ||
else { | ||
requestProxy.end(body); | ||
} | ||
} | ||
else { | ||
requestProxy.end(body); | ||
requestProxy.end(); | ||
} | ||
} | ||
else { | ||
requestProxy.end(); | ||
} | ||
} | ||
get(request.fullUrl(), { | ||
headers: request.get(), | ||
method: request.method | ||
}, request.body); | ||
}); | ||
}); | ||
}); | ||
} | ||
return get(request.fullUrl(), request.method, request.body); | ||
} | ||
@@ -130,2 +135,37 @@ function abort(request) { | ||
} | ||
function appendCookies(request) { | ||
return new Promise(function (resolve, reject) { | ||
if (!request.options.jar) { | ||
return resolve(); | ||
} | ||
request.options.jar.getCookies(request.url, function (err, cookies) { | ||
if (err) { | ||
return reject(err); | ||
} | ||
if (cookies.length) { | ||
request.append('Cookie', cookies.join('; ')); | ||
} | ||
return resolve(); | ||
}); | ||
}); | ||
} | ||
function setCookies(request, message) { | ||
return new Promise(function (resolve, reject) { | ||
if (!request.options.jar) { | ||
return resolve(); | ||
} | ||
var cookies = arrify(message.headers['set-cookie']); | ||
if (!cookies.length) { | ||
return resolve(); | ||
} | ||
var setCookies = cookies.map(function (cookie) { | ||
return new Promise(function (resolve, reject) { | ||
request.options.jar.setCookie(cookie, request.url, function (err) { | ||
return err ? reject(err) : resolve(); | ||
}); | ||
}); | ||
}); | ||
return resolve(Promise.all(setCookies)); | ||
}); | ||
} | ||
module.exports = common_1.defaults({ | ||
@@ -132,0 +172,0 @@ transport: { open: open, abort: abort, use: index_1.defaults } |
export * from './common'; | ||
import Request, { Middleware } from '../request'; | ||
export declare function cookieJar(request: Request): void; | ||
export declare function unzip(request: Request): void; | ||
@@ -5,0 +4,0 @@ export declare function concatStream(encoding: string): (request: Request) => void; |
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
var arrify = require('arrify'); | ||
var concat = require('concat-stream'); | ||
@@ -11,40 +10,2 @@ var FormData = require('form-data'); | ||
var common_2 = require('./common'); | ||
function getCookieJar(request) { | ||
return new Promise(function (resolve, reject) { | ||
request.options.jar.getCookies(request.url, function (err, cookies) { | ||
if (err) { | ||
return reject(err); | ||
} | ||
if (cookies.length) { | ||
request.append('Cookie', cookies.join('; ')); | ||
} | ||
return resolve(); | ||
}); | ||
}); | ||
} | ||
function setCookieJar(response) { | ||
return new Promise(function (resolve, reject) { | ||
var cookies = arrify(response.get('Set-Cookie')); | ||
var request = response.request; | ||
if (!cookies.length) { | ||
return resolve(); | ||
} | ||
var setCookies = cookies.map(function (cookie) { | ||
return new Promise(function (resolve, reject) { | ||
request.options.jar.setCookie(cookie, request.url, function (err) { | ||
return err ? reject(err) : resolve(); | ||
}); | ||
}); | ||
}); | ||
return resolve(Promise.all(setCookies)); | ||
}); | ||
} | ||
function cookieJar(request) { | ||
if (!request.options.jar) { | ||
return; | ||
} | ||
request.before(getCookieJar); | ||
request.after(setCookieJar); | ||
} | ||
exports.cookieJar = cookieJar; | ||
function unzipResponse(response) { | ||
@@ -129,3 +90,3 @@ if (['gzip', 'deflate'].indexOf(response.get('Content-Encoding')) > -1) { | ||
exports.headers = headers; | ||
exports.defaults = [common_2.stringify, headers, cookieJar, unzip, concatStream('string'), common_2.parse]; | ||
exports.defaults = [common_2.stringify, headers, unzip, concatStream('string'), common_2.parse]; | ||
//# sourceMappingURL=index.js.map |
@@ -6,2 +6,3 @@ import Base, { BaseOptions, Headers } from './base'; | ||
status: number; | ||
statusText: string; | ||
} | ||
@@ -13,5 +14,7 @@ export interface ResponseJSON { | ||
status: number; | ||
statusText: string; | ||
} | ||
export default class Response extends Base { | ||
status: number; | ||
statusText: string; | ||
body: any; | ||
@@ -18,0 +21,0 @@ request: Request; |
@@ -13,2 +13,3 @@ var __extends = (this && this.__extends) || function (d, b) { | ||
this.status = options.status; | ||
this.statusText = options.statusText; | ||
} | ||
@@ -26,3 +27,4 @@ Response.prototype.statusType = function () { | ||
body: this.body, | ||
status: this.status | ||
status: this.status, | ||
statusText: this.statusText | ||
}; | ||
@@ -29,0 +31,0 @@ }; |
{ | ||
"name": "popsicle", | ||
"version": "1.2.2", | ||
"version": "1.3.0", | ||
"description": "Simple HTTP requests for node and the browser", | ||
@@ -26,4 +26,4 @@ "main": "dist/lib/index.js", | ||
"test-spec": "npm run test-server-open && PORT=7357 node dist/test/index.js; npm run test-server-close", | ||
"test-cov": "PORT=7357 istanbul cover --print none dist/test/index.js | faucet", | ||
"test-browser": "PORT=7357 browserify -t envify dist/test/index.js | tape-run | faucet", | ||
"test-cov": "PORT=7357 istanbul cover --print none dist/test/index.js | tap-dot", | ||
"test-browser": "PORT=7357 browserify -t envify dist/test/index.js | tape-run | tap-dot", | ||
"test-server-open": "PORT=7357 node test/support/server.js & echo $! > test.pid", | ||
@@ -70,6 +70,6 @@ "test-server-close": "if [ -f test.pid ]; then kill -9 $(cat test.pid); rm test.pid; fi", | ||
"express": "^4.10.2", | ||
"faucet": "0.0.1", | ||
"istanbul": "^0.3.17", | ||
"phantomjs": "^1.9.18", | ||
"pre-commit": "^1.0.10", | ||
"tap-dot": "^1.0.0", | ||
"tape-run": "^1.0.0", | ||
@@ -86,3 +86,2 @@ "typescript": "^1.6.2" | ||
"native-or-bluebird": "^1.2.0", | ||
"through2": "^2.0.0", | ||
"tough-cookie": "^2.0.0", | ||
@@ -89,0 +88,0 @@ "xtend": "^4.0.0" |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
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
94834
9
1095
- Removedthrough2@^2.0.0
- Removedthrough2@2.0.5(transitive)