diff --git a/package.json b/package.json index 0ae3e4757..e8cda8934 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ }, "dependencies": { "@marsaud/smb2-promise": "^0.2.1", + "@nraynaud/struct-fu": "^1.0.1", "app-conf": "^0.4.0", "babel-runtime": "^6.5.0", "base64url": "^2.0.0", @@ -64,6 +65,7 @@ "http-server-plus": "^0.7.0", "human-format": "^0.7.0", "is-my-json-valid": "^2.13.1", + "is-redirect": "^1.0.0", "js-yaml": "^3.2.7", "json-rpc-peer": "^0.12.0", "json5": "^0.5.0", @@ -93,7 +95,6 @@ "semver": "^5.1.0", "serve-static": "^1.9.2", "stack-chain": "^1.3.3", - "@nraynaud/struct-fu": "^1.0.1", "tar-stream": "^1.5.2", "through2": "^2.0.0", "trace": "^2.0.1", diff --git a/src/http-request.js b/src/http-request.js index 99c8ce2aa..cf00564f6 100644 --- a/src/http-request.js +++ b/src/http-request.js @@ -1,27 +1,22 @@ -import assign from 'lodash/assign' -import startsWith from 'lodash/startsWith' -import { parse as parseUrl } from 'url' +import isRedirect from 'is-redirect' +import { assign, isString, startsWith } from 'lodash' import { request as httpRequest } from 'http' import { request as httpsRequest } from 'https' import { stringify as formatQueryString } from 'querystring' - import { - isString, - streamToBuffer -} from './utils' + format as formatUrl, + parse as parseUrl, + resolve as resolveUrl +} from 'url' + +import { streamToBuffer } from './utils' // ------------------------------------------------------------------- -export default (...args) => { +const raw = opts => { let req const pResponse = new Promise((resolve, reject) => { - const opts = {} - for (let i = 0, length = args.length; i < length; ++i) { - const arg = args[i] - assign(opts, isString(arg) ? parseUrl(arg) : arg) - } - const { body, headers: { ...headers } = {}, @@ -62,11 +57,16 @@ export default (...args) => { } } - req = ( - protocol && startsWith(protocol.toLowerCase(), 'https') - ? httpsRequest - : httpRequest - )({ + const secure = protocol && startsWith(protocol.toLowerCase(), 'https') + let requestFn + if (secure) { + requestFn = httpsRequest + } else { + requestFn = httpRequest + delete rest.rejectUnauthorized + } + + req = requestFn({ ...rest, headers }) @@ -98,6 +98,11 @@ export default (...args) => { } const code = response.statusCode + const { location } = response.headers + if (isRedirect(code) && location) { + assign(opts, parseUrl(resolveUrl(formatUrl(opts), location))) + return raw(opts) + } if (code < 200 || code >= 300) { const error = new Error(response.statusMessage) error.code = code @@ -112,13 +117,27 @@ export default (...args) => { return response }) - - pResponse.cancel = () => { - req.emit('error', new Error('HTTP request canceled!')) - req.abort() - } - pResponse.readAll = () => pResponse.then(response => response.readAll()) pResponse.request = req return pResponse } + +const httpRequestPlus = (...args) => { + const opts = {} + for (let i = 0, length = args.length; i < length; ++i) { + const arg = args[i] + assign(opts, isString(arg) ? parseUrl(arg) : arg) + } + + const pResponse = raw(opts) + + pResponse.cancel = () => { + const { request } = pResponse + request.emit('error', new Error('HTTP request canceled!')) + request.abort() + } + pResponse.readAll = () => pResponse.then(response => response.readAll()) + + return pResponse +} +export { httpRequestPlus as default } diff --git a/src/xapi/index.js b/src/xapi/index.js index 69549a84a..24f334dd1 100644 --- a/src/xapi/index.js +++ b/src/xapi/index.js @@ -767,7 +767,8 @@ export default class Xapi extends XapiBase { session_id: this.sessionId, task_id: taskRef, use_compression: compress ? 'true' : 'false' - } + }, + rejectUnauthorized: false }) }