@@ -70,8 +70,11 @@ export default Ember.Mixin.create({
7070 @param {Function } reject - Promise reject handler
7171 */
7272 fetchServerErrorHandler ( response , reject ) {
73- let msg = 'The Service responded with a ' + response . status + ' error.' ;
74- reject ( new ServerError ( msg , response ) ) ;
73+ response . text ( ) . then ( function ( respText ) {
74+ let msg = parseFetchErrorMessage ( response ) ;
75+ let json = parseFetchErrorText ( respText , response ) ;
76+ reject ( new ServerError ( msg , json ) ) ;
77+ } ) ;
7578 } ,
7679
7780 /**
@@ -82,14 +85,9 @@ export default Ember.Mixin.create({
8285 @param {Function } reject - Promise reject handler
8386 */
8487 fetchClientErrorHandler ( response , reject ) {
85- response . text ( ) . then ( function ( resp ) {
86- let json , msg = 'The API responded with a ' + response . status + ' error.' ;
87- try {
88- json = JSON . parse ( resp ) ;
89- } catch ( e ) {
90- Ember . Logger . error ( e ) ;
91- json = { "errors" : [ { "status" : response . status } ] } ;
92- }
88+ response . text ( ) . then ( function ( respText ) {
89+ let msg = parseFetchErrorMessage ( response ) ;
90+ let json = parseFetchErrorText ( respText , response ) ;
9391 reject ( new ClientError ( msg , json ) ) ;
9492 } ) ;
9593 } ,
@@ -98,12 +96,22 @@ export default Ember.Mixin.create({
9896 Fetch generic error handler
9997
10098 @method fetchErrorHandler
101- @param {Response } response - Fetch response
99+ @param {Error| Response } error - Fetch error or response object
102100 @param {Function } reject - Promise reject handler
103101 */
104102 fetchErrorHandler ( error , reject ) {
105- let msg = ( error && error . message ) ? error . message : 'Unable to Fetch resource(s)' ;
106- reject ( new FetchError ( msg , error ) ) ;
103+ let msg = 'Unable to Fetch resource(s)' ;
104+ if ( error instanceof Error ) {
105+ msg = ( error && error . message ) ? error . message : msg ;
106+ reject ( new FetchError ( msg , error ) ) ;
107+ } else if ( typeof error . text === 'function' ) {
108+ error . text ( ) . then ( function ( respText ) {
109+ msg = parseFetchErrorMessage ( error ) ;
110+ reject ( new FetchError ( msg , parseFetchErrorText ( respText , error ) ) ) ;
111+ } ) ;
112+ } else {
113+ reject ( new FetchError ( msg , error ) ) ;
114+ }
107115 } ,
108116
109117 /**
@@ -219,7 +227,8 @@ export default Ember.Mixin.create({
219227 */
220228 ajaxServerErrorHandler ( jqXHR , textStatus , errorThrown , reject ) {
221229 let msg = 'The Service responded with ' + textStatus + ' ' + jqXHR . status ;
222- reject ( new ServerError ( msg , jqXHR . responseJSON || jqXHR . responseText || errorThrown ) ) ;
230+ let json = parseXhrErrorResponse ( jqXHR , errorThrown ) ;
231+ reject ( new ServerError ( msg , json ) ) ;
223232 } ,
224233
225234 /**
@@ -233,18 +242,7 @@ export default Ember.Mixin.create({
233242 */
234243 ajaxClientErrorHandler ( jqXHR , textStatus , errorThrown , reject ) {
235244 let msg = 'The API responded with a ' + jqXHR . status + ' error.' ;
236- let json = jqXHR . responseJSON ;
237- if ( ! json ) {
238- json = {
239- "errors" : [
240- {
241- "status" : jqXHR . status ,
242- "detail" : jqXHR . responseText ,
243- "message" : errorThrown
244- }
245- ]
246- } ;
247- }
245+ let json = parseXhrErrorResponse ( jqXHR , errorThrown ) ;
248246 reject ( new ClientError ( msg , json ) ) ;
249247 } ,
250248
@@ -259,12 +257,8 @@ export default Ember.Mixin.create({
259257 */
260258 ajaxErrorHandler ( jqXHR , textStatus , errorThrown , reject ) {
261259 let msg = ( errorThrown ) ? errorThrown : 'Unable to Fetch resource(s)' ;
262- reject ( new FetchError ( msg , {
263- code : jqXHR . status ,
264- message : errorThrown ,
265- 'status' : textStatus ,
266- response : jqXHR . responseText
267- } ) ) ;
260+ let json = parseXhrErrorResponse ( jqXHR , errorThrown ) ;
261+ reject ( new FetchError ( msg , json ) ) ;
268262 } ,
269263
270264 /**
@@ -326,3 +320,51 @@ export default Ember.Mixin.create({
326320 }
327321
328322} ) ;
323+
324+ function parseFetchErrorMessage ( response ) {
325+ return [
326+ 'The API responded with a ' ,
327+ response . status ,
328+ ( response . statusText ) ? ' (' + response . statusText + ') ' : '' ,
329+ ' error.'
330+ ] . join ( '' ) ;
331+ }
332+
333+ function parseFetchErrorText ( text , response ) {
334+ let json ;
335+ try {
336+ json = JSON . parse ( text ) ;
337+ } catch ( err ) {
338+ Ember . Logger . warn ( err ) ;
339+ json = {
340+ "errors" : [ {
341+ "status" : response . status ,
342+ "detail" : text
343+ } ]
344+ } ;
345+ }
346+ json = json || { } ;
347+ json . status = response . status ;
348+ return json ;
349+ }
350+
351+ function parseXhrErrorResponse ( jqXHR , errorThrown ) {
352+ let json = jqXHR . responseJSON ;
353+ if ( ! json ) {
354+ try {
355+ if ( jqXHR . responseText ) {
356+ json = JSON . parse ( jqXHR . responseText ) ;
357+ }
358+ } catch ( err ) {
359+ Ember . Logger . warn ( err ) ;
360+ }
361+ }
362+ json = json || { } ;
363+ json . status = jqXHR . status ;
364+ json . errors = json . errors || [ {
365+ status : jqXHR . status ,
366+ detail : jqXHR . responseText ,
367+ message : errorThrown
368+ } ] ;
369+ return json ;
370+ }
0 commit comments