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": {
"@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",

View File

@ -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 }

View File

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