@atlassian/bitbucket-server
Version:
Bitbucket Server API client for Browser and Node.js
85 lines (70 loc) • 2.15 kB
JavaScript
const fetch = require( 'node-fetch' )
const debug = require( 'debug' )( 'bitbucket-server' )
const getBuffer = require( '../utils/get-buffer-response' )
const HTTPError = require( './http-error' )
const getData = response => {
let contentType = response.headers.get( 'content-type' )
if ( /application\/json/.test( contentType ) ) {
if ( response.body && response.status !== 204 ) { return response.json() } else { return '' }
}
if ( !contentType || /^text\/|charset=utf-8$/.test( contentType ) ) {
return response.text()
}
return getBuffer( response )
}
/**
* Performs HTTP Request
* @param {Object} requestOptions
* @returns {Promise} ({data,headers}) on success
* @throws {HTTPError} on failure
*/
const request = requestOptions => {
debug( 'REQUEST:', requestOptions )
let { method, url, headers, body, timeout, agent } = requestOptions
// https://fetch.spec.whatwg.org/#methods
method = method.toUpperCase()
let options = {
method,
headers,
body,
timeout,
agent
}
let responseHeaders = {}
return fetch( url, options )
.then( response => {
for ( let [field, value] of response.headers.entries() ) {
responseHeaders[field] = value
}
if ( response.status >= 400 || [304].includes( response.status ) ) {
return getData( response ).then( error => {
if ( Array.isArray( error.errors ) && error.errors.length > 0 ) {
error = error.errors[0]
}
var msg = ''
if ( error.error ) {
msg = error.error
}
if ( error.errorMessages ) {
msg = error.errorMessages[0]
}
if ( error.message ) {
msg = error.message
}
throw new HTTPError( msg, response.status, responseHeaders )
} )
}
return getData( response )
} )
.then( data => ( {
data,
headers: responseHeaders
} ) )
.catch( error => {
if ( error instanceof HTTPError ) {
throw error
}
throw new HTTPError( error.message, 500, responseHeaders )
} )
}
module.exports = request