UNPKG

@atlassian/bitbucket-server

Version:

Bitbucket Server API client for Browser and Node.js

85 lines (70 loc) 2.15 kB
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