Skip to content

Commit

Permalink
feat: send api version number in header to API
Browse files Browse the repository at this point in the history
  • Loading branch information
Joe Holdcroft committed Jul 22, 2019
1 parent b99e974 commit a08cd5f
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 76 deletions.
151 changes: 78 additions & 73 deletions src/lib/request/request.ts
Expand Up @@ -10,95 +10,100 @@ import * as analytics from '../analytics';
import { Agent } from 'http';
import { Global } from '../../cli/args';
import { Payload } from './types';
import * as version from '../version';

const debug = debugModule('snyk:req');
const snykDebug = debugModule('snyk');

declare const global: Global;

export = function makeRequest(payload: Payload) {
return new Promise((resolve, reject) => {
const body = payload.body;
let data;
return version().then((versionNumber) => (
new Promise((resolve, reject) => {
const body = payload.body;
let data;

delete payload.body;
delete payload.body;

if (body) {
const json = JSON.stringify(body);
if (json.length < 1e4) {
debug(JSON.stringify(body, null, 2));
if (!payload.headers) {
payload.headers = {};
}

// always compress going upstream
data = zlib.gzipSync(json, {level: 9});
payload.headers['x-snyk-cli-version'] = versionNumber;

if (body) {
const json = JSON.stringify(body);
if (json.length < 1e4) {
debug(JSON.stringify(body, null, 2));
}

// always compress going upstream
data = zlib.gzipSync(json, {level: 9});

snykDebug('sending request to:', payload.url);
snykDebug('request body size:', json.length);
snykDebug('gzipped request body size:', data.length);
if (!payload.url.endsWith('/analytics/cli')) {
analytics.add('payloadSize', json.length);
analytics.add('gzippedPayloadSize', data.length);
snykDebug('sending request to:', payload.url);
snykDebug('request body size:', json.length);
snykDebug('gzipped request body size:', data.length);
if (!payload.url.endsWith('/analytics/cli')) {
analytics.add('payloadSize', json.length);
analytics.add('gzippedPayloadSize', data.length);
}

payload.headers['content-encoding'] = 'gzip';
payload.headers['content-length'] = data.length;
}

if (!payload.headers) {
payload.headers = {};
const parsedUrl = parse(payload.url);

if (parsedUrl.protocol === 'http:' && parsedUrl.hostname !== 'localhost') {
debug('forcing api request to https');
parsedUrl.protocol = 'https:';
payload.url = format(parsedUrl);
}

// prefer config timeout unless payload specified
if (!payload.hasOwnProperty('timeout')) {
payload.timeout = config.timeout * 1000; // s -> ms
}

debug('request payload: ', JSON.stringify(payload));

const method = (payload.method || 'get').toLowerCase() as needle.NeedleHttpVerbs;
let url = payload.url;

if (payload.qs) {
url = url + '?' + querystring.stringify(payload.qs);
delete payload.qs;
}

const options: needle.NeedleOptions = {
json: payload.json,
headers: payload.headers,
timeout: payload.timeout,
follow_max: 5,
};

const proxyUri = getProxyForUrl(url);
if (proxyUri) {
snykDebug('using proxy:', proxyUri);
options.agent = new ProxyAgent(proxyUri) as unknown as Agent;
} else {
snykDebug('not using proxy');
}

payload.headers['content-encoding'] = 'gzip';
payload.headers['content-length'] = data.length;
}

const parsedUrl = parse(payload.url);

if (parsedUrl.protocol === 'http:' && parsedUrl.hostname !== 'localhost') {
debug('forcing api request to https');
parsedUrl.protocol = 'https:';
payload.url = format(parsedUrl);
}

// prefer config timeout unless payload specified
if (!payload.hasOwnProperty('timeout')) {
payload.timeout = config.timeout * 1000; // s -> ms
}

debug('request payload: ', JSON.stringify(payload));

const method = (payload.method || 'get').toLowerCase() as needle.NeedleHttpVerbs;
let url = payload.url;

if (payload.qs) {
url = url + '?' + querystring.stringify(payload.qs);
delete payload.qs;
}

const options: needle.NeedleOptions = {
json: payload.json,
headers: payload.headers,
timeout: payload.timeout,
follow_max: 5,
};

const proxyUri = getProxyForUrl(url);
if (proxyUri) {
snykDebug('using proxy:', proxyUri);
options.agent = new ProxyAgent(proxyUri) as unknown as Agent;
} else {
snykDebug('not using proxy');
}

if (global.ignoreUnknownCA) {
debug('Using insecure mode (ignore unkown certificate authority)');
options.rejectUnauthorized = false;
}

needle.request(method, url, data, options, (err, res, respBody) => {
debug(err);
debug('response (%s): ', (res || {}).statusCode, JSON.stringify(respBody));
if (err) {
return reject(err);
if (global.ignoreUnknownCA) {
debug('Using insecure mode (ignore unkown certificate authority)');
options.rejectUnauthorized = false;
}

resolve({res, body: respBody});
});
});
needle.request(method, url, data, options, (err, res, respBody) => {
debug(err);
debug('response (%s): ', (res || {}).statusCode, JSON.stringify(respBody));
if (err) {
return reject(err);
}

resolve({res, body: respBody});
});
})
));
};

0 comments on commit a08cd5f

Please sign in to comment.