Skip to content

Commit 35b537a

Browse files
authored
fix(traffic): support Response.error() replays (#63)
1 parent 02157b5 commit 35b537a

File tree

3 files changed

+169
-0
lines changed

3 files changed

+169
-0
lines changed

src/traffic/utils/har-utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,17 @@ export function toResponseBody(
3636
}
3737

3838
export function toResponse(responseEntry: Har.Response): Response {
39+
if (responseEntry.status === 0) {
40+
return Response.error()
41+
}
42+
3943
const body = toResponseBody(responseEntry.content)
4044
const response = new Response(body, {
4145
status: responseEntry.status,
4246
statusText: responseEntry.statusText,
4347
headers: toHeaders(responseEntry.headers),
4448
})
49+
4550
return response
4651
}
4752

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
{
2+
"log": {
3+
"version": "1.2",
4+
"creator": {
5+
"name": "WebInspector",
6+
"version": "537.36"
7+
},
8+
"pages": [],
9+
"entries": [
10+
{
11+
"_initiator": {
12+
"type": "script",
13+
"stack": {
14+
"callFrames": [
15+
{
16+
"functionName": "eval",
17+
"scriptId": "13",
18+
"url": "",
19+
"lineNumber": 3,
20+
"columnNumber": 39
21+
},
22+
{
23+
"functionName": "eval",
24+
"scriptId": "13",
25+
"url": "",
26+
"lineNumber": 1,
27+
"columnNumber": 56
28+
},
29+
{
30+
"functionName": "evaluate",
31+
"scriptId": "6",
32+
"url": "",
33+
"lineNumber": 340,
34+
"columnNumber": 15
35+
},
36+
{
37+
"functionName": "",
38+
"scriptId": "12",
39+
"url": "",
40+
"lineNumber": 0,
41+
"columnNumber": 43
42+
}
43+
]
44+
}
45+
},
46+
"_priority": "High",
47+
"_resourceType": "fetch",
48+
"cache": {},
49+
"connection": "29",
50+
"request": {
51+
"method": "GET",
52+
"url": "http://127.0.0.1:61959/resource",
53+
"httpVersion": "HTTP/1.1",
54+
"headers": [
55+
{
56+
"name": "Host",
57+
"value": "127.0.0.1:61959"
58+
},
59+
{
60+
"name": "Connection",
61+
"value": "keep-alive"
62+
},
63+
{
64+
"name": "sec-ch-ua",
65+
"value": "\"Chromium\";v=\"93\", \" Not;A Brand\";v=\"99\""
66+
},
67+
{
68+
"name": "sec-ch-ua-mobile",
69+
"value": "?0"
70+
},
71+
{
72+
"name": "User-Agent",
73+
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36"
74+
},
75+
{
76+
"name": "sec-ch-ua-platform",
77+
"value": "\"macOS\""
78+
},
79+
{
80+
"name": "Accept",
81+
"value": "*/*"
82+
},
83+
{
84+
"name": "Origin",
85+
"value": "null"
86+
},
87+
{
88+
"name": "Sec-Fetch-Site",
89+
"value": "cross-site"
90+
},
91+
{
92+
"name": "Sec-Fetch-Mode",
93+
"value": "cors"
94+
},
95+
{
96+
"name": "Sec-Fetch-Dest",
97+
"value": "empty"
98+
},
99+
{
100+
"name": "Accept-Encoding",
101+
"value": "gzip, deflate, br"
102+
},
103+
{
104+
"name": "Accept-Language",
105+
"value": "en-US,en;q=0.9"
106+
}
107+
],
108+
"queryString": [],
109+
"cookies": [],
110+
"headersSize": 473,
111+
"bodySize": 0
112+
},
113+
"response": {
114+
"status": 0,
115+
"statusText": "",
116+
"httpVersion": "HTTP/1.1",
117+
"headers": [],
118+
"cookies": [],
119+
"content": {},
120+
"redirectURL": "",
121+
"headersSize": 0,
122+
"bodySize": -1,
123+
"_transferSize": 0,
124+
"_error": null
125+
},
126+
"serverIPAddress": "127.0.0.1",
127+
"startedDateTime": "2021-08-12T14:32:07.024Z",
128+
"time": 7.389999998976128,
129+
"timings": {
130+
"blocked": 0.6869999996825354,
131+
"dns": 0.0050000000000000044,
132+
"ssl": -1,
133+
"connect": 0.19199999999999998,
134+
"send": 0.10300000000000004,
135+
"wait": 6.10100000073819,
136+
"receive": 0.30199999855540227,
137+
"_blocked_queueing": 0.5309999996825354
138+
}
139+
}
140+
]
141+
}
142+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { fromTraffic } from '../../src/traffic/from-traffic'
2+
import { InspectedHandler, inspectHandlers } from '../support/inspect'
3+
import { normalizeLocalhost, readArchive } from './utils'
4+
5+
it('replays an error response (status code 0)', async () => {
6+
const har = readArchive('test/traffic/fixtures/archives/response-error.har')
7+
const handlers = fromTraffic(har, normalizeLocalhost)
8+
expect(await inspectHandlers(handlers)).toEqual<InspectedHandler[]>([
9+
{
10+
handler: {
11+
method: 'GET',
12+
path: 'http://localhost/resource',
13+
},
14+
response: {
15+
status: 0,
16+
statusText: '',
17+
headers: [],
18+
body: '',
19+
},
20+
},
21+
])
22+
})

0 commit comments

Comments
 (0)