@@ -48,28 +48,26 @@ export default class Http {
4848 return new Promise ( ( resolve , reject ) => {
4949 const request = new window . XMLHttpRequest ( ) ;
5050 request . open ( method , url ) ;
51- request . onload = function ( ) {
51+ request . onload = function ( ) {
52+ let response ;
5253 try {
53- const response = JSON . parse ( request . response ) ;
54-
55- if ( request . status . toString ( ) === HTTP_STATUS . OK ) {
56- resolve ( response ) ;
57- } else {
58- reject (
59- new Error ( {
60- body : response ,
61- status : request . status ,
62- } ) ,
63- ) ;
64- }
54+ response = JSON . parse ( request . response ) ;
6555 } catch ( e ) {
66- reject (
67- new Error ( {
68- body : request . responseText ,
69- status : request . status ,
70- } ) ,
71- ) ;
56+ // JSON failed to parse. Create a placeholder response.
57+ response = {
58+ error : {
59+ message : 'Failed to parse response JSON.' ,
60+ }
61+ } ;
62+ reject ( convertXhrErrorToRequestPromiseError ( request , response ) ) ;
63+ return ;
64+ }
65+ if ( request . status . toString ( ) !== HTTP_STATUS . OK ) {
66+ reject ( convertXhrErrorToRequestPromiseError ( request , response ) ) ;
67+ return ;
7268 }
69+
70+ resolve ( response ) ;
7371 } ;
7472 request . setRequestHeader ( 'Content-Type' , 'application/json' ) ;
7573 request . setRequestHeader ( 'Accept' , 'application/json' ) ;
@@ -126,3 +124,17 @@ export default class Http {
126124 } ) ;
127125 }
128126}
127+
128+ /**
129+ * Converts the given XHR error to an error that looks like one that would
130+ * be returned by the request-promise API.
131+ * @param {XMLHttpRequest } request
132+ * @param {any } response
133+ */
134+ function convertXhrErrorToRequestPromiseError ( request , response ) {
135+ return {
136+ name : 'StatusCodeError' ,
137+ error : response ,
138+ statusCode : request . status ,
139+ } ;
140+ }
0 commit comments