fix(http-request): handle redirections (#432)

This commit is contained in:
Julien Fontanet 2016-10-27 15:34:54 +02:00 committed by GitHub
parent 4eec5e06fc
commit 8d390d256d
3 changed files with 48 additions and 27 deletions

View File

@ -35,6 +35,7 @@
}, },
"dependencies": { "dependencies": {
"@marsaud/smb2-promise": "^0.2.1", "@marsaud/smb2-promise": "^0.2.1",
"@nraynaud/struct-fu": "^1.0.1",
"app-conf": "^0.4.0", "app-conf": "^0.4.0",
"babel-runtime": "^6.5.0", "babel-runtime": "^6.5.0",
"base64url": "^2.0.0", "base64url": "^2.0.0",
@ -64,6 +65,7 @@
"http-server-plus": "^0.7.0", "http-server-plus": "^0.7.0",
"human-format": "^0.7.0", "human-format": "^0.7.0",
"is-my-json-valid": "^2.13.1", "is-my-json-valid": "^2.13.1",
"is-redirect": "^1.0.0",
"js-yaml": "^3.2.7", "js-yaml": "^3.2.7",
"json-rpc-peer": "^0.12.0", "json-rpc-peer": "^0.12.0",
"json5": "^0.5.0", "json5": "^0.5.0",
@ -93,7 +95,6 @@
"semver": "^5.1.0", "semver": "^5.1.0",
"serve-static": "^1.9.2", "serve-static": "^1.9.2",
"stack-chain": "^1.3.3", "stack-chain": "^1.3.3",
"@nraynaud/struct-fu": "^1.0.1",
"tar-stream": "^1.5.2", "tar-stream": "^1.5.2",
"through2": "^2.0.0", "through2": "^2.0.0",
"trace": "^2.0.1", "trace": "^2.0.1",

View File

@ -1,27 +1,22 @@
import assign from 'lodash/assign' import isRedirect from 'is-redirect'
import startsWith from 'lodash/startsWith' import { assign, isString, startsWith } from 'lodash'
import { parse as parseUrl } from 'url'
import { request as httpRequest } from 'http' import { request as httpRequest } from 'http'
import { request as httpsRequest } from 'https' import { request as httpsRequest } from 'https'
import { stringify as formatQueryString } from 'querystring' import { stringify as formatQueryString } from 'querystring'
import { import {
isString, format as formatUrl,
streamToBuffer parse as parseUrl,
} from './utils' resolve as resolveUrl
} from 'url'
import { streamToBuffer } from './utils'
// ------------------------------------------------------------------- // -------------------------------------------------------------------
export default (...args) => { const raw = opts => {
let req let req
const pResponse = new Promise((resolve, reject) => { 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 { const {
body, body,
headers: { ...headers } = {}, headers: { ...headers } = {},
@ -62,11 +57,16 @@ export default (...args) => {
} }
} }
req = ( const secure = protocol && startsWith(protocol.toLowerCase(), 'https')
protocol && startsWith(protocol.toLowerCase(), 'https') let requestFn
? httpsRequest if (secure) {
: httpRequest requestFn = httpsRequest
)({ } else {
requestFn = httpRequest
delete rest.rejectUnauthorized
}
req = requestFn({
...rest, ...rest,
headers headers
}) })
@ -98,6 +98,11 @@ export default (...args) => {
} }
const code = response.statusCode 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) { if (code < 200 || code >= 300) {
const error = new Error(response.statusMessage) const error = new Error(response.statusMessage)
error.code = code error.code = code
@ -112,13 +117,27 @@ export default (...args) => {
return response return response
}) })
pResponse.cancel = () => {
req.emit('error', new Error('HTTP request canceled!'))
req.abort()
}
pResponse.readAll = () => pResponse.then(response => response.readAll())
pResponse.request = req pResponse.request = req
return pResponse 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 }

View File

@ -767,7 +767,8 @@ export default class Xapi extends XapiBase {
session_id: this.sessionId, session_id: this.sessionId,
task_id: taskRef, task_id: taskRef,
use_compression: compress ? 'true' : 'false' use_compression: compress ? 'true' : 'false'
} },
rejectUnauthorized: false
}) })
} }