@@ -21,28 +21,66 @@ async function getResolveErrorBodyCallback ({ callback, body, contentType, statu
21
21
}
22
22
}
23
23
24
+ const message = `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } `
25
+
24
26
if ( statusCode === 204 || ! contentType || ! chunks ) {
25
- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers ) )
27
+ queueMicrotask ( ( ) => callback ( new ResponseStatusCodeError ( message , statusCode , headers ) ) )
26
28
return
27
29
}
28
30
29
- try {
30
- if ( contentType . startsWith ( 'application/json' ) ) {
31
- const payload = JSON . parse ( chunksDecode ( chunks , length ) )
32
- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers , payload ) )
33
- return
34
- }
31
+ const stackTraceLimit = Error . stackTraceLimit
32
+ Error . stackTraceLimit = 0
33
+ let payload
35
34
36
- if ( contentType . startsWith ( 'text/' ) ) {
37
- const payload = chunksDecode ( chunks , length )
38
- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers , payload ) )
39
- return
35
+ try {
36
+ if ( isContentTypeApplicationJson ( contentType ) ) {
37
+ payload = JSON . parse ( chunksDecode ( chunks , length ) )
38
+ } else if ( isContentTypeText ( contentType ) ) {
39
+ payload = chunksDecode ( chunks , length )
40
40
}
41
- } catch ( err ) {
42
- // Process in a fallback if error
41
+ } catch {
42
+ // process in a callback to avoid throwing in the microtask queue
43
+ } finally {
44
+ Error . stackTraceLimit = stackTraceLimit
43
45
}
46
+ queueMicrotask ( ( ) => callback ( new ResponseStatusCodeError ( message , statusCode , headers , payload ) ) )
47
+ }
48
+
49
+ const isContentTypeApplicationJson = ( contentType ) => {
50
+ return (
51
+ contentType . length > 15 &&
52
+ contentType [ 11 ] === '/' &&
53
+ contentType [ 0 ] === 'a' &&
54
+ contentType [ 1 ] === 'p' &&
55
+ contentType [ 2 ] === 'p' &&
56
+ contentType [ 3 ] === 'l' &&
57
+ contentType [ 4 ] === 'i' &&
58
+ contentType [ 5 ] === 'c' &&
59
+ contentType [ 6 ] === 'a' &&
60
+ contentType [ 7 ] === 't' &&
61
+ contentType [ 8 ] === 'i' &&
62
+ contentType [ 9 ] === 'o' &&
63
+ contentType [ 10 ] === 'n' &&
64
+ contentType [ 12 ] === 'j' &&
65
+ contentType [ 13 ] === 's' &&
66
+ contentType [ 14 ] === 'o' &&
67
+ contentType [ 15 ] === 'n'
68
+ )
69
+ }
44
70
45
- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers ) )
71
+ const isContentTypeText = ( contentType ) => {
72
+ return (
73
+ contentType . length > 4 &&
74
+ contentType [ 4 ] === '/' &&
75
+ contentType [ 0 ] === 't' &&
76
+ contentType [ 1 ] === 'e' &&
77
+ contentType [ 2 ] === 'x' &&
78
+ contentType [ 3 ] === 't'
79
+ )
46
80
}
47
81
48
- module . exports = { getResolveErrorBodyCallback }
82
+ module . exports = {
83
+ getResolveErrorBodyCallback,
84
+ isContentTypeApplicationJson,
85
+ isContentTypeText
86
+ }
0 commit comments