@cjwddz/mirror 2.0.10 → 2.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,31 @@
1
1
  /**
2
2
  * HTTP 隧道客户端
3
- * 接收来自服务端的 HTTP 请求,转发到本地服务,并将响应返回
3
+ * 支持多路隧道连接;协议为二进制控制帧 + 数据帧
4
4
  */
5
5
  import http from 'http';
6
6
  import https from 'https';
7
7
  import { WebSocket } from 'ws';
8
- import { isHttpTunnelMessage, } from './http-tunnel-protocol.js';
9
- /**
10
- * HTTP 隧道客户端类
11
- */
8
+ import { isBinaryFrame, decodeBinaryFrame, encodeBinaryControlFrame, encodeBinaryDataFrame, FRAME_REQUEST_START, FRAME_REQUEST_END, FRAME_RESPONSE_START, FRAME_RESPONSE_END, FRAME_TUNNEL_ERROR, FRAME_WS_UPGRADE, FRAME_WS_DATA, FRAME_WS_CLOSE, FRAME_BODY_REQUEST, FRAME_BODY_RESPONSE, } from './http-tunnel-protocol.js';
9
+ const RESPONSE_CHUNK_BUFFER_SIZE = 16 * 1024;
12
10
  export class HttpTunnelClient {
13
11
  targetUrl;
14
- tunnelWs;
12
+ tunnelWss;
15
13
  getTarget;
16
14
  httpAgent;
17
15
  httpsAgent;
18
- wsClients = new Map(); // requestId -> WebSocket client
16
+ wsClients = new Map();
17
+ pendingStreamRequests = new Map();
18
+ /** WS 请求对应的隧道连接,用于回写 WS_DATA/WS_CLOSE */
19
+ tunnelWsByRequestId = new Map();
19
20
  constructor(options) {
20
21
  this.targetUrl = new URL(options.targetUrl ?? 'http://localhost');
21
- this.tunnelWs = options.tunnelWs;
22
+ this.tunnelWss =
23
+ options.tunnelWss && options.tunnelWss.length > 0
24
+ ? options.tunnelWss
25
+ : options.tunnelWs
26
+ ? [options.tunnelWs]
27
+ : [];
22
28
  this.getTarget = options.getTarget ?? null;
23
- // 创建 HTTP 客户端代理
24
29
  this.httpAgent = new http.Agent({
25
30
  keepAlive: true,
26
31
  keepAliveMsecs: 1000,
@@ -32,281 +37,264 @@ export class HttpTunnelClient {
32
37
  keepAliveMsecs: 1000,
33
38
  maxSockets: Infinity,
34
39
  maxFreeSockets: 256,
35
- rejectUnauthorized: false, // 允许自签名证书
36
- });
37
- // 处理隧道消息
38
- this.tunnelWs.on('message', (data) => {
39
- this.handleTunnelMessage(data);
40
+ rejectUnauthorized: false,
40
41
  });
41
- // 处理隧道错误
42
- this.tunnelWs.on('error', (error) => {
43
- console.error('[HTTP Tunnel Client] Tunnel error:', error);
44
- });
45
- // 处理隧道关闭
46
- this.tunnelWs.on('close', () => {
47
- console.log('[HTTP Tunnel Client] Tunnel closed');
48
- // 关闭所有 WebSocket 客户端
49
- this.wsClients.forEach((ws) => ws.close());
50
- this.wsClients.clear();
42
+ this.tunnelWss.forEach((ws) => {
43
+ ws.on('message', (data) => this.handleTunnelMessage(data, ws));
44
+ ws.on('error', (error) => console.error('[HTTP Tunnel Client] Tunnel error:', error));
45
+ ws.on('close', () => {
46
+ this.wsClients.forEach((w) => w.close());
47
+ this.wsClients.clear();
48
+ this.tunnelWsByRequestId.clear();
49
+ });
51
50
  });
52
51
  }
53
- /**
54
- * 处理隧道消息
55
- */
56
- handleTunnelMessage(data) {
57
- try {
58
- // 正确处理 Buffer 和 string 类型的数据
59
- const messageStr = typeof data === 'string' ? data : data.toString('utf8');
60
- const message = JSON.parse(messageStr);
61
- if (!isHttpTunnelMessage(message)) {
62
- console.warn('[HTTP Tunnel Client] Invalid message received');
63
- return;
52
+ handleTunnelMessage(data, tunnelWs) {
53
+ const buf = typeof data === 'string' ? Buffer.from(data, 'utf8') : data;
54
+ if (buf.length < 1)
55
+ return;
56
+ if (buf[0] === 0x7b) {
57
+ try {
58
+ const msg = JSON.parse(buf.toString('utf8'));
59
+ if (msg.type === 'WELCOME')
60
+ return;
64
61
  }
65
- switch (message.type) {
66
- case 'WELCOME':
67
- // 忽略欢迎消息
68
- break;
69
- case 'HTTP_REQUEST':
70
- this.handleHttpRequest(message);
71
- break;
72
- case 'WS_UPGRADE':
73
- this.handleWsUpgrade(message);
74
- break;
75
- case 'WS_DATA':
76
- this.handleWsData(message);
77
- break;
78
- case 'WS_CLOSE':
79
- this.handleWsClose(message);
80
- break;
81
- default:
82
- console.warn('[HTTP Tunnel Client] Unexpected message type:', message.type);
62
+ catch {
63
+ // ignore
83
64
  }
84
65
  }
85
- catch (error) {
86
- console.error('[HTTP Tunnel Client] Error handling tunnel message:', error);
66
+ if (!isBinaryFrame(buf))
67
+ return;
68
+ const decoded = decodeBinaryFrame(buf);
69
+ if (!decoded)
70
+ return;
71
+ const { type, requestId, payload, payloadJson } = decoded;
72
+ switch (type) {
73
+ case FRAME_REQUEST_START: {
74
+ const method = payloadJson?.method ?? 'GET';
75
+ const url = payloadJson?.url ?? '/';
76
+ const headers = payloadJson?.headers ?? {};
77
+ const target = payloadJson?.target;
78
+ this.handleHttpRequestStart(requestId, method, url, headers, target, tunnelWs);
79
+ break;
80
+ }
81
+ case FRAME_BODY_REQUEST:
82
+ this.handleRequestBodyChunk(requestId, payload, tunnelWs);
83
+ break;
84
+ case FRAME_REQUEST_END:
85
+ this.handleHttpRequestEnd(requestId, tunnelWs);
86
+ break;
87
+ case FRAME_WS_UPGRADE: {
88
+ const url = payloadJson?.url ?? '/';
89
+ const headers = payloadJson?.headers ?? {};
90
+ this.handleWsUpgrade(requestId, url, headers, tunnelWs);
91
+ break;
92
+ }
93
+ case FRAME_WS_DATA:
94
+ this.handleWsData(requestId, payload);
95
+ break;
96
+ case FRAME_WS_CLOSE:
97
+ this.handleWsClose(requestId, payloadJson);
98
+ break;
99
+ default:
100
+ break;
101
+ }
102
+ }
103
+ handleRequestBodyChunk(requestId, payload, _tunnelWs) {
104
+ const pending = this.pendingStreamRequests.get(requestId);
105
+ if (pending?.req && !pending.req.destroyed)
106
+ pending.req.write(payload);
107
+ }
108
+ handleHttpRequestEnd(requestId, _tunnelWs) {
109
+ const pending = this.pendingStreamRequests.get(requestId);
110
+ if (pending?.req && !pending.req.destroyed) {
111
+ this.pendingStreamRequests.delete(requestId);
112
+ pending.req.end();
87
113
  }
88
114
  }
89
- /** 目标未写协议时拼成完整 URL;默认 http(本机服务多为 HTTP,入口 HTTPS 由 Nginx 终结) */
90
115
  normalizeTargetUrl(resolved) {
91
116
  if (resolved.startsWith('http://') || resolved.startsWith('https://'))
92
117
  return resolved;
93
118
  return `http://${resolved}`;
94
119
  }
95
- /**
96
- * 处理 HTTP 请求
97
- * 若消息无 target 且配置了 getTarget,则由客户端根据 Host/path 匹配规则得到目标。
98
- * 目标未写协议时默认 http(本地服务通常为 HTTP)。
99
- */
100
- async handleHttpRequest(message) {
101
- try {
102
- const { requestId, method, url: requestUrl, headers, body, target } = message;
103
- let targetUrlStr;
104
- if (target) {
105
- targetUrlStr = target.startsWith('http') ? target : `http://${target}`;
106
- }
107
- else if (this.getTarget) {
108
- const host = headers?.host ?? '';
109
- const domain = host.split(':')[0];
110
- const pathname = new URL(requestUrl || '/', `http://${host}`).pathname;
111
- const resolved = this.getTarget(domain, pathname);
112
- if (resolved == null) {
113
- this.tunnelWs.send(JSON.stringify({
114
- type: 'HTTP_RESPONSE',
115
- requestId,
116
- statusCode: 404,
117
- statusMessage: 'Not Found',
118
- headers: { 'Content-Type': 'text/plain' },
119
- body: Buffer.from('No matching rule for this request').toString('base64'),
120
- }));
121
- return;
122
- }
123
- targetUrlStr = this.normalizeTargetUrl(resolved);
124
- }
125
- else {
126
- targetUrlStr = this.buildTargetUrl(requestUrl);
120
+ handleHttpRequestStart(requestId, method, requestUrl, headers, target, tunnelWs) {
121
+ let targetUrlStr;
122
+ if (target) {
123
+ targetUrlStr = target.startsWith('http') ? target : `http://${target}`;
124
+ }
125
+ else if (this.getTarget) {
126
+ const host = headers?.host ?? '';
127
+ const domain = host.split(':')[0];
128
+ const pathname = new URL(requestUrl || '/', `http://${host}`).pathname;
129
+ const resolved = this.getTarget(domain, pathname);
130
+ if (resolved == null) {
131
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_RESPONSE_START, requestId, {
132
+ statusCode: 404,
133
+ statusMessage: 'Not Found',
134
+ headers: { 'Content-Type': 'text/plain' },
135
+ }));
136
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_RESPONSE_END, requestId, {}));
137
+ return;
127
138
  }
128
- // 目标仅含 origin,需拼上原始请求路径与查询,再转发
129
- const fullTargetUrl = new URL(requestUrl || '/', targetUrlStr).href;
130
- const bodyBuffer = body ? Buffer.from(body, 'base64') : undefined;
131
- const response = await this.sendHttpRequest(method, fullTargetUrl, headers, bodyBuffer);
132
- const responseMessage = {
133
- type: 'HTTP_RESPONSE',
134
- requestId,
135
- statusCode: response.statusCode,
136
- statusMessage: response.statusMessage || 'OK',
137
- headers: this.normalizeHeaders(response.headers),
138
- body: response.body ? response.body.toString('base64') : undefined,
139
- };
140
- this.tunnelWs.send(JSON.stringify(responseMessage));
139
+ targetUrlStr = this.normalizeTargetUrl(resolved);
140
+ }
141
+ else {
142
+ targetUrlStr = this.buildTargetUrl(requestUrl);
143
+ }
144
+ const fullTargetUrl = new URL(requestUrl || '/', targetUrlStr).href;
145
+ try {
146
+ const req = this.createStreamingHttpRequest(requestId, method, fullTargetUrl, headers, tunnelWs);
147
+ this.pendingStreamRequests.set(requestId, { req, tunnelWs });
141
148
  }
142
149
  catch (error) {
143
- console.error('[HTTP Tunnel Client] Error handling HTTP request:', error);
144
- this.tunnelWs.send(JSON.stringify({
145
- type: 'TUNNEL_ERROR',
146
- requestId: message.requestId,
150
+ console.error('[HTTP Tunnel Client] Error creating HTTP request:', error);
151
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_TUNNEL_ERROR, requestId, {
147
152
  error: error instanceof Error ? error.message : 'Unknown error',
148
153
  code: 'REQUEST_ERROR',
149
154
  }));
150
155
  }
151
156
  }
152
- /**
153
- * 处理 WebSocket 升级请求;若有 getTarget 则按 Host/path 解析目标(与 HTTP 规则一致)
154
- */
155
- async handleWsUpgrade(message) {
156
- try {
157
- const { requestId, url: requestUrl, headers } = message;
158
- const host = headers?.host ?? '';
159
- const domain = host.split(':')[0];
160
- const pathname = new URL(requestUrl || '/', `http://${host}`).pathname;
161
- const search = new URL(requestUrl || '/', `http://${host}`).search;
162
- let targetUrl;
163
- if (this.getTarget) {
164
- const resolved = this.getTarget(domain, pathname);
165
- if (resolved == null) {
166
- console.warn(`[HTTP Tunnel Client] WebSocket 无匹配规则: ${domain}${pathname}`);
157
+ createStreamingHttpRequest(requestId, method, targetUrl, headers, tunnelWs) {
158
+ const urlObj = new URL(targetUrl);
159
+ const isHttps = urlObj.protocol === 'https:';
160
+ const httpModule = isHttps ? https : http;
161
+ const forwardHeaders = { ...headers };
162
+ const forwardedProto = isHttps ? 'https' : 'http';
163
+ forwardHeaders['x-forwarded-proto'] = forwardedProto;
164
+ forwardHeaders['x-forwarded-scheme'] = forwardedProto;
165
+ const options = {
166
+ hostname: urlObj.hostname,
167
+ port: urlObj.port || (isHttps ? 443 : 80),
168
+ path: urlObj.pathname + urlObj.search,
169
+ method,
170
+ headers: forwardHeaders,
171
+ agent: isHttps ? this.httpsAgent : this.httpAgent,
172
+ rejectUnauthorized: false,
173
+ };
174
+ const req = httpModule.request(options, (res) => {
175
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_RESPONSE_START, requestId, {
176
+ statusCode: res.statusCode ?? 200,
177
+ statusMessage: res.statusMessage ?? 'OK',
178
+ headers: this.normalizeHeaders(res.headers),
179
+ }));
180
+ const bodyChunks = [];
181
+ let bodyLength = 0;
182
+ const flushBody = () => {
183
+ if (bodyLength === 0)
167
184
  return;
168
- }
169
- // 目标未写协议时默认 ws(本地服务通常为 HTTP/WS)
170
- const base = this.normalizeTargetUrl(resolved);
171
- const baseUrl = new URL(base);
172
- const wsProtocol = baseUrl.protocol === 'https:' ? 'wss:' : 'ws:';
173
- targetUrl = `${wsProtocol}//${baseUrl.host}${pathname}${search}`;
174
- }
175
- else {
176
- targetUrl = this.buildTargetUrl(requestUrl, 'ws:');
177
- }
178
- // 创建 WebSocket 客户端连接
179
- const wsClient = new WebSocket(targetUrl, { headers });
180
- this.wsClients.set(requestId, wsClient);
181
- // 处理 WebSocket 客户端消息
182
- wsClient.on('message', (data) => {
183
- const message = {
184
- type: 'WS_DATA',
185
- requestId,
186
- data: data.toString('base64'),
187
- isBinary: data instanceof Buffer && !this.isUtf8(data),
188
- };
189
- this.tunnelWs.send(JSON.stringify(message));
185
+ const combined = bodyChunks.length === 1 ? bodyChunks[0] : Buffer.concat(bodyChunks, bodyLength);
186
+ bodyChunks.length = 0;
187
+ bodyLength = 0;
188
+ tunnelWs.send(encodeBinaryDataFrame(FRAME_BODY_RESPONSE, requestId, combined));
189
+ };
190
+ res.on('data', (chunk) => {
191
+ bodyChunks.push(chunk);
192
+ bodyLength += chunk.length;
193
+ if (bodyLength >= RESPONSE_CHUNK_BUFFER_SIZE)
194
+ flushBody();
190
195
  });
191
- // 处理 WebSocket 客户端关闭
192
- wsClient.on('close', (code, reason) => {
193
- const message = {
194
- type: 'WS_CLOSE',
195
- requestId,
196
- code,
197
- reason: reason ? reason.toString() : undefined,
198
- };
199
- this.tunnelWs.send(JSON.stringify(message));
200
- this.wsClients.delete(requestId);
196
+ res.on('end', () => {
197
+ flushBody();
198
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_RESPONSE_END, requestId, {}));
201
199
  });
202
- // 处理 WebSocket 客户端错误
203
- wsClient.on('error', (error) => {
204
- console.error('[HTTP Tunnel Client] WebSocket client error:', error);
205
- const message = {
206
- type: 'WS_CLOSE',
207
- requestId,
208
- code: 1011,
209
- reason: error.message,
210
- };
211
- this.tunnelWs.send(JSON.stringify(message));
212
- this.wsClients.delete(requestId);
200
+ res.on('error', (err) => {
201
+ console.error('[HTTP Tunnel Client] Response stream error:', err);
202
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_TUNNEL_ERROR, requestId, {
203
+ error: err.message,
204
+ code: 'RESPONSE_ERROR',
205
+ }));
213
206
  });
214
- console.log(`[HTTP Tunnel Client] WebSocket connection established: ${targetUrl}`);
215
- }
216
- catch (error) {
217
- console.error('[HTTP Tunnel Client] Error handling WebSocket upgrade:', error);
218
- const errorMessage = {
219
- type: 'TUNNEL_ERROR',
220
- requestId: message.requestId,
221
- error: error instanceof Error ? error.message : 'Unknown error',
222
- code: 'WS_ERROR',
223
- };
224
- this.tunnelWs.send(JSON.stringify(errorMessage));
225
- }
207
+ });
208
+ req.on('error', (error) => {
209
+ this.pendingStreamRequests.delete(requestId);
210
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_TUNNEL_ERROR, requestId, {
211
+ error: error.message,
212
+ code: 'REQUEST_ERROR',
213
+ }));
214
+ });
215
+ return req;
226
216
  }
227
- /**
228
- * 处理 WebSocket 数据消息
229
- */
230
- handleWsData(message) {
231
- const wsClient = this.wsClients.get(message.requestId);
232
- if (wsClient && wsClient.readyState === WebSocket.OPEN) {
233
- const data = message.isBinary ? Buffer.from(message.data, 'base64') : message.data;
234
- wsClient.send(data);
217
+ handleWsUpgrade(requestId, requestUrl, headers, tunnelWs) {
218
+ this.tunnelWsByRequestId.set(requestId, tunnelWs);
219
+ const host = headers?.host ?? '';
220
+ const domain = host.split(':')[0];
221
+ const pathname = new URL(requestUrl || '/', `http://${host}`).pathname;
222
+ const search = new URL(requestUrl || '/', `http://${host}`).search;
223
+ let targetUrl;
224
+ if (this.getTarget) {
225
+ const resolved = this.getTarget(domain, pathname);
226
+ if (resolved == null) {
227
+ console.warn(`[HTTP Tunnel Client] WebSocket 无匹配规则: ${domain}${pathname}`);
228
+ tunnelWs.send(encodeBinaryControlFrame(FRAME_WS_CLOSE, requestId, {
229
+ code: 1008,
230
+ reason: 'No matching rule for this path',
231
+ }));
232
+ this.tunnelWsByRequestId.delete(requestId);
233
+ return;
234
+ }
235
+ const base = this.normalizeTargetUrl(resolved);
236
+ const baseUrl = new URL(base);
237
+ const wsProtocol = baseUrl.protocol === 'https:' ? 'wss:' : 'ws:';
238
+ targetUrl = `${wsProtocol}//${baseUrl.host}${pathname}${search}`;
235
239
  }
236
240
  else {
237
- console.warn('[HTTP Tunnel Client] WebSocket client not found for:', message.requestId);
241
+ targetUrl = this.buildTargetUrl(requestUrl, 'ws:');
238
242
  }
243
+ const targetUrlObj = new URL(targetUrl);
244
+ const wsHeaders = { ...headers, host: targetUrlObj.host };
245
+ const wsClient = new WebSocket(targetUrl, { headers: wsHeaders });
246
+ this.wsClients.set(requestId, wsClient);
247
+ wsClient.on('message', (data) => {
248
+ const tws = this.tunnelWsByRequestId.get(requestId);
249
+ if (tws)
250
+ tws.send(encodeBinaryDataFrame(FRAME_WS_DATA, requestId, data));
251
+ });
252
+ wsClient.on('close', (code, reason) => {
253
+ const tws = this.tunnelWsByRequestId.get(requestId);
254
+ if (tws) {
255
+ tws.send(encodeBinaryControlFrame(FRAME_WS_CLOSE, requestId, {
256
+ code,
257
+ reason: reason ? reason.toString() : undefined,
258
+ }));
259
+ }
260
+ this.wsClients.delete(requestId);
261
+ this.tunnelWsByRequestId.delete(requestId);
262
+ });
263
+ wsClient.on('error', (error) => {
264
+ console.error('[HTTP Tunnel Client] WebSocket client error:', error);
265
+ const tws = this.tunnelWsByRequestId.get(requestId);
266
+ if (tws) {
267
+ tws.send(encodeBinaryControlFrame(FRAME_WS_CLOSE, requestId, {
268
+ code: 1011,
269
+ reason: error.message,
270
+ }));
271
+ }
272
+ this.wsClients.delete(requestId);
273
+ this.tunnelWsByRequestId.delete(requestId);
274
+ });
239
275
  }
240
- /**
241
- * 处理 WebSocket 关闭消息
242
- */
243
- handleWsClose(message) {
244
- const wsClient = this.wsClients.get(message.requestId);
276
+ handleWsData(requestId, payload) {
277
+ const wsClient = this.wsClients.get(requestId);
278
+ if (wsClient && wsClient.readyState === WebSocket.OPEN)
279
+ wsClient.send(payload);
280
+ }
281
+ handleWsClose(requestId, payloadJson) {
282
+ const wsClient = this.wsClients.get(requestId);
245
283
  if (wsClient) {
246
- wsClient.close(message.code, message.reason);
247
- this.wsClients.delete(message.requestId);
284
+ wsClient.close(payloadJson?.code ?? 1000, payloadJson?.reason ?? '');
248
285
  }
286
+ this.wsClients.delete(requestId);
287
+ this.tunnelWsByRequestId.delete(requestId);
249
288
  }
250
- /**
251
- * 发送 HTTP 请求到本地服务
252
- */
253
- sendHttpRequest(method, targetUrl, headers, body) {
254
- return new Promise((resolve, reject) => {
255
- const urlObj = new URL(targetUrl);
256
- const isHttps = urlObj.protocol === 'https:';
257
- const httpModule = isHttps ? https : http;
258
- // 完整报文转发:原样使用所有请求头,仅 (1) 连接目标为规则中的 host (2) 本机连接为 http 时设 X-Forwarded-Proto
259
- const forwardHeaders = { ...headers };
260
- const forwardedProto = isHttps ? 'https' : 'http';
261
- forwardHeaders['x-forwarded-proto'] = forwardedProto;
262
- forwardHeaders['x-forwarded-scheme'] = forwardedProto;
263
- const options = {
264
- hostname: urlObj.hostname,
265
- port: urlObj.port || (isHttps ? 443 : 80),
266
- path: urlObj.pathname + urlObj.search,
267
- method,
268
- headers: forwardHeaders,
269
- agent: isHttps ? this.httpsAgent : this.httpAgent,
270
- rejectUnauthorized: false,
271
- };
272
- const req = httpModule.request(options, (res) => {
273
- const chunks = [];
274
- res.on('data', (chunk) => {
275
- chunks.push(chunk);
276
- });
277
- res.on('end', () => {
278
- resolve({
279
- statusCode: res.statusCode || 200,
280
- statusMessage: res.statusMessage,
281
- headers: res.headers,
282
- body: chunks.length > 0 ? Buffer.concat(chunks) : undefined,
283
- });
284
- });
285
- });
286
- req.on('error', (error) => {
287
- reject(error);
288
- });
289
- if (body) {
290
- req.write(body);
291
- }
292
- req.end();
293
- });
294
- }
295
- /**
296
- * 构建目标 URL
297
- */
298
289
  buildTargetUrl(requestUrl, protocolOverride) {
299
- // 解析请求 URL(可能包含完整 URL 或仅路径)
300
290
  let requestPath = '';
301
291
  let requestSearch = '';
302
- // 检查是否为完整 URL
303
292
  if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {
304
293
  const urlObj = new URL(requestUrl);
305
294
  requestPath = urlObj.pathname;
306
295
  requestSearch = urlObj.search;
307
296
  }
308
297
  else {
309
- // 处理相对路径
310
298
  const queryIndex = requestUrl.indexOf('?');
311
299
  if (queryIndex !== -1) {
312
300
  requestPath = requestUrl.substring(0, queryIndex);
@@ -316,19 +304,14 @@ export class HttpTunnelClient {
316
304
  requestPath = requestUrl;
317
305
  }
318
306
  }
319
- // 使用目标协议和主机
320
307
  const protocol = protocolOverride || this.targetUrl.protocol || 'http:';
321
308
  const hostname = this.targetUrl.hostname || 'localhost';
322
309
  const port = this.targetUrl.port || (protocol === 'https:' ? '443' : '80');
323
- // 构建完整 URL
324
310
  const portStr = (protocol === 'http:' && port === '80') || (protocol === 'https:' && port === '443')
325
311
  ? ''
326
312
  : `:${port}`;
327
313
  return `${protocol}//${hostname}${portStr}${requestPath}${requestSearch}`;
328
314
  }
329
- /**
330
- * 标准化响应头
331
- */
332
315
  normalizeHeaders(headers) {
333
316
  const normalized = {};
334
317
  for (const [key, value] of Object.entries(headers)) {
@@ -338,26 +321,12 @@ export class HttpTunnelClient {
338
321
  }
339
322
  return normalized;
340
323
  }
341
- /**
342
- * 判断 Buffer 是否为 UTF-8 编码
343
- */
344
- isUtf8(buffer) {
345
- try {
346
- buffer.toString('utf8');
347
- return true;
348
- }
349
- catch {
350
- return false;
351
- }
352
- }
353
- /**
354
- * 关闭客户端
355
- */
356
324
  close() {
357
- // 关闭所有 WebSocket 客户端
325
+ this.pendingStreamRequests.forEach((p) => p.req.destroy());
326
+ this.pendingStreamRequests.clear();
358
327
  this.wsClients.forEach((ws) => ws.close());
359
328
  this.wsClients.clear();
360
- // 关闭代理
329
+ this.tunnelWsByRequestId.clear();
361
330
  this.httpAgent.destroy();
362
331
  this.httpsAgent.destroy();
363
332
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-tunnel-client.js","sourceRoot":"","sources":["../../src/core/http-tunnel-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-tunnel-client.js","sourceRoot":"","sources":["../../src/core/http-tunnel-client.ts"],"names":[],"mappings":"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"}