Compare commits
2 Commits
developmen
...
improvemen
Author | SHA1 | Date |
---|---|---|
anurag4DSB | 7eb34c76b9 | |
anurag4DSB | eff4ccf64f |
1
index.js
1
index.js
|
@ -60,6 +60,7 @@ module.exports = {
|
||||||
},
|
},
|
||||||
kmip: require('./lib/network/kmip'),
|
kmip: require('./lib/network/kmip'),
|
||||||
kmipClient: require('./lib/network/kmip/Client'),
|
kmipClient: require('./lib/network/kmip/Client'),
|
||||||
|
request: require('./lib/network/request'),
|
||||||
},
|
},
|
||||||
s3routes: {
|
s3routes: {
|
||||||
routes: require('./lib/s3routes/routes'),
|
routes: require('./lib/s3routes/routes'),
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
const url = require('url');
|
||||||
|
const http = require('http');
|
||||||
|
const https = require('https');
|
||||||
|
const HttpProxyAgent = require('http-proxy-agent');
|
||||||
|
const HttpsProxyAgent = require('https-proxy-agent');
|
||||||
|
|
||||||
|
const { proxyCompareUrl } = require('../storage/data/external/utils');
|
||||||
|
const jsutil = require('../jsutil');
|
||||||
|
|
||||||
|
const validVerbs = new Set(['HEAD', 'GET', 'POST', 'PUT', 'DELETE']);
|
||||||
|
const updateVerbs = new Set(['POST', 'PUT']);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* create a new header object from an existing header object. Similar keys
|
||||||
|
* will be ignored if a value has been set for theirlower-cased form
|
||||||
|
*/
|
||||||
|
function createHeaders(headers) {
|
||||||
|
if (typeof headers !== 'object') {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
const out = {};
|
||||||
|
Object.entries(headers).forEach(([key, value]) => {
|
||||||
|
const lowKey = key.toLowerCase();
|
||||||
|
if (out[lowKey] === undefined) {
|
||||||
|
out[lowKey] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function request(endpoint, options, callback) {
|
||||||
|
if (!endpoint || typeof endpoint === 'function') {
|
||||||
|
throw new Error('Missing target endpoint');
|
||||||
|
}
|
||||||
|
|
||||||
|
let cb;
|
||||||
|
let opts = {};
|
||||||
|
if (typeof options === 'function') {
|
||||||
|
cb = jsutil.once(options);
|
||||||
|
} else if (typeof options === 'object') {
|
||||||
|
opts = JSON.parse(JSON.stringify(options)); // deep-copy
|
||||||
|
if (typeof callback === 'function') {
|
||||||
|
cb = jsutil.once(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof cb !== 'function') {
|
||||||
|
throw new Error('Missing request callback');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(endpoint instanceof url.URL || typeof endpoint === 'string')) {
|
||||||
|
return cb(new Error(`Invalid URI ${endpoint}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opts.method) {
|
||||||
|
opts.method = 'GET';
|
||||||
|
} else if (!validVerbs.has(opts.method)) {
|
||||||
|
return cb(new Error(`Invalid Method ${opts.method}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
let reqParams;
|
||||||
|
if (typeof endpoint === 'string') {
|
||||||
|
try {
|
||||||
|
reqParams = new url.URL(endpoint);
|
||||||
|
} catch (error) {
|
||||||
|
return cb(error);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
reqParams = new url.URL(endpoint.href);
|
||||||
|
}
|
||||||
|
reqParams.method = opts.method;
|
||||||
|
reqParams.headers = createHeaders(opts.headers || {});
|
||||||
|
|
||||||
|
let request;
|
||||||
|
if (reqParams.protocol === 'http:') {
|
||||||
|
request = http;
|
||||||
|
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;
|
||||||
|
if (!proxyCompareUrl(reqParams.hostname) && httpProxy) {
|
||||||
|
reqParams.agent = new HttpProxyAgent(new url.URL(httpProxy));
|
||||||
|
}
|
||||||
|
} else if (reqParams.protocol === 'https:') {
|
||||||
|
request = https;
|
||||||
|
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
|
||||||
|
if (!proxyCompareUrl(reqParams.hostname) && httpsProxy) {
|
||||||
|
reqParams.agent = new HttpsProxyAgent(new url.URL(httpsProxy));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return cb(new Error(`Invalid Protocol ${reqParams.protocol}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
let data;
|
||||||
|
if (opts.body) {
|
||||||
|
if (typeof opts.body === 'object') {
|
||||||
|
data = JSON.stringify(opts.body);
|
||||||
|
if (!reqParams.headers['content-type']) {
|
||||||
|
reqParams.headers['content-type'] = 'application/json';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
data = opts.body;
|
||||||
|
}
|
||||||
|
reqParams.headers['content-length'] = Buffer.byteLength(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const req = request.request(reqParams);
|
||||||
|
req.on('error', cb);
|
||||||
|
req.on('response', res => {
|
||||||
|
const rawData = [];
|
||||||
|
res.on('data', chunk => { rawData.push(chunk); });
|
||||||
|
res.on('end', () => {
|
||||||
|
const data = rawData.join('');
|
||||||
|
if (res.statusCode >= 400) {
|
||||||
|
return cb(new Error(res.statusMessage), res, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts.json && data) {
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(data);
|
||||||
|
return cb(null, res, parsed);
|
||||||
|
} catch (err) {
|
||||||
|
// invalid json response
|
||||||
|
return cb(err, res, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cb(null, res, data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (data !== undefined && updateVerbs.has(opts.method)) {
|
||||||
|
req.write(data);
|
||||||
|
}
|
||||||
|
req.end();
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
request,
|
||||||
|
};
|
|
@ -29,7 +29,8 @@
|
||||||
"diskusage": "^1.1.1",
|
"diskusage": "^1.1.1",
|
||||||
"fcntl": "github:scality/node-fcntl",
|
"fcntl": "github:scality/node-fcntl",
|
||||||
"hdclient": "scality/hdclient#5145e04e5ed33e85106765b1caa90cd245ef482b",
|
"hdclient": "scality/hdclient#5145e04e5ed33e85106765b1caa90cd245ef482b",
|
||||||
"https-proxy-agent": "^2.2.0",
|
"http-proxy-agent": "^4.0.1",
|
||||||
|
"https-proxy-agent": "^5.0.0",
|
||||||
"ioredis": "4.9.5",
|
"ioredis": "4.9.5",
|
||||||
"ipaddr.js": "1.9.1",
|
"ipaddr.js": "1.9.1",
|
||||||
"level": "~5.0.1",
|
"level": "~5.0.1",
|
||||||
|
|
46
yarn.lock
46
yarn.lock
|
@ -75,6 +75,11 @@
|
||||||
resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
|
resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
|
||||||
integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
|
integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
|
||||||
|
|
||||||
|
"@tootallnate/once@1":
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
|
||||||
|
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
|
||||||
|
|
||||||
JSONStream@^1.0.0:
|
JSONStream@^1.0.0:
|
||||||
version "1.3.5"
|
version "1.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
|
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
|
||||||
|
@ -128,6 +133,13 @@ after@0.8.2:
|
||||||
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
|
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
|
||||||
integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
|
integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
|
||||||
|
|
||||||
|
agent-base@6:
|
||||||
|
version "6.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||||
|
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
|
||||||
|
dependencies:
|
||||||
|
debug "4"
|
||||||
|
|
||||||
agent-base@^4.3.0:
|
agent-base@^4.3.0:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
|
||||||
|
@ -640,6 +652,13 @@ debug@3.1.0, debug@~3.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
|
debug@4:
|
||||||
|
version "4.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
|
||||||
|
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
|
||||||
|
dependencies:
|
||||||
|
ms "2.1.2"
|
||||||
|
|
||||||
debug@^2.1.1:
|
debug@^2.1.1:
|
||||||
version "2.6.9"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||||
|
@ -1331,6 +1350,15 @@ he@1.1.1:
|
||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
||||||
integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
|
integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
|
||||||
|
|
||||||
|
http-proxy-agent@^4.0.1:
|
||||||
|
version "4.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
|
||||||
|
integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
|
||||||
|
dependencies:
|
||||||
|
"@tootallnate/once" "1"
|
||||||
|
agent-base "6"
|
||||||
|
debug "4"
|
||||||
|
|
||||||
http-signature@~1.2.0:
|
http-signature@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
||||||
|
@ -1340,14 +1368,6 @@ http-signature@~1.2.0:
|
||||||
jsprim "^1.2.2"
|
jsprim "^1.2.2"
|
||||||
sshpk "^1.7.0"
|
sshpk "^1.7.0"
|
||||||
|
|
||||||
https-proxy-agent@^2.2.0:
|
|
||||||
version "2.2.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793"
|
|
||||||
integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==
|
|
||||||
dependencies:
|
|
||||||
agent-base "^4.3.0"
|
|
||||||
debug "^3.1.0"
|
|
||||||
|
|
||||||
https-proxy-agent@^3.0.0:
|
https-proxy-agent@^3.0.0:
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81"
|
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81"
|
||||||
|
@ -1356,6 +1376,14 @@ https-proxy-agent@^3.0.0:
|
||||||
agent-base "^4.3.0"
|
agent-base "^4.3.0"
|
||||||
debug "^3.1.0"
|
debug "^3.1.0"
|
||||||
|
|
||||||
|
https-proxy-agent@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
|
||||||
|
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
|
||||||
|
dependencies:
|
||||||
|
agent-base "6"
|
||||||
|
debug "4"
|
||||||
|
|
||||||
ieee754@^1.1.4:
|
ieee754@^1.1.4:
|
||||||
version "1.1.13"
|
version "1.1.13"
|
||||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
|
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
|
||||||
|
@ -1966,7 +1994,7 @@ ms@2.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||||
|
|
||||||
ms@^2.1.1:
|
ms@2.1.2, ms@^2.1.1:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||||
|
|
Loading…
Reference in New Issue