typed-rest-client
Advanced tools
Comparing version 0.10.0 to 0.11.0
@@ -7,3 +7,3 @@ import url = require("url"); | ||
MultipleChoices = 300, | ||
MovedPermanantly = 301, | ||
MovedPermanently = 301, | ||
ResourceMoved = 302, | ||
@@ -46,4 +46,8 @@ NotModified = 304, | ||
handlers: ifm.IRequestHandler[]; | ||
socketTimeout: number; | ||
constructor(userAgent: string, handlers?: ifm.IRequestHandler[], socketTimeout?: number); | ||
requestOptions: ifm.IRequestOptions; | ||
private _ignoreSslError; | ||
private _socketTimeout; | ||
private _httpProxy; | ||
private _httpProxyBypassHosts; | ||
constructor(userAgent: string, handlers?: ifm.IRequestHandler[], requestOptions?: ifm.IRequestOptions); | ||
options(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<HttpClientResponse>; | ||
@@ -55,2 +59,3 @@ get(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<HttpClientResponse>; | ||
put(requestUrl: string, data: string, additionalHeaders?: ifm.IHeaders): Promise<HttpClientResponse>; | ||
head(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<HttpClientResponse>; | ||
sendStream(verb: string, requestUrl: string, stream: NodeJS.ReadableStream, additionalHeaders?: ifm.IHeaders): Promise<HttpClientResponse>; | ||
@@ -65,2 +70,3 @@ /** | ||
private _prepareRequest(method, requestUrl, headers); | ||
private _isBypassProxy(requestUrl); | ||
} |
@@ -21,3 +21,3 @@ // Copyright (c) Microsoft. All rights reserved. | ||
HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; | ||
HttpCodes[HttpCodes["MovedPermanantly"] = 301] = "MovedPermanantly"; | ||
HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; | ||
HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; | ||
@@ -69,6 +69,20 @@ HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; | ||
class HttpClient { | ||
constructor(userAgent, handlers, socketTimeout) { | ||
constructor(userAgent, handlers, requestOptions) { | ||
this._ignoreSslError = false; | ||
this.userAgent = userAgent; | ||
this.handlers = handlers; | ||
this.socketTimeout = socketTimeout ? socketTimeout : 3 * 60000; | ||
this.requestOptions = requestOptions; | ||
if (requestOptions) { | ||
if (requestOptions.ignoreSslError != null) { | ||
this._ignoreSslError = requestOptions.ignoreSslError; | ||
} | ||
this._socketTimeout = requestOptions.socketTimeout; | ||
this._httpProxy = requestOptions.proxy; | ||
if (requestOptions.proxy && requestOptions.proxy.proxyBypassHosts) { | ||
this._httpProxyBypassHosts = []; | ||
requestOptions.proxy.proxyBypassHosts.forEach(bypass => { | ||
this._httpProxyBypassHosts.push(new RegExp(bypass, 'i')); | ||
}); | ||
} | ||
} | ||
} | ||
@@ -93,2 +107,5 @@ options(requestUrl, additionalHeaders) { | ||
} | ||
head(requestUrl, additionalHeaders) { | ||
return this.request('HEAD', requestUrl, null, additionalHeaders || {}); | ||
} | ||
sendStream(verb, requestUrl, stream, additionalHeaders) { | ||
@@ -133,3 +150,3 @@ return this.request(verb, requestUrl, stream, additionalHeaders); | ||
// If we ever get disconnected, we want the socket to timeout eventually | ||
req.setTimeout(this.socketTimeout, () => { | ||
req.setTimeout(this._socketTimeout || 3 * 60000, () => { | ||
if (socket) { | ||
@@ -165,10 +182,26 @@ socket.end(); | ||
var defaultPort = usingSsl ? 443 : 80; | ||
var proxyUrl; | ||
if (process.env.HTTPS_PROXY && usingSsl) { | ||
proxyUrl = url.parse(process.env.HTTPS_PROXY); | ||
let proxyConfig = this._httpProxy; | ||
// fallback to http_proxy and https_proxy env | ||
if (!proxyConfig) { | ||
if (process.env.HTTPS_PROXY && usingSsl) { | ||
proxyConfig = { | ||
proxyUrl: process.env.HTTPS_PROXY | ||
}; | ||
} | ||
else if (process.env.HTTP_PROXY) { | ||
proxyConfig = { | ||
proxyUrl: process.env.HTTP_PROXY | ||
}; | ||
} | ||
} | ||
else if (process.env.HTTP_PROXY) { | ||
proxyUrl = url.parse(process.env.HTTP_PROXY); | ||
let proxyUrl; | ||
let proxyAuth; | ||
if (proxyConfig) { | ||
if (proxyConfig.proxyUrl.length > 0) { | ||
proxyUrl = url.parse(proxyConfig.proxyUrl); | ||
} | ||
if (proxyConfig.proxyUsername || proxyConfig.proxyPassword) { | ||
proxyAuth = proxyConfig.proxyUsername + ":" + encodeURIComponent(proxyConfig.proxyPassword); | ||
} | ||
} | ||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; | ||
info.options = {}; | ||
@@ -181,3 +214,3 @@ info.options.host = info.parsedUrl.hostname; | ||
info.options.headers["User-Agent"] = this.userAgent; | ||
let useProxy = proxyUrl && proxyUrl.hostname; | ||
let useProxy = proxyUrl && proxyUrl.hostname && !this._isBypassProxy(requestUrl); | ||
if (useProxy) { | ||
@@ -187,7 +220,6 @@ var agentOptions = { | ||
proxy: { | ||
// TODO: support proxy-authorization | ||
//proxyAuth: "user:password", | ||
proxyAuth: proxyAuth, | ||
host: proxyUrl.hostname, | ||
port: proxyUrl.port | ||
} | ||
}, | ||
}; | ||
@@ -204,2 +236,12 @@ var tunnelAgent; | ||
} | ||
if (usingSsl && this._ignoreSslError) { | ||
if (!info.options.agent) { | ||
info.options.agent = https.globalAgent; | ||
} | ||
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process | ||
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options | ||
// we have to cast it to any and change it directly | ||
let agent = info.options.agent; | ||
agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false }); | ||
} | ||
// gives handlers an opportunity to participate | ||
@@ -213,3 +255,15 @@ if (this.handlers) { | ||
} | ||
_isBypassProxy(requestUrl) { | ||
if (!this._httpProxyBypassHosts) { | ||
return false; | ||
} | ||
let bypass = false; | ||
this._httpProxyBypassHosts.forEach(bypassHost => { | ||
if (bypassHost.test(requestUrl)) { | ||
bypass = true; | ||
} | ||
}); | ||
return bypass; | ||
} | ||
} | ||
exports.HttpClient = HttpClient; |
@@ -17,1 +17,12 @@ export interface IHeaders { | ||
} | ||
export interface IRequestOptions { | ||
socketTimeout?: number; | ||
ignoreSslError?: boolean; | ||
proxy?: IProxyConfiguration; | ||
} | ||
export interface IProxyConfiguration { | ||
proxyUrl: string; | ||
proxyUsername?: string; | ||
proxyPassword?: string; | ||
proxyBypassHosts?: string[]; | ||
} |
{ | ||
"name": "typed-rest-client", | ||
"version": "0.10.0", | ||
"version": "0.11.0", | ||
"description": "Node Rest and Http Clients with typings for use with TypeScript", | ||
@@ -5,0 +5,0 @@ "main": "./RestClient.js", |
@@ -21,5 +21,5 @@ import httpm = require('./HttpClient'); | ||
* @param {ifm.IRequestHandler[]} handlers - handlers are typically auth handlers (basic, bearer, ntlm supplied) | ||
* @param {number} socketTimeout - default socket timeout. Can also supply per method | ||
* @param {ifm.IRequestOptions} requestOptions - options for each http requests (http proxy setting, socket timeout) | ||
*/ | ||
constructor(userAgent: string, baseUrl?: string, handlers?: ifm.IRequestHandler[], socketTimeout?: number); | ||
constructor(userAgent: string, baseUrl?: string, handlers?: ifm.IRequestHandler[], requestOptions?: ifm.IRequestOptions); | ||
private _baseUrl; | ||
@@ -26,0 +26,0 @@ /** |
@@ -21,6 +21,6 @@ // Copyright (c) Microsoft. All rights reserved. | ||
* @param {ifm.IRequestHandler[]} handlers - handlers are typically auth handlers (basic, bearer, ntlm supplied) | ||
* @param {number} socketTimeout - default socket timeout. Can also supply per method | ||
* @param {ifm.IRequestOptions} requestOptions - options for each http requests (http proxy setting, socket timeout) | ||
*/ | ||
constructor(userAgent, baseUrl, handlers, socketTimeout) { | ||
this.client = new httpm.HttpClient(userAgent, handlers, socketTimeout); | ||
constructor(userAgent, baseUrl, handlers, requestOptions) { | ||
this.client = new httpm.HttpClient(userAgent, handlers, requestOptions); | ||
if (baseUrl) { | ||
@@ -27,0 +27,0 @@ this._baseUrl = baseUrl; |
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
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
47408
961
4