@furystack/rest-service 10.0.27 → 10.1.0
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.
- package/README.md +249 -12
- package/esm/api-manager.d.ts +1 -3
- package/esm/api-manager.d.ts.map +1 -1
- package/esm/api-manager.js +4 -6
- package/esm/api-manager.js.map +1 -1
- package/esm/header-processor.d.ts +39 -0
- package/esm/header-processor.d.ts.map +1 -0
- package/esm/header-processor.js +113 -0
- package/esm/header-processor.js.map +1 -0
- package/esm/header-processor.spec.d.ts +2 -0
- package/esm/header-processor.spec.d.ts.map +1 -0
- package/esm/header-processor.spec.js +420 -0
- package/esm/header-processor.spec.js.map +1 -0
- package/esm/helpers.d.ts +69 -1
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js +70 -1
- package/esm/helpers.js.map +1 -1
- package/esm/helpers.spec.js +21 -5
- package/esm/helpers.spec.js.map +1 -1
- package/esm/http-proxy-handler.d.ts +53 -0
- package/esm/http-proxy-handler.d.ts.map +1 -0
- package/esm/http-proxy-handler.js +179 -0
- package/esm/http-proxy-handler.js.map +1 -0
- package/esm/http-user-context.d.ts +4 -4
- package/esm/http-user-context.d.ts.map +1 -1
- package/esm/http-user-context.js +4 -4
- package/esm/http-user-context.js.map +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/path-processor.d.ts +33 -0
- package/esm/path-processor.d.ts.map +1 -0
- package/esm/path-processor.js +58 -0
- package/esm/path-processor.js.map +1 -0
- package/esm/path-processor.spec.d.ts +2 -0
- package/esm/path-processor.spec.d.ts.map +1 -0
- package/esm/path-processor.spec.js +256 -0
- package/esm/path-processor.spec.js.map +1 -0
- package/esm/proxy-manager.d.ts +52 -0
- package/esm/proxy-manager.d.ts.map +1 -0
- package/esm/proxy-manager.js +84 -0
- package/esm/proxy-manager.js.map +1 -0
- package/esm/proxy-manager.spec.d.ts +2 -0
- package/esm/proxy-manager.spec.d.ts.map +1 -0
- package/esm/proxy-manager.spec.js +1781 -0
- package/esm/proxy-manager.spec.js.map +1 -0
- package/esm/server-manager.d.ts +7 -0
- package/esm/server-manager.d.ts.map +1 -1
- package/esm/server-manager.js +12 -0
- package/esm/server-manager.js.map +1 -1
- package/esm/static-server-manager.d.ts.map +1 -1
- package/esm/static-server-manager.js +5 -7
- package/esm/static-server-manager.js.map +1 -1
- package/esm/websocket-proxy-handler.d.ts +44 -0
- package/esm/websocket-proxy-handler.d.ts.map +1 -0
- package/esm/websocket-proxy-handler.js +157 -0
- package/esm/websocket-proxy-handler.js.map +1 -0
- package/package.json +12 -10
- package/src/api-manager.ts +5 -15
- package/src/header-processor.spec.ts +514 -0
- package/src/header-processor.ts +140 -0
- package/src/helpers.spec.ts +23 -5
- package/src/helpers.ts +72 -1
- package/src/http-proxy-handler.ts +215 -0
- package/src/http-user-context.ts +6 -6
- package/src/index.ts +1 -0
- package/src/path-processor.spec.ts +318 -0
- package/src/path-processor.ts +69 -0
- package/src/proxy-manager.spec.ts +2094 -0
- package/src/proxy-manager.ts +101 -0
- package/src/server-manager.ts +19 -0
- package/src/static-server-manager.ts +5 -7
- package/src/websocket-proxy-handler.ts +204 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { HeaderProcessor } from './header-processor.js';
|
|
3
|
+
describe('HeaderProcessor', () => {
|
|
4
|
+
const processor = new HeaderProcessor();
|
|
5
|
+
describe('filterHeaders', () => {
|
|
6
|
+
it('should filter out hop-by-hop headers', () => {
|
|
7
|
+
const headers = {
|
|
8
|
+
'content-type': 'application/json',
|
|
9
|
+
connection: 'keep-alive',
|
|
10
|
+
'keep-alive': 'timeout=5',
|
|
11
|
+
'x-custom-header': 'custom-value',
|
|
12
|
+
'transfer-encoding': 'chunked',
|
|
13
|
+
};
|
|
14
|
+
const filtered = processor.filterHeaders(headers);
|
|
15
|
+
expect(filtered['content-type']).toBe('application/json');
|
|
16
|
+
expect(filtered['x-custom-header']).toBe('custom-value');
|
|
17
|
+
expect(filtered.connection).toBeUndefined();
|
|
18
|
+
expect(filtered['keep-alive']).toBeUndefined();
|
|
19
|
+
expect(filtered['transfer-encoding']).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
it('should preserve all non-hop-by-hop headers', () => {
|
|
22
|
+
const headers = {
|
|
23
|
+
'content-type': 'text/html',
|
|
24
|
+
'content-length': '1234',
|
|
25
|
+
authorization: 'Bearer token',
|
|
26
|
+
'x-custom-header': 'value',
|
|
27
|
+
};
|
|
28
|
+
const filtered = processor.filterHeaders(headers);
|
|
29
|
+
expect(filtered).toEqual(headers);
|
|
30
|
+
});
|
|
31
|
+
it('should handle empty headers object', () => {
|
|
32
|
+
const filtered = processor.filterHeaders({});
|
|
33
|
+
expect(filtered).toEqual({});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('processCookies', () => {
|
|
37
|
+
it('should parse cookies from request header', () => {
|
|
38
|
+
const req = {
|
|
39
|
+
headers: {
|
|
40
|
+
cookie: 'sessionId=abc123; theme=dark; userId=456',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const cookies = processor.processCookies(req);
|
|
44
|
+
expect(cookies).toEqual(['sessionId=abc123', 'theme=dark', 'userId=456']);
|
|
45
|
+
});
|
|
46
|
+
it('should return empty array when no cookies present', () => {
|
|
47
|
+
const req = {
|
|
48
|
+
headers: {},
|
|
49
|
+
};
|
|
50
|
+
const cookies = processor.processCookies(req);
|
|
51
|
+
expect(cookies).toEqual([]);
|
|
52
|
+
});
|
|
53
|
+
it('should apply cookie transformer when provided', () => {
|
|
54
|
+
const req = {
|
|
55
|
+
headers: {
|
|
56
|
+
cookie: 'oldCookie=value',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const transformer = (cookies) => [...cookies, 'newCookie=newValue'];
|
|
60
|
+
const cookies = processor.processCookies(req, transformer);
|
|
61
|
+
expect(cookies).toEqual(['oldCookie=value', 'newCookie=newValue']);
|
|
62
|
+
});
|
|
63
|
+
it('should trim cookie values', () => {
|
|
64
|
+
const req = {
|
|
65
|
+
headers: {
|
|
66
|
+
cookie: ' cookie1=value1 ; cookie2=value2 ',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
const cookies = processor.processCookies(req);
|
|
70
|
+
expect(cookies).toEqual(['cookie1=value1', 'cookie2=value2']);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('buildForwardedHeaders', () => {
|
|
74
|
+
it('should build X-Forwarded-* headers', () => {
|
|
75
|
+
const req = {
|
|
76
|
+
headers: {
|
|
77
|
+
'user-agent': 'test-agent',
|
|
78
|
+
host: 'source.com',
|
|
79
|
+
},
|
|
80
|
+
socket: {
|
|
81
|
+
remoteAddress: '192.168.1.100',
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
85
|
+
expect(headers.Host).toBe('target.com');
|
|
86
|
+
expect(headers['User-Agent']).toBe('test-agent');
|
|
87
|
+
expect(headers['X-Forwarded-For']).toBe('192.168.1.100');
|
|
88
|
+
expect(headers['X-Forwarded-Host']).toBe('source.com');
|
|
89
|
+
expect(headers['X-Forwarded-Proto']).toBe('http');
|
|
90
|
+
});
|
|
91
|
+
it('should chain X-Forwarded-For headers', () => {
|
|
92
|
+
const req = {
|
|
93
|
+
headers: {
|
|
94
|
+
'x-forwarded-for': '10.0.0.1, 10.0.0.2',
|
|
95
|
+
host: 'source.com',
|
|
96
|
+
},
|
|
97
|
+
socket: {
|
|
98
|
+
remoteAddress: '192.168.1.100',
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
102
|
+
expect(headers['X-Forwarded-For']).toBe('10.0.0.1, 10.0.0.2, 192.168.1.100');
|
|
103
|
+
});
|
|
104
|
+
it('should detect HTTPS from encrypted socket', () => {
|
|
105
|
+
const req = {
|
|
106
|
+
headers: {
|
|
107
|
+
host: 'source.com',
|
|
108
|
+
},
|
|
109
|
+
socket: {
|
|
110
|
+
remoteAddress: '192.168.1.100',
|
|
111
|
+
encrypted: true,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
115
|
+
expect(headers['X-Forwarded-Proto']).toBe('https');
|
|
116
|
+
});
|
|
117
|
+
it('should use existing X-Forwarded-Proto if present', () => {
|
|
118
|
+
const req = {
|
|
119
|
+
headers: {
|
|
120
|
+
'x-forwarded-proto': 'https',
|
|
121
|
+
host: 'source.com',
|
|
122
|
+
},
|
|
123
|
+
socket: {
|
|
124
|
+
remoteAddress: '192.168.1.100',
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
128
|
+
expect(headers['X-Forwarded-Proto']).toBe('https');
|
|
129
|
+
});
|
|
130
|
+
it('should use default User-Agent when not provided', () => {
|
|
131
|
+
const req = {
|
|
132
|
+
headers: {
|
|
133
|
+
host: 'source.com',
|
|
134
|
+
},
|
|
135
|
+
socket: {
|
|
136
|
+
remoteAddress: '192.168.1.100',
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
140
|
+
expect(headers['User-Agent']).toBe('FuryStack-Proxy/1.0');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('convertHeadersToRecord', () => {
|
|
144
|
+
it('should convert string headers', () => {
|
|
145
|
+
const headers = {
|
|
146
|
+
'content-type': 'application/json',
|
|
147
|
+
authorization: 'Bearer token',
|
|
148
|
+
};
|
|
149
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
150
|
+
expect(record).toEqual(headers);
|
|
151
|
+
});
|
|
152
|
+
it('should convert number headers to strings', () => {
|
|
153
|
+
const headers = {
|
|
154
|
+
'content-length': 1234,
|
|
155
|
+
};
|
|
156
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
157
|
+
expect(record['content-length']).toBe('1234');
|
|
158
|
+
});
|
|
159
|
+
it('should join array headers with commas', () => {
|
|
160
|
+
const headers = {
|
|
161
|
+
'x-custom-header': ['value1', 'value2', 'value3'],
|
|
162
|
+
};
|
|
163
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
164
|
+
expect(record['x-custom-header']).toBe('value1, value2, value3');
|
|
165
|
+
});
|
|
166
|
+
it('should skip undefined headers', () => {
|
|
167
|
+
const headers = {
|
|
168
|
+
'defined-header': 'value',
|
|
169
|
+
'undefined-header': undefined,
|
|
170
|
+
};
|
|
171
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
172
|
+
expect(record['defined-header']).toBe('value');
|
|
173
|
+
expect(record['undefined-header']).toBeUndefined();
|
|
174
|
+
});
|
|
175
|
+
it('should exclude cookie header', () => {
|
|
176
|
+
const headers = {
|
|
177
|
+
'content-type': 'application/json',
|
|
178
|
+
cookie: 'sessionId=abc123',
|
|
179
|
+
};
|
|
180
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
181
|
+
expect(record['content-type']).toBe('application/json');
|
|
182
|
+
expect(record.cookie).toBeUndefined();
|
|
183
|
+
});
|
|
184
|
+
it('should exclude hop-by-hop headers', () => {
|
|
185
|
+
const headers = {
|
|
186
|
+
'content-type': 'application/json',
|
|
187
|
+
connection: 'keep-alive',
|
|
188
|
+
'transfer-encoding': 'chunked',
|
|
189
|
+
};
|
|
190
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
191
|
+
expect(record['content-type']).toBe('application/json');
|
|
192
|
+
expect(record.connection).toBeUndefined();
|
|
193
|
+
expect(record['transfer-encoding']).toBeUndefined();
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('processRequestHeaders', () => {
|
|
197
|
+
it('should process all headers and return proxy-ready headers', () => {
|
|
198
|
+
const req = {
|
|
199
|
+
headers: {
|
|
200
|
+
'content-type': 'application/json',
|
|
201
|
+
'user-agent': 'test-agent',
|
|
202
|
+
cookie: 'sessionId=abc123',
|
|
203
|
+
connection: 'keep-alive',
|
|
204
|
+
},
|
|
205
|
+
socket: {
|
|
206
|
+
remoteAddress: '192.168.1.100',
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
const result = processor.processRequestHeaders(req, 'target.com');
|
|
210
|
+
expect(result.proxyHeaders['content-type']).toBe('application/json');
|
|
211
|
+
expect(result.proxyHeaders.Host).toBe('target.com');
|
|
212
|
+
expect(result.proxyHeaders['X-Forwarded-For']).toBe('192.168.1.100');
|
|
213
|
+
expect(result.proxyHeaders.Cookie).toBe('sessionId=abc123');
|
|
214
|
+
expect(result.proxyHeaders.connection).toBeUndefined();
|
|
215
|
+
expect(result.finalCookies).toEqual(['sessionId=abc123']);
|
|
216
|
+
});
|
|
217
|
+
it('should apply header transformer', () => {
|
|
218
|
+
const req = {
|
|
219
|
+
headers: {
|
|
220
|
+
'content-type': 'application/json',
|
|
221
|
+
},
|
|
222
|
+
socket: {
|
|
223
|
+
remoteAddress: '192.168.1.100',
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
const headerTransformer = () => ({
|
|
227
|
+
'x-custom-header': 'custom-value',
|
|
228
|
+
});
|
|
229
|
+
const result = processor.processRequestHeaders(req, 'target.com', {
|
|
230
|
+
headers: headerTransformer,
|
|
231
|
+
});
|
|
232
|
+
expect(result.proxyHeaders['x-custom-header']).toBe('custom-value');
|
|
233
|
+
expect(result.proxyHeaders['content-type']).toBeUndefined();
|
|
234
|
+
});
|
|
235
|
+
it('should apply cookie transformer', () => {
|
|
236
|
+
const req = {
|
|
237
|
+
headers: {
|
|
238
|
+
cookie: 'oldCookie=value',
|
|
239
|
+
},
|
|
240
|
+
socket: {
|
|
241
|
+
remoteAddress: '192.168.1.100',
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
const cookieTransformer = (cookies) => [...cookies, 'newCookie=newValue'];
|
|
245
|
+
const result = processor.processRequestHeaders(req, 'target.com', {
|
|
246
|
+
cookies: cookieTransformer,
|
|
247
|
+
});
|
|
248
|
+
expect(result.proxyHeaders.Cookie).toBe('oldCookie=value; newCookie=newValue');
|
|
249
|
+
expect(result.finalCookies).toEqual(['oldCookie=value', 'newCookie=newValue']);
|
|
250
|
+
});
|
|
251
|
+
it('should not include Cookie header when no cookies present', () => {
|
|
252
|
+
const req = {
|
|
253
|
+
headers: {},
|
|
254
|
+
socket: {
|
|
255
|
+
remoteAddress: '192.168.1.100',
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
const result = processor.processRequestHeaders(req, 'target.com');
|
|
259
|
+
expect(result.proxyHeaders.Cookie).toBeUndefined();
|
|
260
|
+
expect(result.finalCookies).toEqual([]);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
describe('isHopByHopHeader', () => {
|
|
264
|
+
it('should identify hop-by-hop headers', () => {
|
|
265
|
+
expect(processor.isHopByHopHeader('connection')).toBe(true);
|
|
266
|
+
expect(processor.isHopByHopHeader('Connection')).toBe(true);
|
|
267
|
+
expect(processor.isHopByHopHeader('keep-alive')).toBe(true);
|
|
268
|
+
expect(processor.isHopByHopHeader('transfer-encoding')).toBe(true);
|
|
269
|
+
expect(processor.isHopByHopHeader('upgrade')).toBe(true);
|
|
270
|
+
});
|
|
271
|
+
it('should not identify regular headers as hop-by-hop', () => {
|
|
272
|
+
expect(processor.isHopByHopHeader('content-type')).toBe(false);
|
|
273
|
+
expect(processor.isHopByHopHeader('authorization')).toBe(false);
|
|
274
|
+
expect(processor.isHopByHopHeader('x-custom-header')).toBe(false);
|
|
275
|
+
});
|
|
276
|
+
it('should identify all standard hop-by-hop headers', () => {
|
|
277
|
+
expect(processor.isHopByHopHeader('proxy-authenticate')).toBe(true);
|
|
278
|
+
expect(processor.isHopByHopHeader('proxy-authorization')).toBe(true);
|
|
279
|
+
expect(processor.isHopByHopHeader('te')).toBe(true);
|
|
280
|
+
expect(processor.isHopByHopHeader('trailer')).toBe(true);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
describe('Edge cases and complex scenarios', () => {
|
|
284
|
+
it('should handle empty cookie strings correctly', () => {
|
|
285
|
+
const req = {
|
|
286
|
+
headers: {
|
|
287
|
+
cookie: '',
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
const cookies = processor.processCookies(req);
|
|
291
|
+
expect(cookies).toEqual(['']);
|
|
292
|
+
});
|
|
293
|
+
it('should handle multiple semicolons in cookie string', () => {
|
|
294
|
+
const req = {
|
|
295
|
+
headers: {
|
|
296
|
+
cookie: 'cookie1=value1;;cookie2=value2',
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
const cookies = processor.processCookies(req);
|
|
300
|
+
expect(cookies).toEqual(['cookie1=value1', '', 'cookie2=value2']);
|
|
301
|
+
});
|
|
302
|
+
it('should handle cookies with special characters', () => {
|
|
303
|
+
const req = {
|
|
304
|
+
headers: {
|
|
305
|
+
cookie: 'session=abc%3D123; token=Bearer%20xyz',
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
const cookies = processor.processCookies(req);
|
|
309
|
+
expect(cookies).toEqual(['session=abc%3D123', 'token=Bearer%20xyz']);
|
|
310
|
+
});
|
|
311
|
+
it('should handle missing remote address gracefully', () => {
|
|
312
|
+
const req = {
|
|
313
|
+
headers: {
|
|
314
|
+
host: 'source.com',
|
|
315
|
+
},
|
|
316
|
+
socket: {},
|
|
317
|
+
};
|
|
318
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
319
|
+
expect(headers['X-Forwarded-For']).toBe('');
|
|
320
|
+
});
|
|
321
|
+
it('should handle very long X-Forwarded-For chains', () => {
|
|
322
|
+
const longChain = Array.from({ length: 20 }, (_, i) => `10.0.0.${i + 1}`).join(', ');
|
|
323
|
+
const req = {
|
|
324
|
+
headers: {
|
|
325
|
+
'x-forwarded-for': longChain,
|
|
326
|
+
host: 'source.com',
|
|
327
|
+
},
|
|
328
|
+
socket: {
|
|
329
|
+
remoteAddress: '192.168.1.100',
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
333
|
+
expect(headers['X-Forwarded-For']).toContain(longChain);
|
|
334
|
+
expect(headers['X-Forwarded-For']).toContain('192.168.1.100');
|
|
335
|
+
});
|
|
336
|
+
it('should handle mixed case header names', () => {
|
|
337
|
+
const headers = {
|
|
338
|
+
'Content-Type': 'application/json',
|
|
339
|
+
'X-Custom-Header': 'value',
|
|
340
|
+
CONNECTION: 'keep-alive',
|
|
341
|
+
};
|
|
342
|
+
const filtered = processor.filterHeaders(headers);
|
|
343
|
+
expect(filtered['Content-Type']).toBe('application/json');
|
|
344
|
+
expect(filtered['X-Custom-Header']).toBe('value');
|
|
345
|
+
expect(filtered.CONNECTION).toBeUndefined();
|
|
346
|
+
});
|
|
347
|
+
it('should handle empty array headers', () => {
|
|
348
|
+
const headers = {
|
|
349
|
+
'X-Empty-Array': [],
|
|
350
|
+
};
|
|
351
|
+
const record = processor.convertHeadersToRecord(headers);
|
|
352
|
+
expect(record['X-Empty-Array']).toBe('');
|
|
353
|
+
});
|
|
354
|
+
it('should preserve header order when processing', () => {
|
|
355
|
+
const req = {
|
|
356
|
+
headers: {
|
|
357
|
+
'first-header': 'first',
|
|
358
|
+
'second-header': 'second',
|
|
359
|
+
'third-header': 'third',
|
|
360
|
+
},
|
|
361
|
+
socket: {
|
|
362
|
+
remoteAddress: '192.168.1.100',
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
const result = processor.processRequestHeaders(req, 'target.com');
|
|
366
|
+
expect(result.proxyHeaders['first-header']).toBe('first');
|
|
367
|
+
expect(result.proxyHeaders['second-header']).toBe('second');
|
|
368
|
+
expect(result.proxyHeaders['third-header']).toBe('third');
|
|
369
|
+
});
|
|
370
|
+
it('should handle X-Forwarded-For with whitespace variations', () => {
|
|
371
|
+
const req = {
|
|
372
|
+
headers: {
|
|
373
|
+
'x-forwarded-for': '10.0.0.1 , 10.0.0.2, 10.0.0.3',
|
|
374
|
+
host: 'source.com',
|
|
375
|
+
},
|
|
376
|
+
socket: {
|
|
377
|
+
remoteAddress: '192.168.1.100',
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
const headers = processor.buildForwardedHeaders(req, 'target.com');
|
|
381
|
+
expect(headers['X-Forwarded-For']).toBe('10.0.0.1, 10.0.0.2, 10.0.0.3, 192.168.1.100');
|
|
382
|
+
});
|
|
383
|
+
it('should handle cookie transformer returning empty array', () => {
|
|
384
|
+
const req = {
|
|
385
|
+
headers: {
|
|
386
|
+
cookie: 'session=abc123',
|
|
387
|
+
},
|
|
388
|
+
socket: {
|
|
389
|
+
remoteAddress: '192.168.1.100',
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
const result = processor.processRequestHeaders(req, 'target.com', {
|
|
393
|
+
cookies: () => [],
|
|
394
|
+
});
|
|
395
|
+
expect(result.proxyHeaders.Cookie).toBeUndefined();
|
|
396
|
+
expect(result.finalCookies).toEqual([]);
|
|
397
|
+
});
|
|
398
|
+
it('should handle header transformer removing all headers', () => {
|
|
399
|
+
const req = {
|
|
400
|
+
headers: {
|
|
401
|
+
'content-type': 'application/json',
|
|
402
|
+
authorization: 'Bearer token',
|
|
403
|
+
},
|
|
404
|
+
socket: {
|
|
405
|
+
remoteAddress: '192.168.1.100',
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
const result = processor.processRequestHeaders(req, 'target.com', {
|
|
409
|
+
headers: () => ({}),
|
|
410
|
+
});
|
|
411
|
+
// Should still have forwarded headers
|
|
412
|
+
expect(result.proxyHeaders.Host).toBe('target.com');
|
|
413
|
+
expect(result.proxyHeaders['X-Forwarded-For']).toBeTruthy();
|
|
414
|
+
// But not the original headers
|
|
415
|
+
expect(result.proxyHeaders['content-type']).toBeUndefined();
|
|
416
|
+
expect(result.proxyHeaders.authorization).toBeUndefined();
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
//# sourceMappingURL=header-processor.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-processor.spec.js","sourceRoot":"","sources":["../src/header-processor.spec.ts"],"names":[],"mappings":"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"}
|
package/esm/helpers.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { User } from '@furystack/core';
|
|
2
2
|
import type { Injector } from '@furystack/inject';
|
|
3
|
-
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
4
3
|
import type { RestApi } from '@furystack/rest';
|
|
5
4
|
import type { ImplementApiOptions } from './api-manager.js';
|
|
5
|
+
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
6
6
|
import type { DefaultSession } from './models/default-session.js';
|
|
7
|
+
import type { ProxyOptions } from './proxy-manager.js';
|
|
7
8
|
import type { StaticServerOptions } from './static-server-manager.js';
|
|
8
9
|
/**
|
|
9
10
|
* Sets up the @furystack/rest-service with the provided settings
|
|
@@ -31,4 +32,71 @@ export declare const useHttpAuthentication: <TUser extends User, TSession extend
|
|
|
31
32
|
export declare const useStaticFiles: (options: {
|
|
32
33
|
injector: Injector;
|
|
33
34
|
} & StaticServerOptions) => Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Sets up a proxy server that forwards HTTP requests from a source URL to a target URL.
|
|
37
|
+
*
|
|
38
|
+
* The proxy acts as an intermediary, forwarding requests and responses while allowing
|
|
39
|
+
* transformation of headers, cookies, and paths. It returns 502 Bad Gateway on errors
|
|
40
|
+
* and emits 'onProxyFailed' events for monitoring.
|
|
41
|
+
*
|
|
42
|
+
* WebSocket connections can also be proxied by setting `enableWebsockets: true`, allowing
|
|
43
|
+
* bidirectional real-time communication through the proxy.
|
|
44
|
+
*
|
|
45
|
+
* @param options The settings for the proxy server
|
|
46
|
+
* @param options.injector The Injector instance
|
|
47
|
+
* @param options.sourceBaseUrl The base URL path to match for proxying (e.g., '/api', '/old').
|
|
48
|
+
* Can be specified with or without a trailing slash.
|
|
49
|
+
* @param options.targetBaseUrl The target server URL (must be a valid HTTP/HTTPS URL)
|
|
50
|
+
* @param options.pathRewrite Optional function to rewrite the path before forwarding.
|
|
51
|
+
* Receives the path after sourceBaseUrl, including leading slash and query string.
|
|
52
|
+
* Example: for 'GET /api/users?active=true' with sourceBaseUrl='/api',
|
|
53
|
+
* pathRewrite receives '/users?active=true'
|
|
54
|
+
* @param options.sourceHostName The hostname for the source server (optional, defaults to all interfaces)
|
|
55
|
+
* @param options.sourcePort The port for the source server
|
|
56
|
+
* @param options.headers Optional function to transform request headers.
|
|
57
|
+
* **Note**: Receives headers AFTER filtering hop-by-hop headers
|
|
58
|
+
* (Connection, Keep-Alive, Transfer-Encoding, Upgrade, etc.) for security
|
|
59
|
+
* and protocol compliance. The proxy automatically adds X-Forwarded-* headers.
|
|
60
|
+
* This transformation applies to both HTTP and WebSocket requests.
|
|
61
|
+
* @param options.cookies Optional function to transform request cookies (array of cookie strings)
|
|
62
|
+
* @param options.responseCookies Optional function to transform response Set-Cookie headers
|
|
63
|
+
* @param options.timeout Optional timeout in milliseconds for proxy requests (default: 30000).
|
|
64
|
+
* If exceeded, the request is aborted and 502 is returned.
|
|
65
|
+
* Applies to both HTTP and WebSocket upgrade requests.
|
|
66
|
+
* @param options.enableWebsockets Optional flag to enable WebSocket proxying (default: false).
|
|
67
|
+
* When enabled, WebSocket upgrade requests will be forwarded to the target.
|
|
68
|
+
* @returns a promise that resolves when the proxy is set up
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* // Basic HTTP proxy with timeout
|
|
72
|
+
* await useProxy({
|
|
73
|
+
* injector,
|
|
74
|
+
* sourceBaseUrl: '/api',
|
|
75
|
+
* targetBaseUrl: 'https://api.example.com',
|
|
76
|
+
* sourcePort: 3000,
|
|
77
|
+
* timeout: 5000,
|
|
78
|
+
* })
|
|
79
|
+
*
|
|
80
|
+
* // Proxy with WebSocket support
|
|
81
|
+
* await useProxy({
|
|
82
|
+
* injector,
|
|
83
|
+
* sourceBaseUrl: '/ws',
|
|
84
|
+
* targetBaseUrl: 'https://ws.example.com',
|
|
85
|
+
* sourcePort: 3000,
|
|
86
|
+
* enableWebsockets: true,
|
|
87
|
+
* })
|
|
88
|
+
*
|
|
89
|
+
* // Proxy with error monitoring (HTTP and WebSocket)
|
|
90
|
+
* const proxyManager = injector.getInstance(ProxyManager)
|
|
91
|
+
* proxyManager.subscribe('onProxyFailed', ({ from, to, error }) => {
|
|
92
|
+
* console.error(`HTTP Proxy failed: ${from} -> ${to}`, error)
|
|
93
|
+
* })
|
|
94
|
+
* proxyManager.subscribe('onWebSocketProxyFailed', ({ from, to, error }) => {
|
|
95
|
+
* console.error(`WebSocket Proxy failed: ${from} -> ${to}`, error)
|
|
96
|
+
* })
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export declare const useProxy: (options: {
|
|
100
|
+
injector: Injector;
|
|
101
|
+
} & ProxyOptions) => Promise<void>;
|
|
34
102
|
//# sourceMappingURL=helpers.d.ts.map
|
package/esm/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAGrE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAU,CAAC,SAAS,OAAO,EAAE,KAAK,mBAAmB,CAAC,CAAC,CAAC;;;EACpB,CAAA;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,KAAK,SAAS,IAAI,EAAE,QAAQ,SAAS,cAAc,EACvF,UAAU,QAAQ,EAClB,WAAW,OAAO,CAAC,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,SACuD,CAAA;AAExH;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,mBAAmB,kBAGnF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,eAAO,MAAM,QAAQ,GAAI,SAAS;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,YAAY,kBAGtE,CAAA"}
|
package/esm/helpers.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
2
1
|
import { ApiManager } from './api-manager.js';
|
|
2
|
+
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
3
|
+
import { ProxyManager } from './proxy-manager.js';
|
|
3
4
|
import { StaticServerManager } from './static-server-manager.js';
|
|
4
5
|
/**
|
|
5
6
|
* Sets up the @furystack/rest-service with the provided settings
|
|
@@ -25,4 +26,72 @@ export const useStaticFiles = (options) => {
|
|
|
25
26
|
const { injector, ...settings } = options;
|
|
26
27
|
return injector.getInstance(StaticServerManager).addStaticSite(settings);
|
|
27
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Sets up a proxy server that forwards HTTP requests from a source URL to a target URL.
|
|
31
|
+
*
|
|
32
|
+
* The proxy acts as an intermediary, forwarding requests and responses while allowing
|
|
33
|
+
* transformation of headers, cookies, and paths. It returns 502 Bad Gateway on errors
|
|
34
|
+
* and emits 'onProxyFailed' events for monitoring.
|
|
35
|
+
*
|
|
36
|
+
* WebSocket connections can also be proxied by setting `enableWebsockets: true`, allowing
|
|
37
|
+
* bidirectional real-time communication through the proxy.
|
|
38
|
+
*
|
|
39
|
+
* @param options The settings for the proxy server
|
|
40
|
+
* @param options.injector The Injector instance
|
|
41
|
+
* @param options.sourceBaseUrl The base URL path to match for proxying (e.g., '/api', '/old').
|
|
42
|
+
* Can be specified with or without a trailing slash.
|
|
43
|
+
* @param options.targetBaseUrl The target server URL (must be a valid HTTP/HTTPS URL)
|
|
44
|
+
* @param options.pathRewrite Optional function to rewrite the path before forwarding.
|
|
45
|
+
* Receives the path after sourceBaseUrl, including leading slash and query string.
|
|
46
|
+
* Example: for 'GET /api/users?active=true' with sourceBaseUrl='/api',
|
|
47
|
+
* pathRewrite receives '/users?active=true'
|
|
48
|
+
* @param options.sourceHostName The hostname for the source server (optional, defaults to all interfaces)
|
|
49
|
+
* @param options.sourcePort The port for the source server
|
|
50
|
+
* @param options.headers Optional function to transform request headers.
|
|
51
|
+
* **Note**: Receives headers AFTER filtering hop-by-hop headers
|
|
52
|
+
* (Connection, Keep-Alive, Transfer-Encoding, Upgrade, etc.) for security
|
|
53
|
+
* and protocol compliance. The proxy automatically adds X-Forwarded-* headers.
|
|
54
|
+
* This transformation applies to both HTTP and WebSocket requests.
|
|
55
|
+
* @param options.cookies Optional function to transform request cookies (array of cookie strings)
|
|
56
|
+
* @param options.responseCookies Optional function to transform response Set-Cookie headers
|
|
57
|
+
* @param options.timeout Optional timeout in milliseconds for proxy requests (default: 30000).
|
|
58
|
+
* If exceeded, the request is aborted and 502 is returned.
|
|
59
|
+
* Applies to both HTTP and WebSocket upgrade requests.
|
|
60
|
+
* @param options.enableWebsockets Optional flag to enable WebSocket proxying (default: false).
|
|
61
|
+
* When enabled, WebSocket upgrade requests will be forwarded to the target.
|
|
62
|
+
* @returns a promise that resolves when the proxy is set up
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* // Basic HTTP proxy with timeout
|
|
66
|
+
* await useProxy({
|
|
67
|
+
* injector,
|
|
68
|
+
* sourceBaseUrl: '/api',
|
|
69
|
+
* targetBaseUrl: 'https://api.example.com',
|
|
70
|
+
* sourcePort: 3000,
|
|
71
|
+
* timeout: 5000,
|
|
72
|
+
* })
|
|
73
|
+
*
|
|
74
|
+
* // Proxy with WebSocket support
|
|
75
|
+
* await useProxy({
|
|
76
|
+
* injector,
|
|
77
|
+
* sourceBaseUrl: '/ws',
|
|
78
|
+
* targetBaseUrl: 'https://ws.example.com',
|
|
79
|
+
* sourcePort: 3000,
|
|
80
|
+
* enableWebsockets: true,
|
|
81
|
+
* })
|
|
82
|
+
*
|
|
83
|
+
* // Proxy with error monitoring (HTTP and WebSocket)
|
|
84
|
+
* const proxyManager = injector.getInstance(ProxyManager)
|
|
85
|
+
* proxyManager.subscribe('onProxyFailed', ({ from, to, error }) => {
|
|
86
|
+
* console.error(`HTTP Proxy failed: ${from} -> ${to}`, error)
|
|
87
|
+
* })
|
|
88
|
+
* proxyManager.subscribe('onWebSocketProxyFailed', ({ from, to, error }) => {
|
|
89
|
+
* console.error(`WebSocket Proxy failed: ${from} -> ${to}`, error)
|
|
90
|
+
* })
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export const useProxy = (options) => {
|
|
94
|
+
const { injector, ...settings } = options;
|
|
95
|
+
return injector.getInstance(ProxyManager).addProxy(settings);
|
|
96
|
+
};
|
|
28
97
|
//# sourceMappingURL=helpers.js.map
|
package/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAG9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAqB,GAA2B,EAAE,EAAE,CACrF,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;AAE/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAkB,EAClB,QAA+D,EAC/D,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,0BAA0B,EAAE,EAAE,QAAQ,CAAC,EAAE,0BAA0B,CAAC,CAAA;AAExH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAqD,EAAE,EAAE;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAA;IACzC,OAAO,QAAQ,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;AAC1E,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAA8C,EAAE,EAAE;IACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAA;IACzC,OAAO,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC,CAAA"}
|