fix(core): Refactor certificate handling across the project
This commit is contained in:
		
							
								
								
									
										19
									
								
								assets/certs/cert.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								assets/certs/cert.pem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIDCzCCAfOgAwIBAgIUPU4tviz3ZvsMDjCz1NZRT16b0Y4wDQYJKoZIhvcNAQEL | ||||
| BQAwFTETMBEGA1UEAwwKcHVzaC5yb2NrczAeFw0yNTAyMDMyMzA5MzRaFw0yNjAy | ||||
| MDMyMzA5MzRaMBUxEzARBgNVBAMMCnB1c2gucm9ja3MwggEiMA0GCSqGSIb3DQEB | ||||
| AQUAA4IBDwAwggEKAoIBAQCZMkBYD/pYLBv9MiyHTLRT24kQyPeJBtZqryibi1jk | ||||
| BT1ZgNl3yo5U6kjj/nYBU/oy7M4OFC0xyaJQ4wpvLHu7xzREqwT9N9WcDcxaahUi | ||||
| P8+PsjGyznPrtXa1ASzGAYMNvXyWWp3351UWZHMEs6eY/Y7i8m4+0NwP5h8RNBCF | ||||
| KSFS41Ee9rNAMCnQSHZv1vIzKeVYPmYnCVmL7X2kQb+gS6Rvq5sEGLLKMC5QtTwI | ||||
| rdkPGpx4xZirIyf8KANbt0sShwUDpiCSuOCtpze08jMzoHLG9Nv97cJQjb/BhiES | ||||
| hLL+YjfAUFjq0rQ38zFKLJ87QB9Jym05mY6IadGQLXVXAgMBAAGjUzBRMB0GA1Ud | ||||
| DgQWBBQjpowWjrql/Eo2EVjl29xcjuCgkTAfBgNVHSMEGDAWgBQjpowWjrql/Eo2 | ||||
| EVjl29xcjuCgkTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAY | ||||
| 44vqbaf6ewFrZC0f3Kk4A10lC6qjWkcDFfw+JE8nzt+4+xPqp1eWgZKF2rONyAv2 | ||||
| nG41Xygt19ByancXLU44KB24LX8F1GV5Oo7CGBA+xtoSPc0JulXw9fGclZDC6XiR | ||||
| P/+vhGgCHicbfP2O+N00pOifrTtf2tmOT4iPXRRo4TxmPzuCd+ZJTlBhPlKCmICq | ||||
| yGdAiEo6HsSiP+M5qVlNx8s57MhQYk5TpgmI6FU4mO7zfDfSatFonlg+aDbrnaqJ | ||||
| v/+km02M+oB460GmKwsSTnThHZgLNCLiKqD8bdziiCQjx5u0GjLI6468o+Aehb8l | ||||
| l/x9vWTTk/QKq41X5hFk | ||||
| -----END CERTIFICATE----- | ||||
							
								
								
									
										28
									
								
								assets/certs/key.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								assets/certs/key.pem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| -----BEGIN PRIVATE KEY----- | ||||
| MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCZMkBYD/pYLBv9 | ||||
| MiyHTLRT24kQyPeJBtZqryibi1jkBT1ZgNl3yo5U6kjj/nYBU/oy7M4OFC0xyaJQ | ||||
| 4wpvLHu7xzREqwT9N9WcDcxaahUiP8+PsjGyznPrtXa1ASzGAYMNvXyWWp3351UW | ||||
| ZHMEs6eY/Y7i8m4+0NwP5h8RNBCFKSFS41Ee9rNAMCnQSHZv1vIzKeVYPmYnCVmL | ||||
| 7X2kQb+gS6Rvq5sEGLLKMC5QtTwIrdkPGpx4xZirIyf8KANbt0sShwUDpiCSuOCt | ||||
| pze08jMzoHLG9Nv97cJQjb/BhiEShLL+YjfAUFjq0rQ38zFKLJ87QB9Jym05mY6I | ||||
| adGQLXVXAgMBAAECggEARGCBBq1PBHbfoUH5TQSIAlvdEEBa9+602lZG7jIioVfT | ||||
| W7Uem5Ctuan+kcDcY9hbNsqqZ+9KgsvoJmlIGXoF2jjeE/4vUmRO9AHWoc5yk2Be | ||||
| 4NjcxN3QMLdEfiLBnLlFCOd4CdX1ZxZ6TG3WRpV3a1pVIeeqHGB1sKT6Xd/atcwG | ||||
| RvpiXzu0SutGxVb6WE9r6hovZ4fVERCyCRczUGrUH5ICbxf6E7L4u8xjEYR4uEKK | ||||
| /8ZkDqrWdRASDAdPPMNqnHUEAho/WnxpNeb6B4lvvv2QWxIS9H1OikF/NzWPgVNS | ||||
| oPpvtJgjyo5xdgLm3zE4lcSPNVSrh1TBXuAn9TG4WQKBgQDScPFkUNBqjC5iPMof | ||||
| bqDHlhlptrHmiv9LC0lgjEDPgIEQfjLfdCugwDk32QyAcb5B60upDYeqCFDkfV/C | ||||
| T536qxevYPjPAjahLPHqMxkWpjvtY6NOTgbbcpVtblU2Fj8R8qbyPNADG31LicU9 | ||||
| GVPtQ4YcVaMWCYbg5107+9dFWQKBgQC6XK+foKK+81RFdrqaNNgebTWTsANnBcZe | ||||
| xl0bj6oL5yY0IzroxHvgcNS7UMriWCu+K2xfkUBdMmxU773VN5JQ5k15ezjgtrvc | ||||
| 8oAaEsxYP4su12JSTC/zsBANUgrNbFj8++qqKYWt2aQc2O/kbZ4MNfekIVFc8AjM | ||||
| 2X9PxvxKLwKBgHXL7QO3TQLnVyt8VbQEjBFMzwriznB7i+4o8jkOKVU93IEr8zQr | ||||
| 5iQElcLSR3I6uUJTALYvsaoXH5jXKVwujwL69LYiNQRDe+r6qqvrUHbiNJdsd8Rk | ||||
| XuhGGqj34tD04Pcd+h+MtO+YWqmHBBZwcA9XBeIkebbjPFH2kLT8AwN5AoGAYQy9 | ||||
| hMJxnkE3hIkk+gNE/OtgeE20J+Vw/ZANkrnJEzPHyGUEW41e+W2oyvdzAFZsSTdx | ||||
| 037f5ujIU58Z27x53NliRT4vS4693H0Iyws5EUfeIoGVuUflvODWKymraHjhCrXh | ||||
| 6cV/0R5DAabTnsCbCr7b/MRBC8YQvyUQ0KnOXo8CgYBQYGpvJnSWyvsCjtb6apTP | ||||
| drjcBhVd0aSBpLGtDdtUCV4oLl9HPy+cLzcGaqckBqCwEq5DKruhMEf7on56bUMd | ||||
| m/3ItFk1TnhysAeJHb3zLqmJ9CKBitpqLlsOE7MEXVNmbTYeXU10Uo9yOfyt1i7T | ||||
| su+nT5VtyPkmF/l4wZl5+g== | ||||
| -----END PRIVATE KEY----- | ||||
| @@ -1,5 +1,13 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## 2025-02-04 - 3.1.2 - fix(core) | ||||
| Refactor certificate handling across the project | ||||
|  | ||||
| - Moved certificate keys and certs to the assets/certs directory. | ||||
| - Updated test utilities to load certificates from the central location. | ||||
| - Cleaned up redundant code and improved error logging regarding certificates. | ||||
| - Ensured correct handling of host header in ProxyRouter class. | ||||
|  | ||||
| ## 2025-02-03 - 3.1.1 - fix(workflow) | ||||
| Update Gitea workflow paths and dependencies | ||||
|  | ||||
|   | ||||
| @@ -1,27 +0,0 @@ | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE | ||||
| RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF | ||||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t | ||||
| pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN | ||||
| QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW | ||||
| asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6 | ||||
| rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE | ||||
| TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8 | ||||
| X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV | ||||
| BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn | ||||
| no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7 | ||||
| muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc | ||||
| gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo | ||||
| hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C | ||||
| mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt | ||||
| KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A | ||||
| qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj | ||||
| t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9 | ||||
| LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX | ||||
| xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde | ||||
| h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE | ||||
| Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V | ||||
| TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr | ||||
| r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS | ||||
| JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= | ||||
| -----END CERTIFICATE----- | ||||
| @@ -1,83 +1,37 @@ | ||||
| export const testCertificates = { | ||||
|   privateKey: `-----BEGIN PRIVATE KEY----- | ||||
| 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 | ||||
| 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA== | ||||
| -----END PRIVATE KEY----- | ||||
|     `, | ||||
|   publicKey: `-----BEGIN CERTIFICATE----- | ||||
| MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE | ||||
| RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF | ||||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t | ||||
| pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN | ||||
| QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW | ||||
| asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6 | ||||
| rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE | ||||
| TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8 | ||||
| X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV | ||||
| BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn | ||||
| no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7 | ||||
| muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc | ||||
| gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo | ||||
| hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C | ||||
| mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt | ||||
| KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A | ||||
| qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj | ||||
| t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9 | ||||
| LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX | ||||
| xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde | ||||
| h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE | ||||
| Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V | ||||
| TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr | ||||
| r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS | ||||
| JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= | ||||
| -----END CERTIFICATE----- | ||||
|     `, | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import { fileURLToPath } from 'url'; | ||||
| import * as tls from 'tls'; | ||||
|  | ||||
| const __filename = fileURLToPath(import.meta.url); | ||||
| const __dirname = path.dirname(__filename); | ||||
|  | ||||
| export interface TestCertificates { | ||||
|   privateKey: string; | ||||
|   publicKey: string; | ||||
| } | ||||
|  | ||||
| export function loadTestCertificates(): TestCertificates { | ||||
|   const certPath = path.join(__dirname, '..', '..', 'assets', 'certs', 'cert.pem'); | ||||
|   const keyPath = path.join(__dirname, '..', '..', 'assets', 'certs', 'key.pem'); | ||||
|  | ||||
|   // Read certificates | ||||
|   const publicKey = fs.readFileSync(certPath, 'utf8'); | ||||
|   const privateKey = fs.readFileSync(keyPath, 'utf8'); | ||||
|  | ||||
|   // Validate certificates | ||||
|   try { | ||||
|     // Try to create a secure context with the certificates | ||||
|     tls.createSecureContext({ | ||||
|       cert: publicKey, | ||||
|       key: privateKey | ||||
|     }); | ||||
|   } catch (error) { | ||||
|     throw new Error(`Invalid certificates: ${error.message}`); | ||||
|   } | ||||
|  | ||||
|   return { | ||||
|     privateKey, | ||||
|     publicKey | ||||
|   }; | ||||
| } | ||||
|   | ||||
							
								
								
									
										52
									
								
								test/key.pem
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								test/key.pem
									
									
									
									
									
								
							| @@ -1,52 +0,0 @@ | ||||
| -----BEGIN PRIVATE KEY----- | ||||
| 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 | ||||
| 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA== | ||||
| -----END PRIVATE KEY----- | ||||
							
								
								
									
										272
									
								
								test/test.ts
									
									
									
									
									
								
							
							
						
						
									
										272
									
								
								test/test.ts
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| import { expect, tap } from '@push.rocks/tapbundle'; | ||||
| import * as smartproxy from '../ts/index.js'; | ||||
| import { testCertificates } from './helpers/certificates.js'; | ||||
| import { loadTestCertificates } from './helpers/certificates.js'; | ||||
| import * as https from 'https'; | ||||
| import * as http from 'http'; | ||||
| import { WebSocket, WebSocketServer } from 'ws'; | ||||
| @@ -8,6 +8,7 @@ import { WebSocket, WebSocketServer } from 'ws'; | ||||
| let testProxy: smartproxy.NetworkProxy; | ||||
| let testServer: http.Server; | ||||
| let wsServer: WebSocketServer; | ||||
| let testCertificates: { privateKey: string; publicKey: string }; | ||||
|  | ||||
| // Helper function to make HTTPS requests | ||||
| async function makeHttpsRequest( | ||||
| @@ -32,28 +33,138 @@ async function makeHttpsRequest( | ||||
|  | ||||
| // Setup test environment | ||||
| tap.test('setup test environment', async () => { | ||||
|   // Load and validate certificates | ||||
|   console.log('[TEST] Loading and validating certificates'); | ||||
|   testCertificates = loadTestCertificates(); | ||||
|   console.log('[TEST] Certificates loaded and validated'); | ||||
|   // Create a test HTTP server | ||||
|   testServer = http.createServer((req, res) => { | ||||
|     console.log('[TEST SERVER] Received HTTP request:', { | ||||
|       url: req.url, | ||||
|       method: req.method, | ||||
|       headers: req.headers | ||||
|     }); | ||||
|     res.writeHead(200, { 'Content-Type': 'text/plain' }); | ||||
|     res.end('Hello from test server!'); | ||||
|   }); | ||||
|  | ||||
|   // Create a WebSocket server | ||||
|   wsServer = new WebSocketServer({ noServer: true }); | ||||
|   wsServer.on('connection', (ws) => { | ||||
|     ws.on('message', (message) => { | ||||
|       ws.send('Echo: ' + message); | ||||
|     }); | ||||
|   // Handle WebSocket upgrade requests | ||||
|   testServer.on('upgrade', (request, socket, head) => { | ||||
|     console.log('[TEST SERVER] Received WebSocket upgrade request:', { | ||||
|       url: request.url, | ||||
|       method: request.method, | ||||
|       headers: { | ||||
|         host: request.headers.host, | ||||
|         upgrade: request.headers.upgrade, | ||||
|         connection: request.headers.connection, | ||||
|         'sec-websocket-key': request.headers['sec-websocket-key'], | ||||
|         'sec-websocket-version': request.headers['sec-websocket-version'], | ||||
|         'sec-websocket-protocol': request.headers['sec-websocket-protocol'] | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|   // Handle upgrade requests | ||||
|   testServer.on('upgrade', (request, socket, head) => { | ||||
|     if (request.headers.upgrade?.toLowerCase() !== 'websocket') { | ||||
|       console.log('[TEST SERVER] Not a WebSocket upgrade request'); | ||||
|       socket.destroy(); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     console.log('[TEST SERVER] Handling WebSocket upgrade'); | ||||
|     wsServer.handleUpgrade(request, socket, head, (ws) => { | ||||
|       console.log('[TEST SERVER] WebSocket connection upgraded'); | ||||
|       wsServer.emit('connection', ws, request); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   // Create a WebSocket server | ||||
|   console.log('[TEST SERVER] Creating WebSocket server'); | ||||
|   wsServer = new WebSocketServer({ | ||||
|     noServer: true, | ||||
|     perMessageDeflate: false, | ||||
|     clientTracking: true, | ||||
|     handleProtocols: () => 'echo-protocol' | ||||
|   }); | ||||
|  | ||||
|   wsServer.on('connection', (ws, request) => { | ||||
|     console.log('[TEST SERVER] WebSocket connection established:', { | ||||
|       url: request.url, | ||||
|       headers: { | ||||
|         host: request.headers.host, | ||||
|         upgrade: request.headers.upgrade, | ||||
|         connection: request.headers.connection, | ||||
|         'sec-websocket-key': request.headers['sec-websocket-key'], | ||||
|         'sec-websocket-version': request.headers['sec-websocket-version'], | ||||
|         'sec-websocket-protocol': request.headers['sec-websocket-protocol'] | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     // Set up connection timeout | ||||
|     const connectionTimeout = setTimeout(() => { | ||||
|       console.error('[TEST SERVER] WebSocket connection timed out'); | ||||
|       ws.terminate(); | ||||
|     }, 5000); | ||||
|  | ||||
|     // Clear timeout when connection is properly closed | ||||
|     const clearConnectionTimeout = () => { | ||||
|       clearTimeout(connectionTimeout); | ||||
|     }; | ||||
|  | ||||
|     ws.on('message', (message) => { | ||||
|       const msg = message.toString(); | ||||
|       console.log('[TEST SERVER] Received message:', msg); | ||||
|       try { | ||||
|         const response = `Echo: ${msg}`; | ||||
|         console.log('[TEST SERVER] Sending response:', response); | ||||
|         ws.send(response); | ||||
|         // Clear timeout on successful message exchange | ||||
|         clearConnectionTimeout(); | ||||
|       } catch (error) { | ||||
|         console.error('[TEST SERVER] Error sending message:', error); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     ws.on('error', (error) => { | ||||
|       console.error('[TEST SERVER] WebSocket error:', error); | ||||
|       clearConnectionTimeout(); | ||||
|     }); | ||||
|  | ||||
|     ws.on('close', (code, reason) => { | ||||
|       console.log('[TEST SERVER] WebSocket connection closed:', { | ||||
|         code, | ||||
|         reason: reason.toString(), | ||||
|         wasClean: code === 1000 || code === 1001 | ||||
|       }); | ||||
|       clearConnectionTimeout(); | ||||
|     }); | ||||
|  | ||||
|     ws.on('ping', (data) => { | ||||
|       try { | ||||
|         console.log('[TEST SERVER] Received ping, sending pong'); | ||||
|         ws.pong(data); | ||||
|       } catch (error) { | ||||
|         console.error('[TEST SERVER] Error sending pong:', error); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     ws.on('pong', (data) => { | ||||
|       console.log('[TEST SERVER] Received pong'); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   wsServer.on('error', (error) => { | ||||
|     console.error('Test server: WebSocket server error:', error); | ||||
|   }); | ||||
|  | ||||
|   wsServer.on('headers', (headers) => { | ||||
|     console.log('Test server: WebSocket headers:', headers); | ||||
|   }); | ||||
|  | ||||
|   wsServer.on('close', () => { | ||||
|     console.log('Test server: WebSocket server closed'); | ||||
|   }); | ||||
|  | ||||
|   await new Promise<void>((resolve) => testServer.listen(3000, resolve)); | ||||
|   console.log('Test server listening on port 3000'); | ||||
| }); | ||||
|  | ||||
| tap.test('should create proxy instance', async () => { | ||||
| @@ -64,7 +175,9 @@ tap.test('should create proxy instance', async () => { | ||||
| }); | ||||
|  | ||||
| tap.test('should start the proxy server', async () => { | ||||
|   console.log('[TEST] Starting the proxy server'); | ||||
|   await testProxy.start(); | ||||
|   console.log('[TEST] Proxy server started'); | ||||
|  | ||||
|   // Configure proxy with test certificates | ||||
|   testProxy.updateProxyConfigs([ | ||||
| @@ -74,8 +187,10 @@ tap.test('should start the proxy server', async () => { | ||||
|       hostName: 'push.rocks', | ||||
|       publicKey: testCertificates.publicKey, | ||||
|       privateKey: testCertificates.privateKey, | ||||
|     }, | ||||
|     } | ||||
|   ]); | ||||
|  | ||||
|   console.log('[TEST] Proxy configuration updated'); | ||||
| }); | ||||
|  | ||||
| tap.test('should route HTTPS requests based on host header', async () => { | ||||
| @@ -104,41 +219,110 @@ tap.test('should handle unknown host headers', async () => { | ||||
| }); | ||||
|  | ||||
| tap.test('should support WebSocket connections', async () => { | ||||
|   return new Promise<void>((resolve, reject) => { | ||||
|     console.log('Starting WebSocket test...'); | ||||
|     const ws = new WebSocket('wss://localhost:3001', { | ||||
|       rejectUnauthorized: false, | ||||
|       headers: { | ||||
|         'Host': 'push.rocks' | ||||
|   console.log('\n[TEST] ====== WebSocket Test Started ======'); | ||||
|   console.log('[TEST] Test server port:', 3000); | ||||
|   console.log('[TEST] Proxy server port:', 3001); | ||||
|   console.log('\n[TEST] Starting WebSocket test'); | ||||
|  | ||||
|   // First configure the proxy with test certificates | ||||
|   console.log('[TEST] Configuring proxy with test certificates'); | ||||
|   testProxy.updateProxyConfigs([ | ||||
|     { | ||||
|       destinationIp: '127.0.0.1', | ||||
|       destinationPort: '3000', | ||||
|       hostName: 'push.rocks', | ||||
|       publicKey: testCertificates.publicKey, | ||||
|       privateKey: testCertificates.privateKey, | ||||
|     } | ||||
|   ]); | ||||
|  | ||||
|   return new Promise<void>((resolve, reject) => { | ||||
|     console.log('[TEST] Creating WebSocket client'); | ||||
|  | ||||
|     // Create WebSocket client with SSL/TLS options | ||||
|     const wsUrl = 'wss://push.rocks:3001'; | ||||
|     console.log('[TEST] Creating WebSocket connection to:', wsUrl); | ||||
|      | ||||
|     const ws = new WebSocket(wsUrl, { | ||||
|       rejectUnauthorized: false, // Accept self-signed certificates | ||||
|       handshakeTimeout: 5000, | ||||
|       perMessageDeflate: false, | ||||
|       headers: { | ||||
|         'Host': 'push.rocks', | ||||
|         'Connection': 'Upgrade', | ||||
|         'Upgrade': 'websocket', | ||||
|         'Sec-WebSocket-Version': '13' | ||||
|       }, | ||||
|       protocol: 'echo-protocol', | ||||
|       agent: new https.Agent({ | ||||
|         rejectUnauthorized: false // Also needed for the underlying HTTPS connection | ||||
|       }) | ||||
|     }); | ||||
|  | ||||
|     const timeout = setTimeout(() => { | ||||
|     console.log('[TEST] WebSocket client created'); | ||||
|  | ||||
|     let resolved = false; | ||||
|     const cleanup = () => { | ||||
|       if (!resolved) { | ||||
|         resolved = true; | ||||
|         try { | ||||
|           console.log('[TEST] Cleaning up WebSocket connection'); | ||||
|           ws.close(); | ||||
|           resolve(); | ||||
|         } catch (error) { | ||||
|           console.error('[TEST] Error during cleanup:', error); | ||||
|           reject(error); | ||||
|         } | ||||
|       } | ||||
|     }; | ||||
|  | ||||
|     const timeout = setTimeout(() => { | ||||
|       console.error('[TEST] WebSocket test timed out'); | ||||
|       cleanup(); | ||||
|       reject(new Error('WebSocket test timed out after 5 seconds')); | ||||
|     }, 5000); | ||||
|  | ||||
|     // Connection establishment events | ||||
|     ws.on('upgrade', (response) => { | ||||
|       console.log('[TEST] WebSocket upgrade response received:', { | ||||
|         headers: response.headers, | ||||
|         statusCode: response.statusCode | ||||
|       }); | ||||
|     }); | ||||
|  | ||||
|     ws.on('open', () => { | ||||
|       console.log('WebSocket connection opened'); | ||||
|       console.log('[TEST] WebSocket connection opened'); | ||||
|       try { | ||||
|         console.log('[TEST] Sending test message'); | ||||
|         ws.send('Hello WebSocket'); | ||||
|       } catch (error) { | ||||
|         console.error('[TEST] Error sending message:', error); | ||||
|         cleanup(); | ||||
|         reject(error); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     ws.on('message', (data) => { | ||||
|       console.log('Received message:', data.toString()); | ||||
|       expect(data.toString()).toEqual('Echo: Hello WebSocket'); | ||||
|     ws.on('message', (message) => { | ||||
|       console.log('[TEST] Received message:', message.toString()); | ||||
|       if (message.toString() === 'Hello WebSocket') { | ||||
|         console.log('[TEST] Message received correctly'); | ||||
|         clearTimeout(timeout); | ||||
|       ws.close(); | ||||
|       resolve(); | ||||
|         cleanup(); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     ws.on('error', (err) => { | ||||
|       console.error('WebSocket error:', err); | ||||
|       clearTimeout(timeout); | ||||
|       reject(err); | ||||
|     ws.on('error', (error) => { | ||||
|       console.error('[TEST] WebSocket error:', error); | ||||
|       cleanup(); | ||||
|       reject(error); | ||||
|     }); | ||||
|  | ||||
|     ws.on('close', () => { | ||||
|       console.log('WebSocket connection closed'); | ||||
|     ws.on('close', (code, reason) => { | ||||
|       console.log('[TEST] WebSocket connection closed:', { | ||||
|         code, | ||||
|         reason: reason.toString() | ||||
|       }); | ||||
|       cleanup(); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| @@ -160,10 +344,36 @@ tap.test('should handle custom headers', async () => { | ||||
| }); | ||||
|  | ||||
| tap.test('cleanup', async () => { | ||||
|   console.log('[TEST] Starting cleanup'); | ||||
|  | ||||
|   // Clean up all servers | ||||
|   await new Promise<void>((resolve) => wsServer.close(() => resolve())); | ||||
|   await new Promise<void>((resolve) => testServer.close(() => resolve())); | ||||
|   console.log('[TEST] Terminating WebSocket clients'); | ||||
|   wsServer.clients.forEach((client) => { | ||||
|     client.terminate(); | ||||
|   }); | ||||
|  | ||||
|   console.log('[TEST] Closing WebSocket server'); | ||||
|   await new Promise<void>((resolve) => wsServer.close(() => { | ||||
|     console.log('[TEST] WebSocket server closed'); | ||||
|     resolve(); | ||||
|   })); | ||||
|  | ||||
|   console.log('[TEST] Closing test server'); | ||||
|   await new Promise<void>((resolve) => testServer.close(() => { | ||||
|     console.log('[TEST] Test server closed'); | ||||
|     resolve(); | ||||
|   })); | ||||
|  | ||||
|   console.log('[TEST] Stopping proxy'); | ||||
|   await testProxy.stop(); | ||||
|   console.log('[TEST] Cleanup complete'); | ||||
| }); | ||||
|  | ||||
| process.on('exit', () => { | ||||
|   console.log('[TEST] Shutting down test server'); | ||||
|   testServer.close(() => console.log('[TEST] Test server shut down')); | ||||
|   wsServer.close(() => console.log('[TEST] WebSocket server shut down')); | ||||
|   testProxy.stop().then(() => console.log('[TEST] Proxy server stopped')); | ||||
| }); | ||||
|  | ||||
| tap.start(); | ||||
|   | ||||
| @@ -3,6 +3,6 @@ | ||||
|  */ | ||||
| export const commitinfo = { | ||||
|   name: '@push.rocks/smartproxy', | ||||
|   version: '3.1.1', | ||||
|   version: '3.1.2', | ||||
|   description: 'a proxy for handling high workloads of proxying' | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,8 @@ | ||||
| import * as plugins from './smartproxy.plugins.js'; | ||||
| import { ProxyRouter } from './smartproxy.classes.router.js'; | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import { fileURLToPath } from 'url'; | ||||
|  | ||||
| export interface INetworkProxyOptions { | ||||
|   port: number; | ||||
| @@ -18,6 +21,7 @@ export class NetworkProxy { | ||||
|   public socketMap = new plugins.lik.ObjectMap<plugins.net.Socket>(); | ||||
|   public defaultHeaders: { [key: string]: string } = {}; | ||||
|   public heartbeatInterval: NodeJS.Timeout; | ||||
|   private defaultCertificates: { key: string; cert: string }; | ||||
|  | ||||
|   public alreadyAddedReverseConfigs: { | ||||
|     [hostName: string]: plugins.tsclass.network.IReverseProxyConfig; | ||||
| @@ -25,6 +29,18 @@ export class NetworkProxy { | ||||
|  | ||||
|   constructor(optionsArg: INetworkProxyOptions) { | ||||
|     this.options = optionsArg; | ||||
|     const __dirname = path.dirname(fileURLToPath(import.meta.url)); | ||||
|     const certPath = path.join(__dirname, '..', 'assets', 'certs'); | ||||
|      | ||||
|     try { | ||||
|       this.defaultCertificates = { | ||||
|         key: fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8'), | ||||
|         cert: fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8') | ||||
|       }; | ||||
|     } catch (error) { | ||||
|       console.error('Error loading certificates:', error); | ||||
|       throw error; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @@ -32,94 +48,9 @@ export class NetworkProxy { | ||||
|    */ | ||||
|   public async start() { | ||||
|     this.httpsServer = plugins.https.createServer( | ||||
|       // ================ | ||||
|       // Spotted this keypair in the code? | ||||
|       // Don't get exited: | ||||
|       // It is an invalid default keypair. | ||||
|       // For proper requests custom domain level keypairs are used that are provided in the reverse config | ||||
|       // ================ | ||||
|       { | ||||
|         key: `-----BEGIN PRIVATE KEY----- | ||||
| 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 | ||||
| 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA== | ||||
| -----END PRIVATE KEY----- | ||||
|     `, | ||||
|         cert: `-----BEGIN CERTIFICATE----- | ||||
| MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE | ||||
| RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF | ||||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t | ||||
| pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN | ||||
| QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW | ||||
| asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6 | ||||
| rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE | ||||
| TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8 | ||||
| X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV | ||||
| BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn | ||||
| no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7 | ||||
| muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc | ||||
| gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo | ||||
| hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C | ||||
| mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt | ||||
| KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A | ||||
| qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj | ||||
| t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9 | ||||
| LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX | ||||
| xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde | ||||
| h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE | ||||
| Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V | ||||
| TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr | ||||
| r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS | ||||
| JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= | ||||
| -----END CERTIFICATE----- | ||||
|     `, | ||||
|         key: this.defaultCertificates.key, | ||||
|         cert: this.defaultCertificates.cert | ||||
|       }, | ||||
|       async (originRequest, originResponse) => { | ||||
|         /** | ||||
|   | ||||
| @@ -16,9 +16,18 @@ export class ProxyRouter { | ||||
|    */ | ||||
|   public routeReq(req: plugins.http.IncomingMessage): plugins.tsclass.network.IReverseProxyConfig { | ||||
|     const originalHost = req.headers.host; | ||||
|     if (!originalHost) { | ||||
|       console.error('No host header found in request'); | ||||
|       return undefined; | ||||
|     } | ||||
|     // Strip port from host if present | ||||
|     const hostWithoutPort = originalHost.split(':')[0]; | ||||
|     const correspodingReverseProxyConfig = this.reverseProxyConfigs.find((reverseConfig) => { | ||||
|       return reverseConfig.hostName === originalHost; | ||||
|       return reverseConfig.hostName === hostWithoutPort; | ||||
|     }); | ||||
|     if (!correspodingReverseProxyConfig) { | ||||
|       console.error(`No config found for host: ${hostWithoutPort}`); | ||||
|     } | ||||
|     return correspodingReverseProxyConfig; | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										30
									
								
								ts/smartproxy.helpers.certificates.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								ts/smartproxy.helpers.certificates.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import { fileURLToPath } from 'url'; | ||||
|  | ||||
| const __dirname = path.dirname(fileURLToPath(import.meta.url)); | ||||
|  | ||||
| export interface ICertificates { | ||||
|   privateKey: string; | ||||
|   publicKey: string; | ||||
| } | ||||
|  | ||||
| export function loadDefaultCertificates(): ICertificates { | ||||
|   try { | ||||
|     const certPath = path.join(__dirname, '..', 'assets', 'certs'); | ||||
|     const privateKey = fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8'); | ||||
|     const publicKey = fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8'); | ||||
|  | ||||
|     if (!privateKey || !publicKey) { | ||||
|       throw new Error('Failed to load default certificates'); | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|       privateKey, | ||||
|       publicKey | ||||
|     }; | ||||
|   } catch (error) { | ||||
|     console.error('Error loading default certificates:', error); | ||||
|     throw error; | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user