Skip to content

Commit e9f4258

Browse files
authored
fix: fix socket info if fetch failed (#556)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Enhanced error handling in the fetch functionality for better diagnostics and tracking of request timing. - Improved compatibility with Node.js 16 by ensuring the presence of global objects. - **Bug Fixes** - Added robust error handling for socket information retrieval during fetch operations. - **Tests** - Introduced a new test case for the fetch function to validate error handling and ensure diagnostic messages include socket information. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent f2610d5 commit e9f4258

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

src/fetch.ts

+2
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ export class FetchFactory {
218218
res = await UndiciFetch(input, init);
219219
});
220220
} catch (e: any) {
221+
updateSocketInfo(socketInfo, internalOpaque /* , rawError */);
222+
urllibResponse.rt = performanceTime(requestStartTime);
221223
channels.fetchResponse.publish({
222224
fetch: fetchMeta,
223225
error: e,

src/utils.ts

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ export function isReadable(stream: any) {
159159

160160
export function updateSocketInfo(socketInfo: SocketInfo, internalOpaque: any, err?: any) {
161161
const socket = internalOpaque[symbols.kRequestSocket] ?? err?.[symbols.kErrorSocket];
162+
162163
if (socket) {
163164
socketInfo.id = socket[symbols.kSocketId];
164165
socketInfo.handledRequests = socket[symbols.kHandledRequests];

test/fetch.test.ts

+40
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,44 @@ describe('fetch.test.ts', () => {
5757
assert(stats);
5858
assert(Object.keys(stats).length > 0);
5959
});
60+
61+
it('fetch error should has socket info', async () => {
62+
let requestDiagnosticsMessage: RequestDiagnosticsMessage;
63+
let responseDiagnosticsMessage: ResponseDiagnosticsMessage;
64+
let fetchDiagnosticsMessage: FetchDiagnosticsMessage;
65+
let fetchResponseDiagnosticsMessage: FetchResponseDiagnosticsMessage;
66+
diagnosticsChannel.subscribe('urllib:request', msg => {
67+
requestDiagnosticsMessage = msg as RequestDiagnosticsMessage;
68+
});
69+
diagnosticsChannel.subscribe('urllib:response', msg => {
70+
responseDiagnosticsMessage = msg as ResponseDiagnosticsMessage;
71+
});
72+
diagnosticsChannel.subscribe('urllib:fetch:request', msg => {
73+
fetchDiagnosticsMessage = msg as FetchDiagnosticsMessage;
74+
});
75+
diagnosticsChannel.subscribe('urllib:fetch:response', msg => {
76+
fetchResponseDiagnosticsMessage = msg as FetchResponseDiagnosticsMessage;
77+
});
78+
FetchFactory.setClientOptions({});
79+
80+
try {
81+
await fetch(`${_url}html?timeout=9999`, {
82+
signal: AbortSignal.timeout(100),
83+
});
84+
} catch (error) {
85+
console.log(error);
86+
}
87+
88+
assert(requestDiagnosticsMessage!.request);
89+
assert(responseDiagnosticsMessage!.request);
90+
assert(responseDiagnosticsMessage!.response);
91+
assert([ '127.0.0.1', '::1' ].includes(responseDiagnosticsMessage!.response.socket.localAddress));
92+
93+
assert(fetchDiagnosticsMessage!.fetch);
94+
assert(fetchResponseDiagnosticsMessage!.fetch);
95+
96+
const stats = FetchFactory.getDispatcherPoolStats();
97+
assert(stats);
98+
assert(Object.keys(stats).length > 0);
99+
});
60100
});

0 commit comments

Comments
 (0)