From 25187609fed23822f0e29cfa2502aeecac29a78f Mon Sep 17 00:00:00 2001 From: BatLeDev Date: Fri, 29 May 2026 16:08:05 +0200 Subject: [PATCH] fix(lib-node): destroy streamed error response body to avoid socket leak A response with responseType:'stream' whose status fails validateStatus leaves its body as an unconsumed Readable bound to a keepalive socket. The error interceptor dropped the reference without draining it, leaking the socket; after maxSockets such errors the host pool is exhausted and every later request to that host hangs. Destroy the stream before delete. --- packages/node/axios.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node/axios.ts b/packages/node/axios.ts index e7229d3..11b877f 100644 --- a/packages/node/axios.ts +++ b/packages/node/axios.ts @@ -46,7 +46,8 @@ export function axiosBuilder (opts: CreateAxiosDefaults = {}, beforeInterceptors delete error.response.request error.response.config = { method: error.response.config.method, url: error.response.config.url, data: error.response.config.data } if (error.response.config.data && error.response.config.data._writableState) delete error.response.config.data - if (error.response.data && error.response.data._readableState) delete error.response.data + // destroy() a streamed error body before dropping it, else its socket leaks + if (error.response.data && error.response.data._readableState) { error.response.data.destroy(); delete error.response.data } let messageText = error.response.statusText if (error.response.data) { messageText = typeof error.response.data === 'string' ? error.response.data : JSON.stringify(error.response.data)