@push.rocks/smartproxy 19.3.2 → 19.3.4
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/forwarding/factory/forwarding-factory.js +29 -1
- package/dist_ts/http/index.d.ts +1 -3
- package/dist_ts/http/index.js +4 -10
- package/dist_ts/http/models/http-types.d.ts +4 -91
- package/dist_ts/http/models/http-types.js +5 -60
- package/dist_ts/http/router/proxy-router.d.ts +1 -1
- package/dist_ts/http/router/route-router.d.ts +1 -1
- package/dist_ts/index.d.ts +9 -7
- package/dist_ts/index.js +10 -7
- package/dist_ts/proxies/{network-proxy → http-proxy}/certificate-manager.d.ts +2 -2
- package/dist_ts/proxies/{network-proxy → http-proxy}/certificate-manager.js +1 -1
- package/dist_ts/proxies/{network-proxy → http-proxy}/connection-pool.d.ts +2 -2
- package/dist_ts/proxies/http-proxy/connection-pool.js +210 -0
- package/dist_ts/proxies/http-proxy/context-creator.js +108 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/function-cache.js +1 -1
- package/dist_ts/proxies/http-proxy/handlers/index.d.ts +5 -0
- package/dist_ts/proxies/http-proxy/handlers/index.js +6 -0
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +18 -0
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +78 -0
- package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +19 -0
- package/dist_ts/proxies/http-proxy/handlers/static-handler.js +203 -0
- package/dist_ts/proxies/{network-proxy/network-proxy.d.ts → http-proxy/http-proxy.d.ts} +10 -9
- package/dist_ts/proxies/{network-proxy/network-proxy.js → http-proxy/http-proxy.js} +13 -12
- package/dist_ts/proxies/{network-proxy → http-proxy}/http-request-handler.js +1 -1
- package/dist_ts/proxies/http-proxy/http2-request-handler.js +201 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/index.d.ts +2 -2
- package/dist_ts/proxies/http-proxy/index.js +12 -0
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +119 -0
- package/dist_ts/proxies/http-proxy/models/http-types.js +112 -0
- package/dist_ts/proxies/http-proxy/models/index.d.ts +5 -0
- package/dist_ts/proxies/http-proxy/models/index.js +6 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/models/types.d.ts +2 -2
- package/dist_ts/proxies/http-proxy/models/types.js +276 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/request-handler.d.ts +3 -3
- package/dist_ts/proxies/{network-proxy → http-proxy}/request-handler.js +2 -2
- package/dist_ts/proxies/http-proxy/security-manager.js +255 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/websocket-handler.d.ts +3 -3
- package/dist_ts/proxies/{network-proxy → http-proxy}/websocket-handler.js +2 -2
- package/dist_ts/proxies/index.d.ts +5 -5
- package/dist_ts/proxies/index.js +5 -5
- package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +4 -4
- package/dist_ts/proxies/smart-proxy/certificate-manager.js +11 -11
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +41 -0
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +121 -0
- package/dist_ts/proxies/smart-proxy/index.d.ts +2 -1
- package/dist_ts/proxies/smart-proxy/index.js +4 -2
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +2 -2
- package/dist_ts/proxies/smart-proxy/port-manager.js +3 -3
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +3 -3
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +24 -265
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +1 -1
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +25 -25
- package/dist_ts/routing/index.d.ts +5 -0
- package/dist_ts/routing/index.js +8 -0
- package/dist_ts/routing/models/http-types.d.ts +6 -0
- package/dist_ts/routing/models/http-types.js +7 -0
- package/dist_ts/routing/router/index.d.ts +8 -0
- package/dist_ts/routing/router/index.js +7 -0
- package/dist_ts/{classes.router.d.ts → routing/router/proxy-router.d.ts} +14 -11
- package/dist_ts/{classes.router.js → routing/router/proxy-router.js} +2 -2
- package/dist_ts/routing/router/route-router.d.ts +108 -0
- package/dist_ts/routing/router/route-router.js +393 -0
- package/package.json +1 -1
- package/readme.md +18 -35
- package/readme.plan.md +173 -271
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/forwarding/factory/forwarding-factory.ts +28 -0
- package/ts/index.ts +13 -9
- package/ts/proxies/{network-proxy → http-proxy}/certificate-manager.ts +2 -2
- package/ts/proxies/{network-proxy → http-proxy}/connection-pool.ts +2 -2
- package/ts/proxies/http-proxy/handlers/index.ts +6 -0
- package/ts/proxies/http-proxy/handlers/redirect-handler.ts +105 -0
- package/ts/proxies/http-proxy/handlers/static-handler.ts +251 -0
- package/ts/proxies/{network-proxy/network-proxy.ts → http-proxy/http-proxy.ts} +15 -14
- package/ts/proxies/{network-proxy → http-proxy}/index.ts +3 -3
- package/ts/proxies/http-proxy/models/http-types.ts +165 -0
- package/ts/proxies/http-proxy/models/index.ts +5 -0
- package/ts/proxies/{network-proxy → http-proxy}/models/types.ts +2 -2
- package/ts/proxies/{network-proxy → http-proxy}/request-handler.ts +3 -3
- package/ts/proxies/{network-proxy → http-proxy}/websocket-handler.ts +3 -3
- package/ts/proxies/index.ts +7 -7
- package/ts/proxies/smart-proxy/certificate-manager.ts +10 -10
- package/ts/proxies/smart-proxy/{network-proxy-bridge.ts → http-proxy-bridge.ts} +44 -44
- package/ts/proxies/smart-proxy/index.ts +4 -1
- package/ts/proxies/smart-proxy/models/interfaces.ts +3 -3
- package/ts/proxies/smart-proxy/port-manager.ts +2 -2
- package/ts/proxies/smart-proxy/route-connection-handler.ts +23 -307
- package/ts/proxies/smart-proxy/smart-proxy.ts +25 -25
- package/ts/routing/index.ts +9 -0
- package/ts/routing/models/http-types.ts +6 -0
- package/ts/{http → routing}/router/proxy-router.ts +1 -1
- package/ts/{http → routing}/router/route-router.ts +1 -1
- package/dist_ts/certificate/acme/acme-factory.d.ts +0 -17
- package/dist_ts/certificate/acme/acme-factory.js +0 -40
- package/dist_ts/certificate/acme/challenge-handler.d.ts +0 -44
- package/dist_ts/certificate/acme/challenge-handler.js +0 -92
- package/dist_ts/certificate/acme/index.d.ts +0 -4
- package/dist_ts/certificate/acme/index.js +0 -5
- package/dist_ts/certificate/certificate-manager.d.ts +0 -150
- package/dist_ts/certificate/certificate-manager.js +0 -505
- package/dist_ts/certificate/events/certificate-events.d.ts +0 -33
- package/dist_ts/certificate/events/certificate-events.js +0 -38
- package/dist_ts/certificate/events/simplified-events.d.ts +0 -56
- package/dist_ts/certificate/events/simplified-events.js +0 -13
- package/dist_ts/certificate/index.d.ts +0 -30
- package/dist_ts/certificate/index.js +0 -37
- package/dist_ts/certificate/models/certificate-errors.d.ts +0 -69
- package/dist_ts/certificate/models/certificate-errors.js +0 -141
- package/dist_ts/certificate/models/certificate-strategy.d.ts +0 -60
- package/dist_ts/certificate/models/certificate-strategy.js +0 -73
- package/dist_ts/certificate/models/certificate-types.d.ts +0 -97
- package/dist_ts/certificate/models/certificate-types.js +0 -2
- package/dist_ts/certificate/providers/cert-provisioner.d.ts +0 -119
- package/dist_ts/certificate/providers/cert-provisioner.js +0 -422
- package/dist_ts/certificate/providers/index.d.ts +0 -4
- package/dist_ts/certificate/providers/index.js +0 -5
- package/dist_ts/certificate/simplified-certificate-manager.d.ts +0 -150
- package/dist_ts/certificate/simplified-certificate-manager.js +0 -501
- package/dist_ts/certificate/storage/file-storage.d.ts +0 -66
- package/dist_ts/certificate/storage/file-storage.js +0 -194
- package/dist_ts/certificate/storage/index.d.ts +0 -4
- package/dist_ts/certificate/storage/index.js +0 -5
- package/dist_ts/certificate/utils/certificate-helpers.d.ts +0 -17
- package/dist_ts/certificate/utils/certificate-helpers.js +0 -45
- package/dist_ts/classes.iptablesproxy.d.ts +0 -112
- package/dist_ts/classes.iptablesproxy.js +0 -765
- package/dist_ts/classes.networkproxy.d.ts +0 -243
- package/dist_ts/classes.networkproxy.js +0 -1424
- package/dist_ts/classes.nftablesproxy.d.ts +0 -219
- package/dist_ts/classes.nftablesproxy.js +0 -1542
- package/dist_ts/classes.port80handler.d.ts +0 -215
- package/dist_ts/classes.port80handler.js +0 -736
- package/dist_ts/classes.portproxy.d.ts +0 -171
- package/dist_ts/classes.portproxy.js +0 -1802
- package/dist_ts/classes.pp.acmemanager.d.ts +0 -34
- package/dist_ts/classes.pp.acmemanager.js +0 -123
- package/dist_ts/classes.pp.connectionhandler.d.ts +0 -39
- package/dist_ts/classes.pp.connectionhandler.js +0 -754
- package/dist_ts/classes.pp.connectionmanager.d.ts +0 -78
- package/dist_ts/classes.pp.connectionmanager.js +0 -378
- package/dist_ts/classes.pp.domainconfigmanager.d.ts +0 -55
- package/dist_ts/classes.pp.domainconfigmanager.js +0 -103
- package/dist_ts/classes.pp.interfaces.d.ts +0 -133
- package/dist_ts/classes.pp.interfaces.js +0 -2
- package/dist_ts/classes.pp.networkproxybridge.d.ts +0 -57
- package/dist_ts/classes.pp.networkproxybridge.js +0 -306
- package/dist_ts/classes.pp.portproxy.d.ts +0 -64
- package/dist_ts/classes.pp.portproxy.js +0 -567
- package/dist_ts/classes.pp.portrangemanager.d.ts +0 -56
- package/dist_ts/classes.pp.portrangemanager.js +0 -179
- package/dist_ts/classes.pp.securitymanager.d.ts +0 -47
- package/dist_ts/classes.pp.securitymanager.js +0 -126
- package/dist_ts/classes.pp.snihandler.d.ts +0 -153
- package/dist_ts/classes.pp.snihandler.js +0 -1053
- package/dist_ts/classes.pp.timeoutmanager.d.ts +0 -47
- package/dist_ts/classes.pp.timeoutmanager.js +0 -154
- package/dist_ts/classes.pp.tlsalert.d.ts +0 -149
- package/dist_ts/classes.pp.tlsalert.js +0 -225
- package/dist_ts/classes.pp.tlsmanager.d.ts +0 -57
- package/dist_ts/classes.pp.tlsmanager.js +0 -132
- package/dist_ts/classes.snihandler.d.ts +0 -198
- package/dist_ts/classes.snihandler.js +0 -1210
- package/dist_ts/classes.sslredirect.d.ts +0 -8
- package/dist_ts/classes.sslredirect.js +0 -28
- package/dist_ts/common/acmeFactory.d.ts +0 -9
- package/dist_ts/common/acmeFactory.js +0 -20
- package/dist_ts/common/port80-adapter.d.ts +0 -11
- package/dist_ts/common/port80-adapter.js +0 -87
- package/dist_ts/examples/forwarding-example.d.ts +0 -1
- package/dist_ts/examples/forwarding-example.js +0 -96
- package/dist_ts/forwarding/config/domain-config.d.ts +0 -12
- package/dist_ts/forwarding/config/domain-config.js +0 -12
- package/dist_ts/forwarding/config/domain-manager.d.ts +0 -86
- package/dist_ts/forwarding/config/domain-manager.js +0 -242
- package/dist_ts/helpers.certificates.d.ts +0 -5
- package/dist_ts/helpers.certificates.js +0 -23
- package/dist_ts/http/port80/acme-interfaces.d.ts +0 -108
- package/dist_ts/http/port80/acme-interfaces.js +0 -51
- package/dist_ts/http/port80/challenge-responder.d.ts +0 -53
- package/dist_ts/http/port80/challenge-responder.js +0 -203
- package/dist_ts/http/port80/index.d.ts +0 -6
- package/dist_ts/http/port80/index.js +0 -9
- package/dist_ts/http/port80/port80-handler.d.ts +0 -136
- package/dist_ts/http/port80/port80-handler.js +0 -592
- package/dist_ts/http/redirects/index.d.ts +0 -4
- package/dist_ts/http/redirects/index.js +0 -5
- package/dist_ts/networkproxy/classes.np.certificatemanager.d.ts +0 -77
- package/dist_ts/networkproxy/classes.np.certificatemanager.js +0 -372
- package/dist_ts/networkproxy/classes.np.connectionpool.d.ts +0 -47
- package/dist_ts/networkproxy/classes.np.connectionpool.js +0 -210
- package/dist_ts/networkproxy/classes.np.networkproxy.d.ts +0 -118
- package/dist_ts/networkproxy/classes.np.networkproxy.js +0 -387
- package/dist_ts/networkproxy/classes.np.requesthandler.d.ts +0 -56
- package/dist_ts/networkproxy/classes.np.requesthandler.js +0 -393
- package/dist_ts/networkproxy/classes.np.types.d.ts +0 -83
- package/dist_ts/networkproxy/classes.np.types.js +0 -35
- package/dist_ts/networkproxy/classes.np.websockethandler.d.ts +0 -38
- package/dist_ts/networkproxy/classes.np.websockethandler.js +0 -188
- package/dist_ts/networkproxy/index.d.ts +0 -1
- package/dist_ts/networkproxy/index.js +0 -4
- package/dist_ts/nfttablesproxy/classes.nftablesproxy.d.ts +0 -219
- package/dist_ts/nfttablesproxy/classes.nftablesproxy.js +0 -1542
- package/dist_ts/port80handler/classes.port80handler.d.ts +0 -10
- package/dist_ts/port80handler/classes.port80handler.js +0 -16
- package/dist_ts/proxies/network-proxy/connection-pool.js +0 -210
- package/dist_ts/proxies/network-proxy/context-creator.js +0 -108
- package/dist_ts/proxies/network-proxy/http2-request-handler.js +0 -201
- package/dist_ts/proxies/network-proxy/index.js +0 -12
- package/dist_ts/proxies/network-proxy/models/index.d.ts +0 -4
- package/dist_ts/proxies/network-proxy/models/index.js +0 -5
- package/dist_ts/proxies/network-proxy/models/types.js +0 -276
- package/dist_ts/proxies/network-proxy/security-manager.js +0 -255
- package/dist_ts/proxies/network-proxy/simplified-certificate-bridge.d.ts +0 -48
- package/dist_ts/proxies/network-proxy/simplified-certificate-bridge.js +0 -76
- package/dist_ts/proxies/smart-proxy/connection-handler.d.ts +0 -39
- package/dist_ts/proxies/smart-proxy/connection-handler.js +0 -894
- package/dist_ts/proxies/smart-proxy/domain-config-manager.d.ts +0 -110
- package/dist_ts/proxies/smart-proxy/domain-config-manager.js +0 -386
- package/dist_ts/proxies/smart-proxy/legacy-smart-proxy.d.ts +0 -168
- package/dist_ts/proxies/smart-proxy/legacy-smart-proxy.js +0 -642
- package/dist_ts/proxies/smart-proxy/models/simplified-smartproxy-config.d.ts +0 -65
- package/dist_ts/proxies/smart-proxy/models/simplified-smartproxy-config.js +0 -31
- package/dist_ts/proxies/smart-proxy/models/smartproxy-options.d.ts +0 -102
- package/dist_ts/proxies/smart-proxy/models/smartproxy-options.js +0 -73
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +0 -41
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +0 -121
- package/dist_ts/proxies/smart-proxy/port-range-manager.d.ts +0 -56
- package/dist_ts/proxies/smart-proxy/port-range-manager.js +0 -176
- package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +0 -9
- package/dist_ts/proxies/smart-proxy/route-helpers/index.js +0 -11
- package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +0 -7
- package/dist_ts/proxies/smart-proxy/route-helpers.js +0 -9
- package/dist_ts/proxies/smart-proxy/simplified-smart-proxy.d.ts +0 -41
- package/dist_ts/proxies/smart-proxy/simplified-smart-proxy.js +0 -132
- package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.d.ts +0 -51
- package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.js +0 -124
- package/dist_ts/redirect/classes.redirect.d.ts +0 -96
- package/dist_ts/redirect/classes.redirect.js +0 -194
- package/dist_ts/smartproxy/classes.pp.certprovisioner.d.ts +0 -54
- package/dist_ts/smartproxy/classes.pp.certprovisioner.js +0 -179
- package/dist_ts/smartproxy/classes.pp.connectionhandler.d.ts +0 -39
- package/dist_ts/smartproxy/classes.pp.connectionhandler.js +0 -894
- package/dist_ts/smartproxy/classes.pp.connectionmanager.d.ts +0 -78
- package/dist_ts/smartproxy/classes.pp.connectionmanager.js +0 -378
- package/dist_ts/smartproxy/classes.pp.domainconfigmanager.d.ts +0 -94
- package/dist_ts/smartproxy/classes.pp.domainconfigmanager.js +0 -255
- package/dist_ts/smartproxy/classes.pp.interfaces.d.ts +0 -103
- package/dist_ts/smartproxy/classes.pp.interfaces.js +0 -2
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +0 -62
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +0 -316
- package/dist_ts/smartproxy/classes.pp.portrangemanager.d.ts +0 -56
- package/dist_ts/smartproxy/classes.pp.portrangemanager.js +0 -176
- package/dist_ts/smartproxy/classes.pp.securitymanager.d.ts +0 -64
- package/dist_ts/smartproxy/classes.pp.securitymanager.js +0 -149
- package/dist_ts/smartproxy/classes.pp.snihandler.d.ts +0 -153
- package/dist_ts/smartproxy/classes.pp.snihandler.js +0 -1053
- package/dist_ts/smartproxy/classes.pp.timeoutmanager.d.ts +0 -47
- package/dist_ts/smartproxy/classes.pp.timeoutmanager.js +0 -154
- package/dist_ts/smartproxy/classes.pp.tlsalert.d.ts +0 -149
- package/dist_ts/smartproxy/classes.pp.tlsalert.js +0 -225
- package/dist_ts/smartproxy/classes.pp.tlsmanager.d.ts +0 -57
- package/dist_ts/smartproxy/classes.pp.tlsmanager.js +0 -132
- package/dist_ts/smartproxy/classes.smartproxy.d.ts +0 -63
- package/dist_ts/smartproxy/classes.smartproxy.js +0 -521
- package/dist_ts/smartproxy/forwarding/domain-config.d.ts +0 -12
- package/dist_ts/smartproxy/forwarding/domain-config.js +0 -12
- package/dist_ts/smartproxy/forwarding/domain-manager.d.ts +0 -86
- package/dist_ts/smartproxy/forwarding/domain-manager.js +0 -241
- package/dist_ts/smartproxy/forwarding/forwarding.factory.d.ts +0 -24
- package/dist_ts/smartproxy/forwarding/forwarding.factory.js +0 -137
- package/dist_ts/smartproxy/forwarding/forwarding.handler.d.ts +0 -55
- package/dist_ts/smartproxy/forwarding/forwarding.handler.js +0 -94
- package/dist_ts/smartproxy/forwarding/http.handler.d.ts +0 -25
- package/dist_ts/smartproxy/forwarding/http.handler.js +0 -123
- package/dist_ts/smartproxy/forwarding/https-passthrough.handler.d.ts +0 -24
- package/dist_ts/smartproxy/forwarding/https-passthrough.handler.js +0 -154
- package/dist_ts/smartproxy/forwarding/https-terminate-to-http.handler.d.ts +0 -36
- package/dist_ts/smartproxy/forwarding/https-terminate-to-http.handler.js +0 -229
- package/dist_ts/smartproxy/forwarding/https-terminate-to-https.handler.d.ts +0 -35
- package/dist_ts/smartproxy/forwarding/https-terminate-to-https.handler.js +0 -254
- package/dist_ts/smartproxy/forwarding/index.d.ts +0 -16
- package/dist_ts/smartproxy/forwarding/index.js +0 -23
- package/dist_ts/smartproxy/types/forwarding.types.d.ts +0 -104
- package/dist_ts/smartproxy/types/forwarding.types.js +0 -50
- package/dist_ts/smartproxy.classes.networkproxy.d.ts +0 -31
- package/dist_ts/smartproxy.classes.networkproxy.js +0 -305
- package/dist_ts/smartproxy.classes.router.d.ts +0 -13
- package/dist_ts/smartproxy.classes.router.js +0 -33
- package/dist_ts/smartproxy.classes.sslredirect.d.ts +0 -8
- package/dist_ts/smartproxy.classes.sslredirect.js +0 -28
- package/dist_ts/smartproxy.helpers.certificates.d.ts +0 -5
- package/dist_ts/smartproxy.helpers.certificates.js +0 -23
- package/dist_ts/smartproxy.plugins.d.ts +0 -18
- package/dist_ts/smartproxy.plugins.js +0 -23
- package/dist_ts/smartproxy.portproxy.d.ts +0 -26
- package/dist_ts/smartproxy.portproxy.js +0 -295
- package/ts/http/index.ts +0 -16
- package/ts/http/models/http-types.ts +0 -108
- package/ts/http/redirects/index.ts +0 -3
- package/ts/proxies/network-proxy/models/index.ts +0 -4
- package/ts/redirect/classes.redirect.ts +0 -295
- /package/dist_ts/proxies/{network-proxy → http-proxy}/context-creator.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/function-cache.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/http-request-handler.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/http2-request-handler.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/security-manager.d.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/context-creator.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/function-cache.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/http-request-handler.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/http2-request-handler.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/security-manager.ts +0 -0
- /package/ts/{http → routing}/router/index.ts +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as plugins from '../../../plugins.js';
|
|
2
|
+
import type { IRouteConfig } from '../../smart-proxy/models/route-types.js';
|
|
3
|
+
import type { IConnectionRecord } from '../../smart-proxy/models/interfaces.js';
|
|
4
|
+
import type { ILogger } from '../models/types.js';
|
|
5
|
+
import { createLogger } from '../models/types.js';
|
|
6
|
+
import { HttpStatus, getStatusText } from '../models/http-types.js';
|
|
7
|
+
|
|
8
|
+
export interface IRedirectHandlerContext {
|
|
9
|
+
connectionId: string;
|
|
10
|
+
connectionManager: any; // Avoid circular deps
|
|
11
|
+
settings: any;
|
|
12
|
+
logger?: ILogger;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Handles HTTP redirect routes
|
|
17
|
+
*/
|
|
18
|
+
export class RedirectHandler {
|
|
19
|
+
/**
|
|
20
|
+
* Handle redirect routes
|
|
21
|
+
*/
|
|
22
|
+
public static async handleRedirect(
|
|
23
|
+
socket: plugins.net.Socket,
|
|
24
|
+
route: IRouteConfig,
|
|
25
|
+
context: IRedirectHandlerContext
|
|
26
|
+
): Promise<void> {
|
|
27
|
+
const { connectionId, connectionManager, settings } = context;
|
|
28
|
+
const logger = context.logger || createLogger(settings.logLevel || 'info');
|
|
29
|
+
const action = route.action;
|
|
30
|
+
|
|
31
|
+
// We should have a redirect configuration
|
|
32
|
+
if (!action.redirect) {
|
|
33
|
+
logger.error(`[${connectionId}] Redirect action missing redirect configuration`);
|
|
34
|
+
socket.end();
|
|
35
|
+
connectionManager.cleanupConnection({ id: connectionId }, 'missing_redirect');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// For TLS connections, we can't do redirects at the TCP level
|
|
40
|
+
// This check should be done before calling this handler
|
|
41
|
+
|
|
42
|
+
// Wait for the first HTTP request to perform the redirect
|
|
43
|
+
const dataListeners: ((chunk: Buffer) => void)[] = [];
|
|
44
|
+
|
|
45
|
+
const httpDataHandler = (chunk: Buffer) => {
|
|
46
|
+
// Remove all data listeners to avoid duplicated processing
|
|
47
|
+
for (const listener of dataListeners) {
|
|
48
|
+
socket.removeListener('data', listener);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Parse HTTP request to get path
|
|
52
|
+
try {
|
|
53
|
+
const headersEnd = chunk.indexOf('\r\n\r\n');
|
|
54
|
+
if (headersEnd === -1) {
|
|
55
|
+
// Not a complete HTTP request, need more data
|
|
56
|
+
socket.once('data', httpDataHandler);
|
|
57
|
+
dataListeners.push(httpDataHandler);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const httpHeaders = chunk.slice(0, headersEnd).toString();
|
|
62
|
+
const requestLine = httpHeaders.split('\r\n')[0];
|
|
63
|
+
const [method, path] = requestLine.split(' ');
|
|
64
|
+
|
|
65
|
+
// Extract Host header
|
|
66
|
+
const hostMatch = httpHeaders.match(/Host: (.+?)(\r\n|\r|\n|$)/i);
|
|
67
|
+
const host = hostMatch ? hostMatch[1].trim() : '';
|
|
68
|
+
|
|
69
|
+
// Process the redirect URL with template variables
|
|
70
|
+
let redirectUrl = action.redirect.to;
|
|
71
|
+
redirectUrl = redirectUrl.replace(/\{domain\}/g, host);
|
|
72
|
+
redirectUrl = redirectUrl.replace(/\{path\}/g, path || '');
|
|
73
|
+
redirectUrl = redirectUrl.replace(/\{port\}/g, socket.localPort?.toString() || '80');
|
|
74
|
+
|
|
75
|
+
// Prepare the HTTP redirect response
|
|
76
|
+
const redirectResponse = [
|
|
77
|
+
`HTTP/1.1 ${action.redirect.status} Moved`,
|
|
78
|
+
`Location: ${redirectUrl}`,
|
|
79
|
+
'Connection: close',
|
|
80
|
+
'Content-Length: 0',
|
|
81
|
+
'',
|
|
82
|
+
'',
|
|
83
|
+
].join('\r\n');
|
|
84
|
+
|
|
85
|
+
if (settings.enableDetailedLogging) {
|
|
86
|
+
logger.info(
|
|
87
|
+
`[${connectionId}] Redirecting to ${redirectUrl} with status ${action.redirect.status}`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Send the redirect response
|
|
92
|
+
socket.end(redirectResponse);
|
|
93
|
+
connectionManager.initiateCleanupOnce({ id: connectionId }, 'redirect_complete');
|
|
94
|
+
} catch (err) {
|
|
95
|
+
logger.error(`[${connectionId}] Error processing HTTP redirect: ${err}`);
|
|
96
|
+
socket.end();
|
|
97
|
+
connectionManager.initiateCleanupOnce({ id: connectionId }, 'redirect_error');
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Setup the HTTP data handler
|
|
102
|
+
socket.once('data', httpDataHandler);
|
|
103
|
+
dataListeners.push(httpDataHandler);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import * as plugins from '../../../plugins.js';
|
|
2
|
+
import type { IRouteConfig } from '../../smart-proxy/models/route-types.js';
|
|
3
|
+
import type { IConnectionRecord } from '../../smart-proxy/models/interfaces.js';
|
|
4
|
+
import type { ILogger } from '../models/types.js';
|
|
5
|
+
import { createLogger } from '../models/types.js';
|
|
6
|
+
import type { IRouteContext } from '../../../core/models/route-context.js';
|
|
7
|
+
import { HttpStatus, getStatusText } from '../models/http-types.js';
|
|
8
|
+
|
|
9
|
+
export interface IStaticHandlerContext {
|
|
10
|
+
connectionId: string;
|
|
11
|
+
connectionManager: any; // Avoid circular deps
|
|
12
|
+
settings: any;
|
|
13
|
+
logger?: ILogger;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Handles static routes including ACME challenges
|
|
18
|
+
*/
|
|
19
|
+
export class StaticHandler {
|
|
20
|
+
/**
|
|
21
|
+
* Handle static routes
|
|
22
|
+
*/
|
|
23
|
+
public static async handleStatic(
|
|
24
|
+
socket: plugins.net.Socket,
|
|
25
|
+
route: IRouteConfig,
|
|
26
|
+
context: IStaticHandlerContext,
|
|
27
|
+
record: IConnectionRecord
|
|
28
|
+
): Promise<void> {
|
|
29
|
+
const { connectionId, connectionManager, settings } = context;
|
|
30
|
+
const logger = context.logger || createLogger(settings.logLevel || 'info');
|
|
31
|
+
|
|
32
|
+
if (!route.action.handler) {
|
|
33
|
+
logger.error(`[${connectionId}] Static route '${route.name}' has no handler`);
|
|
34
|
+
socket.end();
|
|
35
|
+
connectionManager.cleanupConnection(record, 'no_handler');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let buffer = Buffer.alloc(0);
|
|
40
|
+
let processingData = false;
|
|
41
|
+
|
|
42
|
+
const handleHttpData = async (chunk: Buffer) => {
|
|
43
|
+
// Accumulate the data
|
|
44
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
45
|
+
|
|
46
|
+
// Prevent concurrent processing of the same buffer
|
|
47
|
+
if (processingData) return;
|
|
48
|
+
processingData = true;
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
// Process data until we have a complete request or need more data
|
|
52
|
+
await processBuffer();
|
|
53
|
+
} finally {
|
|
54
|
+
processingData = false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const processBuffer = async () => {
|
|
59
|
+
// Look for end of HTTP headers
|
|
60
|
+
const headerEndIndex = buffer.indexOf('\r\n\r\n');
|
|
61
|
+
if (headerEndIndex === -1) {
|
|
62
|
+
// Need more data
|
|
63
|
+
if (buffer.length > 8192) {
|
|
64
|
+
// Prevent excessive buffering
|
|
65
|
+
logger.error(`[${connectionId}] HTTP headers too large`);
|
|
66
|
+
socket.end();
|
|
67
|
+
connectionManager.cleanupConnection(record, 'headers_too_large');
|
|
68
|
+
}
|
|
69
|
+
return; // Wait for more data to arrive
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Parse the HTTP request
|
|
73
|
+
const headerBuffer = buffer.slice(0, headerEndIndex);
|
|
74
|
+
const headers = headerBuffer.toString();
|
|
75
|
+
const lines = headers.split('\r\n');
|
|
76
|
+
|
|
77
|
+
if (lines.length === 0) {
|
|
78
|
+
logger.error(`[${connectionId}] Invalid HTTP request`);
|
|
79
|
+
socket.end();
|
|
80
|
+
connectionManager.cleanupConnection(record, 'invalid_request');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Parse request line
|
|
85
|
+
const requestLine = lines[0];
|
|
86
|
+
const requestParts = requestLine.split(' ');
|
|
87
|
+
if (requestParts.length < 3) {
|
|
88
|
+
logger.error(`[${connectionId}] Invalid HTTP request line`);
|
|
89
|
+
socket.end();
|
|
90
|
+
connectionManager.cleanupConnection(record, 'invalid_request_line');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const [method, path, httpVersion] = requestParts;
|
|
95
|
+
|
|
96
|
+
// Parse headers
|
|
97
|
+
const headersMap: Record<string, string> = {};
|
|
98
|
+
for (let i = 1; i < lines.length; i++) {
|
|
99
|
+
const colonIndex = lines[i].indexOf(':');
|
|
100
|
+
if (colonIndex > 0) {
|
|
101
|
+
const key = lines[i].slice(0, colonIndex).trim().toLowerCase();
|
|
102
|
+
const value = lines[i].slice(colonIndex + 1).trim();
|
|
103
|
+
headersMap[key] = value;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Check for Content-Length to handle request body
|
|
108
|
+
const requestBodyLength = parseInt(headersMap['content-length'] || '0', 10);
|
|
109
|
+
const bodyStartIndex = headerEndIndex + 4; // Skip the \r\n\r\n
|
|
110
|
+
|
|
111
|
+
// If there's a body, ensure we have the full body
|
|
112
|
+
if (requestBodyLength > 0) {
|
|
113
|
+
const totalExpectedLength = bodyStartIndex + requestBodyLength;
|
|
114
|
+
|
|
115
|
+
// If we don't have the complete body yet, wait for more data
|
|
116
|
+
if (buffer.length < totalExpectedLength) {
|
|
117
|
+
// Implement a reasonable body size limit to prevent memory issues
|
|
118
|
+
if (requestBodyLength > 1024 * 1024) {
|
|
119
|
+
// 1MB limit
|
|
120
|
+
logger.error(`[${connectionId}] Request body too large`);
|
|
121
|
+
socket.end();
|
|
122
|
+
connectionManager.cleanupConnection(record, 'body_too_large');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
return; // Wait for more data
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Extract query string if present
|
|
130
|
+
let pathname = path;
|
|
131
|
+
let query: string | undefined;
|
|
132
|
+
const queryIndex = path.indexOf('?');
|
|
133
|
+
if (queryIndex !== -1) {
|
|
134
|
+
pathname = path.slice(0, queryIndex);
|
|
135
|
+
query = path.slice(queryIndex + 1);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
// Get request body if present
|
|
140
|
+
let requestBody: Buffer | undefined;
|
|
141
|
+
if (requestBodyLength > 0) {
|
|
142
|
+
requestBody = buffer.slice(bodyStartIndex, bodyStartIndex + requestBodyLength);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Pause socket to prevent data loss during async processing
|
|
146
|
+
socket.pause();
|
|
147
|
+
|
|
148
|
+
// Remove the data listener since we're handling the request
|
|
149
|
+
socket.removeListener('data', handleHttpData);
|
|
150
|
+
|
|
151
|
+
// Build route context with parsed HTTP information
|
|
152
|
+
const context: IRouteContext = {
|
|
153
|
+
port: record.localPort,
|
|
154
|
+
domain: record.lockedDomain || headersMap['host']?.split(':')[0],
|
|
155
|
+
clientIp: record.remoteIP,
|
|
156
|
+
serverIp: socket.localAddress!,
|
|
157
|
+
path: pathname,
|
|
158
|
+
query: query,
|
|
159
|
+
headers: headersMap,
|
|
160
|
+
isTls: record.isTLS,
|
|
161
|
+
tlsVersion: record.tlsVersion,
|
|
162
|
+
routeName: route.name,
|
|
163
|
+
routeId: route.id,
|
|
164
|
+
timestamp: Date.now(),
|
|
165
|
+
connectionId,
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// Since IRouteContext doesn't have a body property,
|
|
169
|
+
// we need an alternative approach to handle the body
|
|
170
|
+
let response;
|
|
171
|
+
|
|
172
|
+
if (requestBody) {
|
|
173
|
+
if (settings.enableDetailedLogging) {
|
|
174
|
+
logger.info(
|
|
175
|
+
`[${connectionId}] Processing request with body (${requestBody.length} bytes)`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Pass the body as an additional parameter by extending the context object
|
|
180
|
+
// This is not type-safe, but it allows handlers that expect a body to work
|
|
181
|
+
const extendedContext = {
|
|
182
|
+
...context,
|
|
183
|
+
// Provide both raw buffer and string representation
|
|
184
|
+
requestBody: requestBody,
|
|
185
|
+
requestBodyText: requestBody.toString(),
|
|
186
|
+
method: method,
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// Call the handler with the extended context
|
|
190
|
+
// The handler needs to know to look for the non-standard properties
|
|
191
|
+
response = await route.action.handler(extendedContext as any);
|
|
192
|
+
} else {
|
|
193
|
+
// Call the handler with the standard context
|
|
194
|
+
const extendedContext = {
|
|
195
|
+
...context,
|
|
196
|
+
method: method,
|
|
197
|
+
};
|
|
198
|
+
response = await route.action.handler(extendedContext as any);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Prepare the HTTP response
|
|
202
|
+
const responseHeaders = response.headers || {};
|
|
203
|
+
const contentLength = Buffer.byteLength(response.body || '');
|
|
204
|
+
responseHeaders['Content-Length'] = contentLength.toString();
|
|
205
|
+
|
|
206
|
+
if (!responseHeaders['Content-Type']) {
|
|
207
|
+
responseHeaders['Content-Type'] = 'text/plain';
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Build the response
|
|
211
|
+
let httpResponse = `HTTP/1.1 ${response.status} ${getStatusText(response.status)}\r\n`;
|
|
212
|
+
for (const [key, value] of Object.entries(responseHeaders)) {
|
|
213
|
+
httpResponse += `${key}: ${value}\r\n`;
|
|
214
|
+
}
|
|
215
|
+
httpResponse += '\r\n';
|
|
216
|
+
|
|
217
|
+
// Send response
|
|
218
|
+
socket.write(httpResponse);
|
|
219
|
+
if (response.body) {
|
|
220
|
+
socket.write(response.body);
|
|
221
|
+
}
|
|
222
|
+
socket.end();
|
|
223
|
+
|
|
224
|
+
connectionManager.cleanupConnection(record, 'completed');
|
|
225
|
+
} catch (error) {
|
|
226
|
+
logger.error(`[${connectionId}] Error in static handler: ${error}`);
|
|
227
|
+
|
|
228
|
+
// Send error response
|
|
229
|
+
const errorResponse =
|
|
230
|
+
'HTTP/1.1 500 Internal Server Error\r\n' +
|
|
231
|
+
'Content-Type: text/plain\r\n' +
|
|
232
|
+
'Content-Length: 21\r\n' +
|
|
233
|
+
'\r\n' +
|
|
234
|
+
'Internal Server Error';
|
|
235
|
+
socket.write(errorResponse);
|
|
236
|
+
socket.end();
|
|
237
|
+
|
|
238
|
+
connectionManager.cleanupConnection(record, 'handler_error');
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// Listen for data
|
|
243
|
+
socket.on('data', handleHttpData);
|
|
244
|
+
|
|
245
|
+
// Ensure cleanup on socket close
|
|
246
|
+
socket.once('close', () => {
|
|
247
|
+
socket.removeListener('data', handleHttpData);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
convertLegacyConfigToRouteConfig
|
|
6
6
|
} from './models/types.js';
|
|
7
7
|
import type {
|
|
8
|
-
|
|
8
|
+
IHttpProxyOptions,
|
|
9
9
|
ILogger,
|
|
10
10
|
IReverseProxyConfig
|
|
11
11
|
} from './models/types.js';
|
|
@@ -16,21 +16,22 @@ import { CertificateManager } from './certificate-manager.js';
|
|
|
16
16
|
import { ConnectionPool } from './connection-pool.js';
|
|
17
17
|
import { RequestHandler, type IMetricsTracker } from './request-handler.js';
|
|
18
18
|
import { WebSocketHandler } from './websocket-handler.js';
|
|
19
|
-
import { ProxyRouter } from '../../
|
|
20
|
-
import { RouteRouter } from '../../
|
|
19
|
+
import { ProxyRouter } from '../../routing/router/index.js';
|
|
20
|
+
import { RouteRouter } from '../../routing/router/route-router.js';
|
|
21
21
|
import { FunctionCache } from './function-cache.js';
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* HttpProxy provides a reverse proxy with TLS termination, WebSocket support,
|
|
25
25
|
* automatic certificate management, and high-performance connection pooling.
|
|
26
|
+
* Handles all HTTP/HTTPS traffic including redirects, ACME challenges, and static routes.
|
|
26
27
|
*/
|
|
27
|
-
export class
|
|
28
|
+
export class HttpProxy implements IMetricsTracker {
|
|
28
29
|
// Provide a minimal JSON representation to avoid circular references during deep equality checks
|
|
29
30
|
public toJSON(): any {
|
|
30
31
|
return {};
|
|
31
32
|
}
|
|
32
33
|
// Configuration
|
|
33
|
-
public options:
|
|
34
|
+
public options: IHttpProxyOptions;
|
|
34
35
|
public routes: IRouteConfig[] = [];
|
|
35
36
|
|
|
36
37
|
// Server instances (HTTP/2 with HTTP/1 fallback)
|
|
@@ -66,9 +67,9 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
66
67
|
private logger: ILogger;
|
|
67
68
|
|
|
68
69
|
/**
|
|
69
|
-
* Creates a new
|
|
70
|
+
* Creates a new HttpProxy instance
|
|
70
71
|
*/
|
|
71
|
-
constructor(optionsArg:
|
|
72
|
+
constructor(optionsArg: IHttpProxyOptions) {
|
|
72
73
|
// Set default options
|
|
73
74
|
this.options = {
|
|
74
75
|
port: optionsArg.port,
|
|
@@ -155,7 +156,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
/**
|
|
158
|
-
* Returns the port number this
|
|
159
|
+
* Returns the port number this HttpProxy is listening on
|
|
159
160
|
* Useful for SmartProxy to determine where to forward connections
|
|
160
161
|
*/
|
|
161
162
|
public getListeningPort(): number {
|
|
@@ -202,7 +203,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
202
203
|
|
|
203
204
|
/**
|
|
204
205
|
* Returns current server metrics
|
|
205
|
-
* Useful for SmartProxy to determine which
|
|
206
|
+
* Useful for SmartProxy to determine which HttpProxy to use for load balancing
|
|
206
207
|
*/
|
|
207
208
|
public getMetrics(): any {
|
|
208
209
|
return {
|
|
@@ -259,7 +260,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
259
260
|
// Start the server
|
|
260
261
|
return new Promise((resolve) => {
|
|
261
262
|
this.httpsServer.listen(this.options.port, () => {
|
|
262
|
-
this.logger.info(`
|
|
263
|
+
this.logger.info(`HttpProxy started on port ${this.options.port}`);
|
|
263
264
|
resolve();
|
|
264
265
|
});
|
|
265
266
|
});
|
|
@@ -352,7 +353,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
352
353
|
}
|
|
353
354
|
|
|
354
355
|
/**
|
|
355
|
-
* Updates the route configurations - this is the primary method for configuring
|
|
356
|
+
* Updates the route configurations - this is the primary method for configuring HttpProxy
|
|
356
357
|
* @param routes The new route configurations to use
|
|
357
358
|
*/
|
|
358
359
|
public async updateRouteConfigs(routes: IRouteConfig[]): Promise<void> {
|
|
@@ -503,7 +504,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
503
504
|
* Stops the proxy server
|
|
504
505
|
*/
|
|
505
506
|
public async stop(): Promise<void> {
|
|
506
|
-
this.logger.info('Stopping
|
|
507
|
+
this.logger.info('Stopping HttpProxy server');
|
|
507
508
|
|
|
508
509
|
// Clear intervals
|
|
509
510
|
if (this.metricsInterval) {
|
|
@@ -534,7 +535,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
534
535
|
// Close the HTTPS server
|
|
535
536
|
return new Promise((resolve) => {
|
|
536
537
|
this.httpsServer.close(() => {
|
|
537
|
-
this.logger.info('
|
|
538
|
+
this.logger.info('HttpProxy server stopped successfully');
|
|
538
539
|
resolve();
|
|
539
540
|
});
|
|
540
541
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* HttpProxy implementation
|
|
3
3
|
*/
|
|
4
4
|
// Re-export models
|
|
5
5
|
export * from './models/index.js';
|
|
6
6
|
|
|
7
|
-
// Export
|
|
8
|
-
export {
|
|
7
|
+
// Export HttpProxy and supporting classes
|
|
8
|
+
export { HttpProxy } from './http-proxy.js';
|
|
9
9
|
export { CertificateManager } from './certificate-manager.js';
|
|
10
10
|
export { ConnectionPool } from './connection-pool.js';
|
|
11
11
|
export { RequestHandler } from './request-handler.js';
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import * as plugins from '../../../plugins.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* HTTP-specific event types
|
|
5
|
+
*/
|
|
6
|
+
export enum HttpEvents {
|
|
7
|
+
REQUEST_RECEIVED = 'request-received',
|
|
8
|
+
REQUEST_FORWARDED = 'request-forwarded',
|
|
9
|
+
REQUEST_HANDLED = 'request-handled',
|
|
10
|
+
REQUEST_ERROR = 'request-error',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* HTTP status codes as an enum for better type safety
|
|
15
|
+
*/
|
|
16
|
+
export enum HttpStatus {
|
|
17
|
+
OK = 200,
|
|
18
|
+
MOVED_PERMANENTLY = 301,
|
|
19
|
+
FOUND = 302,
|
|
20
|
+
TEMPORARY_REDIRECT = 307,
|
|
21
|
+
PERMANENT_REDIRECT = 308,
|
|
22
|
+
BAD_REQUEST = 400,
|
|
23
|
+
UNAUTHORIZED = 401,
|
|
24
|
+
FORBIDDEN = 403,
|
|
25
|
+
NOT_FOUND = 404,
|
|
26
|
+
METHOD_NOT_ALLOWED = 405,
|
|
27
|
+
REQUEST_TIMEOUT = 408,
|
|
28
|
+
TOO_MANY_REQUESTS = 429,
|
|
29
|
+
INTERNAL_SERVER_ERROR = 500,
|
|
30
|
+
NOT_IMPLEMENTED = 501,
|
|
31
|
+
BAD_GATEWAY = 502,
|
|
32
|
+
SERVICE_UNAVAILABLE = 503,
|
|
33
|
+
GATEWAY_TIMEOUT = 504,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Base error class for HTTP-related errors
|
|
38
|
+
*/
|
|
39
|
+
export class HttpError extends Error {
|
|
40
|
+
constructor(message: string, public readonly statusCode: HttpStatus = HttpStatus.INTERNAL_SERVER_ERROR) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = 'HttpError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Error related to certificate operations
|
|
48
|
+
*/
|
|
49
|
+
export class CertificateError extends HttpError {
|
|
50
|
+
constructor(
|
|
51
|
+
message: string,
|
|
52
|
+
public readonly domain: string,
|
|
53
|
+
public readonly isRenewal: boolean = false
|
|
54
|
+
) {
|
|
55
|
+
super(`${message} for domain ${domain}${isRenewal ? ' (renewal)' : ''}`, HttpStatus.INTERNAL_SERVER_ERROR);
|
|
56
|
+
this.name = 'CertificateError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Error related to server operations
|
|
62
|
+
*/
|
|
63
|
+
export class ServerError extends HttpError {
|
|
64
|
+
constructor(message: string, public readonly code?: string, statusCode: HttpStatus = HttpStatus.INTERNAL_SERVER_ERROR) {
|
|
65
|
+
super(message, statusCode);
|
|
66
|
+
this.name = 'ServerError';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Error for bad requests
|
|
72
|
+
*/
|
|
73
|
+
export class BadRequestError extends HttpError {
|
|
74
|
+
constructor(message: string) {
|
|
75
|
+
super(message, HttpStatus.BAD_REQUEST);
|
|
76
|
+
this.name = 'BadRequestError';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Error for not found resources
|
|
82
|
+
*/
|
|
83
|
+
export class NotFoundError extends HttpError {
|
|
84
|
+
constructor(message: string = 'Resource not found') {
|
|
85
|
+
super(message, HttpStatus.NOT_FOUND);
|
|
86
|
+
this.name = 'NotFoundError';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Redirect configuration for HTTP requests
|
|
92
|
+
*/
|
|
93
|
+
export interface IRedirectConfig {
|
|
94
|
+
source: string; // Source path or pattern
|
|
95
|
+
destination: string; // Destination URL
|
|
96
|
+
type: HttpStatus; // Redirect status code
|
|
97
|
+
preserveQuery?: boolean; // Whether to preserve query parameters
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* HTTP router configuration
|
|
102
|
+
*/
|
|
103
|
+
export interface IRouterConfig {
|
|
104
|
+
routes: Array<{
|
|
105
|
+
path: string;
|
|
106
|
+
method?: string;
|
|
107
|
+
handler: (req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse) => void | Promise<void>;
|
|
108
|
+
}>;
|
|
109
|
+
notFoundHandler?: (req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse) => void;
|
|
110
|
+
errorHandler?: (error: Error, req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse) => void;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* HTTP request method types
|
|
115
|
+
*/
|
|
116
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'CONNECT' | 'TRACE';
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Helper function to get HTTP status text
|
|
120
|
+
*/
|
|
121
|
+
export function getStatusText(status: HttpStatus): string {
|
|
122
|
+
const statusTexts: Record<HttpStatus, string> = {
|
|
123
|
+
[HttpStatus.OK]: 'OK',
|
|
124
|
+
[HttpStatus.MOVED_PERMANENTLY]: 'Moved Permanently',
|
|
125
|
+
[HttpStatus.FOUND]: 'Found',
|
|
126
|
+
[HttpStatus.TEMPORARY_REDIRECT]: 'Temporary Redirect',
|
|
127
|
+
[HttpStatus.PERMANENT_REDIRECT]: 'Permanent Redirect',
|
|
128
|
+
[HttpStatus.BAD_REQUEST]: 'Bad Request',
|
|
129
|
+
[HttpStatus.UNAUTHORIZED]: 'Unauthorized',
|
|
130
|
+
[HttpStatus.FORBIDDEN]: 'Forbidden',
|
|
131
|
+
[HttpStatus.NOT_FOUND]: 'Not Found',
|
|
132
|
+
[HttpStatus.METHOD_NOT_ALLOWED]: 'Method Not Allowed',
|
|
133
|
+
[HttpStatus.REQUEST_TIMEOUT]: 'Request Timeout',
|
|
134
|
+
[HttpStatus.TOO_MANY_REQUESTS]: 'Too Many Requests',
|
|
135
|
+
[HttpStatus.INTERNAL_SERVER_ERROR]: 'Internal Server Error',
|
|
136
|
+
[HttpStatus.NOT_IMPLEMENTED]: 'Not Implemented',
|
|
137
|
+
[HttpStatus.BAD_GATEWAY]: 'Bad Gateway',
|
|
138
|
+
[HttpStatus.SERVICE_UNAVAILABLE]: 'Service Unavailable',
|
|
139
|
+
[HttpStatus.GATEWAY_TIMEOUT]: 'Gateway Timeout',
|
|
140
|
+
};
|
|
141
|
+
return statusTexts[status] || 'Unknown';
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Legacy interfaces for backward compatibility
|
|
145
|
+
export interface IDomainOptions {
|
|
146
|
+
domainName: string;
|
|
147
|
+
sslRedirect: boolean;
|
|
148
|
+
acmeMaintenance: boolean;
|
|
149
|
+
forward?: { ip: string; port: number };
|
|
150
|
+
acmeForward?: { ip: string; port: number };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface IDomainCertificate {
|
|
154
|
+
options: IDomainOptions;
|
|
155
|
+
certObtained: boolean;
|
|
156
|
+
obtainingInProgress: boolean;
|
|
157
|
+
certificate?: string;
|
|
158
|
+
privateKey?: string;
|
|
159
|
+
expiryDate?: Date;
|
|
160
|
+
lastRenewalAttempt?: Date;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Backward compatibility exports
|
|
164
|
+
export { HttpError as Port80HandlerError };
|
|
165
|
+
export { CertificateError as CertError };
|
|
@@ -16,9 +16,9 @@ import type { IRouteConfig } from '../../smart-proxy/models/route-types.js';
|
|
|
16
16
|
import type { IRouteContext } from '../../../core/models/route-context.js';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
* Configuration options for
|
|
19
|
+
* Configuration options for HttpProxy
|
|
20
20
|
*/
|
|
21
|
-
export interface
|
|
21
|
+
export interface IHttpProxyOptions {
|
|
22
22
|
port: number;
|
|
23
23
|
maxConnections?: number;
|
|
24
24
|
keepAliveTimeout?: number;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
2
|
import '../../core/models/socket-augmentation.js';
|
|
3
3
|
import {
|
|
4
|
-
type
|
|
4
|
+
type IHttpProxyOptions,
|
|
5
5
|
type ILogger,
|
|
6
6
|
createLogger,
|
|
7
7
|
type IReverseProxyConfig,
|
|
8
8
|
RouteManager
|
|
9
9
|
} from './models/types.js';
|
|
10
10
|
import { ConnectionPool } from './connection-pool.js';
|
|
11
|
-
import { ProxyRouter } from '../../
|
|
11
|
+
import { ProxyRouter } from '../../routing/router/index.js';
|
|
12
12
|
import { ContextCreator } from './context-creator.js';
|
|
13
13
|
import { HttpRequestHandler } from './http-request-handler.js';
|
|
14
14
|
import { Http2RequestHandler } from './http2-request-handler.js';
|
|
@@ -46,7 +46,7 @@ export class RequestHandler {
|
|
|
46
46
|
public securityManager: SecurityManager;
|
|
47
47
|
|
|
48
48
|
constructor(
|
|
49
|
-
private options:
|
|
49
|
+
private options: IHttpProxyOptions,
|
|
50
50
|
private connectionPool: ConnectionPool,
|
|
51
51
|
private legacyRouter: ProxyRouter, // Legacy router for backward compatibility
|
|
52
52
|
private routeManager?: RouteManager,
|