96 lines
2.6 KiB
TypeScript
96 lines
2.6 KiB
TypeScript
|
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||
|
import { SmartProxy } from '../ts/index.js';
|
||
|
import * as net from 'net';
|
||
|
|
||
|
tap.test('should forward HTTP connections on port 8080 to HttpProxy', async (tapTest) => {
|
||
|
// Create a simple echo server to act as our target
|
||
|
const targetPort = 8181;
|
||
|
let receivedData = '';
|
||
|
|
||
|
const targetServer = net.createServer((socket) => {
|
||
|
console.log('Target server received connection');
|
||
|
|
||
|
socket.on('data', (data) => {
|
||
|
receivedData += data.toString();
|
||
|
console.log('Target server received data:', data.toString().split('\n')[0]);
|
||
|
|
||
|
// Send a simple HTTP response
|
||
|
const response = 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\nHello, World!';
|
||
|
socket.write(response);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
await new Promise<void>((resolve) => {
|
||
|
targetServer.listen(targetPort, () => {
|
||
|
console.log(`Target server listening on port ${targetPort}`);
|
||
|
resolve();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// Create SmartProxy with port 8080 configured for HttpProxy
|
||
|
const proxy = new SmartProxy({
|
||
|
useHttpProxy: [8080], // Enable HttpProxy for port 8080
|
||
|
httpProxyPort: 8844,
|
||
|
enableDetailedLogging: true,
|
||
|
routes: [{
|
||
|
name: 'test-route',
|
||
|
match: {
|
||
|
ports: 8080
|
||
|
},
|
||
|
action: {
|
||
|
type: 'forward',
|
||
|
target: { host: 'localhost', port: targetPort }
|
||
|
}
|
||
|
}]
|
||
|
});
|
||
|
|
||
|
await proxy.start();
|
||
|
|
||
|
// Give the proxy a moment to fully initialize
|
||
|
await new Promise(resolve => setTimeout(resolve, 500));
|
||
|
|
||
|
console.log('Making test connection to proxy on port 8080...');
|
||
|
|
||
|
// Create a simple TCP connection to test
|
||
|
const client = new net.Socket();
|
||
|
const responsePromise = new Promise<string>((resolve, reject) => {
|
||
|
let response = '';
|
||
|
|
||
|
client.on('data', (data) => {
|
||
|
response += data.toString();
|
||
|
console.log('Client received:', data.toString());
|
||
|
});
|
||
|
|
||
|
client.on('end', () => {
|
||
|
resolve(response);
|
||
|
});
|
||
|
|
||
|
client.on('error', reject);
|
||
|
});
|
||
|
|
||
|
await new Promise<void>((resolve, reject) => {
|
||
|
client.connect(8080, 'localhost', () => {
|
||
|
console.log('Client connected to proxy');
|
||
|
// Send a simple HTTP request
|
||
|
client.write('GET / HTTP/1.1\r\nHost: test.local\r\n\r\n');
|
||
|
resolve();
|
||
|
});
|
||
|
|
||
|
client.on('error', reject);
|
||
|
});
|
||
|
|
||
|
// Wait for response
|
||
|
const response = await responsePromise;
|
||
|
|
||
|
// Check that we got the response
|
||
|
expect(response).toContain('Hello, World!');
|
||
|
expect(receivedData).toContain('GET / HTTP/1.1');
|
||
|
|
||
|
client.destroy();
|
||
|
await proxy.stop();
|
||
|
await new Promise<void>((resolve) => {
|
||
|
targetServer.close(() => resolve());
|
||
|
});
|
||
|
});
|
||
|
|
||
|
tap.start();
|