@push.rocks/smartproxy 21.0.0 → 21.1.1

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.
Files changed (146) hide show
  1. package/changelog.md +18 -0
  2. package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
  3. package/dist_ts/core/utils/proxy-protocol.js +13 -97
  4. package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
  5. package/dist_ts/core/utils/websocket-utils.js +10 -66
  6. package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
  7. package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
  8. package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
  9. package/dist_ts/detection/detectors/http-detector.js +89 -0
  10. package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
  11. package/dist_ts/detection/detectors/quick-detector.js +131 -0
  12. package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
  13. package/dist_ts/detection/detectors/routing-extractor.js +122 -0
  14. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
  15. package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
  16. package/dist_ts/detection/detectors/tls-detector.d.ts +55 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +206 -0
  18. package/dist_ts/detection/index.d.ts +17 -0
  19. package/dist_ts/detection/index.js +22 -0
  20. package/dist_ts/detection/models/detection-types.d.ts +87 -0
  21. package/dist_ts/detection/models/detection-types.js +5 -0
  22. package/dist_ts/detection/models/interfaces.d.ts +97 -0
  23. package/dist_ts/detection/models/interfaces.js +5 -0
  24. package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
  25. package/dist_ts/detection/protocol-detector-v2.js +116 -0
  26. package/dist_ts/detection/protocol-detector.d.ts +74 -0
  27. package/dist_ts/detection/protocol-detector.js +173 -0
  28. package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
  29. package/dist_ts/detection/utils/buffer-utils.js +127 -0
  30. package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
  31. package/dist_ts/detection/utils/fragment-manager.js +53 -0
  32. package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
  33. package/dist_ts/detection/utils/parser-utils.js +63 -0
  34. package/dist_ts/index.d.ts +2 -0
  35. package/dist_ts/index.js +3 -1
  36. package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
  37. package/dist_ts/protocols/common/fragment-handler.js +117 -0
  38. package/dist_ts/protocols/common/index.d.ts +7 -0
  39. package/dist_ts/protocols/common/index.js +8 -0
  40. package/dist_ts/protocols/common/types.d.ts +68 -0
  41. package/dist_ts/protocols/common/types.js +7 -0
  42. package/dist_ts/protocols/http/constants.d.ts +119 -0
  43. package/dist_ts/protocols/http/constants.js +200 -0
  44. package/dist_ts/protocols/http/index.d.ts +7 -0
  45. package/dist_ts/protocols/http/index.js +8 -0
  46. package/dist_ts/protocols/http/parser.d.ts +58 -0
  47. package/dist_ts/protocols/http/parser.js +184 -0
  48. package/dist_ts/protocols/http/types.d.ts +62 -0
  49. package/dist_ts/protocols/http/types.js +5 -0
  50. package/dist_ts/protocols/index.d.ts +11 -0
  51. package/dist_ts/protocols/index.js +12 -0
  52. package/dist_ts/protocols/proxy/index.d.ts +6 -0
  53. package/dist_ts/protocols/proxy/index.js +7 -0
  54. package/dist_ts/protocols/proxy/parser.d.ts +44 -0
  55. package/dist_ts/protocols/proxy/parser.js +153 -0
  56. package/dist_ts/protocols/proxy/types.d.ts +47 -0
  57. package/dist_ts/protocols/proxy/types.js +6 -0
  58. package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
  59. package/dist_ts/protocols/tls/alerts/index.js +5 -0
  60. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
  61. package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
  62. package/dist_ts/protocols/tls/constants.d.ts +122 -0
  63. package/dist_ts/protocols/tls/constants.js +135 -0
  64. package/dist_ts/protocols/tls/index.d.ts +12 -0
  65. package/dist_ts/protocols/tls/index.js +27 -0
  66. package/dist_ts/protocols/tls/parser.d.ts +53 -0
  67. package/dist_ts/protocols/tls/parser.js +294 -0
  68. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
  69. package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
  70. package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
  71. package/dist_ts/protocols/tls/sni/index.js +6 -0
  72. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
  73. package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
  74. package/dist_ts/protocols/tls/types.d.ts +65 -0
  75. package/dist_ts/protocols/tls/types.js +5 -0
  76. package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
  77. package/dist_ts/protocols/tls/utils/index.js +5 -0
  78. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
  79. package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
  80. package/dist_ts/protocols/websocket/constants.d.ts +55 -0
  81. package/dist_ts/protocols/websocket/constants.js +58 -0
  82. package/dist_ts/protocols/websocket/index.d.ts +7 -0
  83. package/dist_ts/protocols/websocket/index.js +8 -0
  84. package/dist_ts/protocols/websocket/types.d.ts +47 -0
  85. package/dist_ts/protocols/websocket/types.js +5 -0
  86. package/dist_ts/protocols/websocket/utils.d.ts +25 -0
  87. package/dist_ts/protocols/websocket/utils.js +103 -0
  88. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
  89. package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
  90. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
  91. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  92. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  93. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
  94. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
  95. package/dist_ts/tls/index.d.ts +5 -7
  96. package/dist_ts/tls/index.js +8 -11
  97. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  98. package/dist_ts/tls/sni/sni-handler.js +4 -4
  99. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  100. package/dist_ts/tls/utils/tls-utils.js +4 -116
  101. package/package.json +1 -1
  102. package/readme.plan.md +0 -0
  103. package/ts/core/utils/proxy-protocol.ts +14 -131
  104. package/ts/core/utils/websocket-utils.ts +12 -60
  105. package/ts/detection/detectors/http-detector.ts +114 -0
  106. package/ts/detection/detectors/quick-detector.ts +148 -0
  107. package/ts/detection/detectors/routing-extractor.ts +147 -0
  108. package/ts/detection/detectors/tls-detector.ts +252 -0
  109. package/ts/detection/index.ts +25 -0
  110. package/ts/detection/models/detection-types.ts +102 -0
  111. package/ts/detection/models/interfaces.ts +115 -0
  112. package/ts/detection/protocol-detector.ts +230 -0
  113. package/ts/detection/utils/buffer-utils.ts +141 -0
  114. package/ts/detection/utils/fragment-manager.ts +64 -0
  115. package/ts/detection/utils/parser-utils.ts +77 -0
  116. package/ts/index.ts +3 -1
  117. package/ts/protocols/common/fragment-handler.ts +163 -0
  118. package/ts/protocols/common/index.ts +8 -0
  119. package/ts/protocols/common/types.ts +76 -0
  120. package/ts/protocols/http/constants.ts +219 -0
  121. package/ts/protocols/http/index.ts +8 -0
  122. package/ts/protocols/http/parser.ts +219 -0
  123. package/ts/protocols/http/types.ts +70 -0
  124. package/ts/protocols/index.ts +12 -0
  125. package/ts/protocols/proxy/index.ts +7 -0
  126. package/ts/protocols/proxy/parser.ts +183 -0
  127. package/ts/protocols/proxy/types.ts +53 -0
  128. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  129. package/ts/protocols/tls/index.ts +37 -0
  130. package/ts/protocols/tls/sni/index.ts +6 -0
  131. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  132. package/ts/protocols/websocket/constants.ts +60 -0
  133. package/ts/protocols/websocket/index.ts +8 -0
  134. package/ts/protocols/websocket/types.ts +53 -0
  135. package/ts/protocols/websocket/utils.ts +98 -0
  136. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  137. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
  138. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  139. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  140. package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
  141. package/ts/tls/index.ts +8 -12
  142. package/ts/tls/sni/sni-handler.ts +3 -3
  143. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  144. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  145. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  146. /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
@@ -1,113 +1,4 @@
1
- /**
2
- * TLS record types as defined in various RFCs
3
- */
4
- export declare enum TlsRecordType {
5
- CHANGE_CIPHER_SPEC = 20,
6
- ALERT = 21,
7
- HANDSHAKE = 22,
8
- APPLICATION_DATA = 23,
9
- HEARTBEAT = 24
10
- }
11
- /**
12
- * TLS handshake message types
13
- */
14
- export declare enum TlsHandshakeType {
15
- HELLO_REQUEST = 0,
16
- CLIENT_HELLO = 1,
17
- SERVER_HELLO = 2,
18
- NEW_SESSION_TICKET = 4,
19
- ENCRYPTED_EXTENSIONS = 8,// TLS 1.3
20
- CERTIFICATE = 11,
21
- SERVER_KEY_EXCHANGE = 12,
22
- CERTIFICATE_REQUEST = 13,
23
- SERVER_HELLO_DONE = 14,
24
- CERTIFICATE_VERIFY = 15,
25
- CLIENT_KEY_EXCHANGE = 16,
26
- FINISHED = 20
27
- }
28
- /**
29
- * TLS extension types
30
- */
31
- export declare enum TlsExtensionType {
32
- SERVER_NAME = 0,// SNI
33
- MAX_FRAGMENT_LENGTH = 1,
34
- CLIENT_CERTIFICATE_URL = 2,
35
- TRUSTED_CA_KEYS = 3,
36
- TRUNCATED_HMAC = 4,
37
- STATUS_REQUEST = 5,// OCSP
38
- SUPPORTED_GROUPS = 10,// Previously named "elliptic_curves"
39
- EC_POINT_FORMATS = 11,
40
- SIGNATURE_ALGORITHMS = 13,
41
- APPLICATION_LAYER_PROTOCOL_NEGOTIATION = 16,// ALPN
42
- SIGNED_CERTIFICATE_TIMESTAMP = 18,// Certificate Transparency
43
- PADDING = 21,
44
- SESSION_TICKET = 35,
45
- PRE_SHARED_KEY = 41,// TLS 1.3
46
- EARLY_DATA = 42,// TLS 1.3 0-RTT
47
- SUPPORTED_VERSIONS = 43,// TLS 1.3
48
- COOKIE = 44,// TLS 1.3
49
- PSK_KEY_EXCHANGE_MODES = 45,// TLS 1.3
50
- CERTIFICATE_AUTHORITIES = 47,// TLS 1.3
51
- POST_HANDSHAKE_AUTH = 49,// TLS 1.3
52
- SIGNATURE_ALGORITHMS_CERT = 50,// TLS 1.3
53
- KEY_SHARE = 51
54
- }
55
- /**
56
- * TLS alert levels
57
- */
58
- export declare enum TlsAlertLevel {
59
- WARNING = 1,
60
- FATAL = 2
61
- }
62
- /**
63
- * TLS alert description codes
64
- */
65
- export declare enum TlsAlertDescription {
66
- CLOSE_NOTIFY = 0,
67
- UNEXPECTED_MESSAGE = 10,
68
- BAD_RECORD_MAC = 20,
69
- DECRYPTION_FAILED = 21,// TLS 1.0 only
70
- RECORD_OVERFLOW = 22,
71
- DECOMPRESSION_FAILURE = 30,// TLS 1.2 and below
72
- HANDSHAKE_FAILURE = 40,
73
- NO_CERTIFICATE = 41,// SSLv3 only
74
- BAD_CERTIFICATE = 42,
75
- UNSUPPORTED_CERTIFICATE = 43,
76
- CERTIFICATE_REVOKED = 44,
77
- CERTIFICATE_EXPIRED = 45,
78
- CERTIFICATE_UNKNOWN = 46,
79
- ILLEGAL_PARAMETER = 47,
80
- UNKNOWN_CA = 48,
81
- ACCESS_DENIED = 49,
82
- DECODE_ERROR = 50,
83
- DECRYPT_ERROR = 51,
84
- EXPORT_RESTRICTION = 60,// TLS 1.0 only
85
- PROTOCOL_VERSION = 70,
86
- INSUFFICIENT_SECURITY = 71,
87
- INTERNAL_ERROR = 80,
88
- INAPPROPRIATE_FALLBACK = 86,
89
- USER_CANCELED = 90,
90
- NO_RENEGOTIATION = 100,// TLS 1.2 and below
91
- MISSING_EXTENSION = 109,// TLS 1.3
92
- UNSUPPORTED_EXTENSION = 110,// TLS 1.3
93
- CERTIFICATE_REQUIRED = 111,// TLS 1.3
94
- UNRECOGNIZED_NAME = 112,
95
- BAD_CERTIFICATE_STATUS_RESPONSE = 113,
96
- BAD_CERTIFICATE_HASH_VALUE = 114,// TLS 1.2 and below
97
- UNKNOWN_PSK_IDENTITY = 115,
98
- CERTIFICATE_REQUIRED_1_3 = 116,// TLS 1.3
99
- NO_APPLICATION_PROTOCOL = 120
100
- }
101
- /**
102
- * TLS version codes (major.minor)
103
- */
104
- export declare const TlsVersion: {
105
- SSL3: number[];
106
- TLS1_0: number[];
107
- TLS1_1: number[];
108
- TLS1_2: number[];
109
- TLS1_3: number[];
110
- };
1
+ export { TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../../protocols/tls/index.js';
111
2
  /**
112
3
  * Utility functions for TLS protocol operations
113
4
  */
@@ -1,119 +1,7 @@
1
1
  import * as plugins from '../../plugins.js';
2
- /**
3
- * TLS record types as defined in various RFCs
4
- */
5
- export var TlsRecordType;
6
- (function (TlsRecordType) {
7
- TlsRecordType[TlsRecordType["CHANGE_CIPHER_SPEC"] = 20] = "CHANGE_CIPHER_SPEC";
8
- TlsRecordType[TlsRecordType["ALERT"] = 21] = "ALERT";
9
- TlsRecordType[TlsRecordType["HANDSHAKE"] = 22] = "HANDSHAKE";
10
- TlsRecordType[TlsRecordType["APPLICATION_DATA"] = 23] = "APPLICATION_DATA";
11
- TlsRecordType[TlsRecordType["HEARTBEAT"] = 24] = "HEARTBEAT";
12
- })(TlsRecordType || (TlsRecordType = {}));
13
- /**
14
- * TLS handshake message types
15
- */
16
- export var TlsHandshakeType;
17
- (function (TlsHandshakeType) {
18
- TlsHandshakeType[TlsHandshakeType["HELLO_REQUEST"] = 0] = "HELLO_REQUEST";
19
- TlsHandshakeType[TlsHandshakeType["CLIENT_HELLO"] = 1] = "CLIENT_HELLO";
20
- TlsHandshakeType[TlsHandshakeType["SERVER_HELLO"] = 2] = "SERVER_HELLO";
21
- TlsHandshakeType[TlsHandshakeType["NEW_SESSION_TICKET"] = 4] = "NEW_SESSION_TICKET";
22
- TlsHandshakeType[TlsHandshakeType["ENCRYPTED_EXTENSIONS"] = 8] = "ENCRYPTED_EXTENSIONS";
23
- TlsHandshakeType[TlsHandshakeType["CERTIFICATE"] = 11] = "CERTIFICATE";
24
- TlsHandshakeType[TlsHandshakeType["SERVER_KEY_EXCHANGE"] = 12] = "SERVER_KEY_EXCHANGE";
25
- TlsHandshakeType[TlsHandshakeType["CERTIFICATE_REQUEST"] = 13] = "CERTIFICATE_REQUEST";
26
- TlsHandshakeType[TlsHandshakeType["SERVER_HELLO_DONE"] = 14] = "SERVER_HELLO_DONE";
27
- TlsHandshakeType[TlsHandshakeType["CERTIFICATE_VERIFY"] = 15] = "CERTIFICATE_VERIFY";
28
- TlsHandshakeType[TlsHandshakeType["CLIENT_KEY_EXCHANGE"] = 16] = "CLIENT_KEY_EXCHANGE";
29
- TlsHandshakeType[TlsHandshakeType["FINISHED"] = 20] = "FINISHED";
30
- })(TlsHandshakeType || (TlsHandshakeType = {}));
31
- /**
32
- * TLS extension types
33
- */
34
- export var TlsExtensionType;
35
- (function (TlsExtensionType) {
36
- TlsExtensionType[TlsExtensionType["SERVER_NAME"] = 0] = "SERVER_NAME";
37
- TlsExtensionType[TlsExtensionType["MAX_FRAGMENT_LENGTH"] = 1] = "MAX_FRAGMENT_LENGTH";
38
- TlsExtensionType[TlsExtensionType["CLIENT_CERTIFICATE_URL"] = 2] = "CLIENT_CERTIFICATE_URL";
39
- TlsExtensionType[TlsExtensionType["TRUSTED_CA_KEYS"] = 3] = "TRUSTED_CA_KEYS";
40
- TlsExtensionType[TlsExtensionType["TRUNCATED_HMAC"] = 4] = "TRUNCATED_HMAC";
41
- TlsExtensionType[TlsExtensionType["STATUS_REQUEST"] = 5] = "STATUS_REQUEST";
42
- TlsExtensionType[TlsExtensionType["SUPPORTED_GROUPS"] = 10] = "SUPPORTED_GROUPS";
43
- TlsExtensionType[TlsExtensionType["EC_POINT_FORMATS"] = 11] = "EC_POINT_FORMATS";
44
- TlsExtensionType[TlsExtensionType["SIGNATURE_ALGORITHMS"] = 13] = "SIGNATURE_ALGORITHMS";
45
- TlsExtensionType[TlsExtensionType["APPLICATION_LAYER_PROTOCOL_NEGOTIATION"] = 16] = "APPLICATION_LAYER_PROTOCOL_NEGOTIATION";
46
- TlsExtensionType[TlsExtensionType["SIGNED_CERTIFICATE_TIMESTAMP"] = 18] = "SIGNED_CERTIFICATE_TIMESTAMP";
47
- TlsExtensionType[TlsExtensionType["PADDING"] = 21] = "PADDING";
48
- TlsExtensionType[TlsExtensionType["SESSION_TICKET"] = 35] = "SESSION_TICKET";
49
- TlsExtensionType[TlsExtensionType["PRE_SHARED_KEY"] = 41] = "PRE_SHARED_KEY";
50
- TlsExtensionType[TlsExtensionType["EARLY_DATA"] = 42] = "EARLY_DATA";
51
- TlsExtensionType[TlsExtensionType["SUPPORTED_VERSIONS"] = 43] = "SUPPORTED_VERSIONS";
52
- TlsExtensionType[TlsExtensionType["COOKIE"] = 44] = "COOKIE";
53
- TlsExtensionType[TlsExtensionType["PSK_KEY_EXCHANGE_MODES"] = 45] = "PSK_KEY_EXCHANGE_MODES";
54
- TlsExtensionType[TlsExtensionType["CERTIFICATE_AUTHORITIES"] = 47] = "CERTIFICATE_AUTHORITIES";
55
- TlsExtensionType[TlsExtensionType["POST_HANDSHAKE_AUTH"] = 49] = "POST_HANDSHAKE_AUTH";
56
- TlsExtensionType[TlsExtensionType["SIGNATURE_ALGORITHMS_CERT"] = 50] = "SIGNATURE_ALGORITHMS_CERT";
57
- TlsExtensionType[TlsExtensionType["KEY_SHARE"] = 51] = "KEY_SHARE";
58
- })(TlsExtensionType || (TlsExtensionType = {}));
59
- /**
60
- * TLS alert levels
61
- */
62
- export var TlsAlertLevel;
63
- (function (TlsAlertLevel) {
64
- TlsAlertLevel[TlsAlertLevel["WARNING"] = 1] = "WARNING";
65
- TlsAlertLevel[TlsAlertLevel["FATAL"] = 2] = "FATAL";
66
- })(TlsAlertLevel || (TlsAlertLevel = {}));
67
- /**
68
- * TLS alert description codes
69
- */
70
- export var TlsAlertDescription;
71
- (function (TlsAlertDescription) {
72
- TlsAlertDescription[TlsAlertDescription["CLOSE_NOTIFY"] = 0] = "CLOSE_NOTIFY";
73
- TlsAlertDescription[TlsAlertDescription["UNEXPECTED_MESSAGE"] = 10] = "UNEXPECTED_MESSAGE";
74
- TlsAlertDescription[TlsAlertDescription["BAD_RECORD_MAC"] = 20] = "BAD_RECORD_MAC";
75
- TlsAlertDescription[TlsAlertDescription["DECRYPTION_FAILED"] = 21] = "DECRYPTION_FAILED";
76
- TlsAlertDescription[TlsAlertDescription["RECORD_OVERFLOW"] = 22] = "RECORD_OVERFLOW";
77
- TlsAlertDescription[TlsAlertDescription["DECOMPRESSION_FAILURE"] = 30] = "DECOMPRESSION_FAILURE";
78
- TlsAlertDescription[TlsAlertDescription["HANDSHAKE_FAILURE"] = 40] = "HANDSHAKE_FAILURE";
79
- TlsAlertDescription[TlsAlertDescription["NO_CERTIFICATE"] = 41] = "NO_CERTIFICATE";
80
- TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE"] = 42] = "BAD_CERTIFICATE";
81
- TlsAlertDescription[TlsAlertDescription["UNSUPPORTED_CERTIFICATE"] = 43] = "UNSUPPORTED_CERTIFICATE";
82
- TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REVOKED"] = 44] = "CERTIFICATE_REVOKED";
83
- TlsAlertDescription[TlsAlertDescription["CERTIFICATE_EXPIRED"] = 45] = "CERTIFICATE_EXPIRED";
84
- TlsAlertDescription[TlsAlertDescription["CERTIFICATE_UNKNOWN"] = 46] = "CERTIFICATE_UNKNOWN";
85
- TlsAlertDescription[TlsAlertDescription["ILLEGAL_PARAMETER"] = 47] = "ILLEGAL_PARAMETER";
86
- TlsAlertDescription[TlsAlertDescription["UNKNOWN_CA"] = 48] = "UNKNOWN_CA";
87
- TlsAlertDescription[TlsAlertDescription["ACCESS_DENIED"] = 49] = "ACCESS_DENIED";
88
- TlsAlertDescription[TlsAlertDescription["DECODE_ERROR"] = 50] = "DECODE_ERROR";
89
- TlsAlertDescription[TlsAlertDescription["DECRYPT_ERROR"] = 51] = "DECRYPT_ERROR";
90
- TlsAlertDescription[TlsAlertDescription["EXPORT_RESTRICTION"] = 60] = "EXPORT_RESTRICTION";
91
- TlsAlertDescription[TlsAlertDescription["PROTOCOL_VERSION"] = 70] = "PROTOCOL_VERSION";
92
- TlsAlertDescription[TlsAlertDescription["INSUFFICIENT_SECURITY"] = 71] = "INSUFFICIENT_SECURITY";
93
- TlsAlertDescription[TlsAlertDescription["INTERNAL_ERROR"] = 80] = "INTERNAL_ERROR";
94
- TlsAlertDescription[TlsAlertDescription["INAPPROPRIATE_FALLBACK"] = 86] = "INAPPROPRIATE_FALLBACK";
95
- TlsAlertDescription[TlsAlertDescription["USER_CANCELED"] = 90] = "USER_CANCELED";
96
- TlsAlertDescription[TlsAlertDescription["NO_RENEGOTIATION"] = 100] = "NO_RENEGOTIATION";
97
- TlsAlertDescription[TlsAlertDescription["MISSING_EXTENSION"] = 109] = "MISSING_EXTENSION";
98
- TlsAlertDescription[TlsAlertDescription["UNSUPPORTED_EXTENSION"] = 110] = "UNSUPPORTED_EXTENSION";
99
- TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REQUIRED"] = 111] = "CERTIFICATE_REQUIRED";
100
- TlsAlertDescription[TlsAlertDescription["UNRECOGNIZED_NAME"] = 112] = "UNRECOGNIZED_NAME";
101
- TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE_STATUS_RESPONSE"] = 113] = "BAD_CERTIFICATE_STATUS_RESPONSE";
102
- TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE_HASH_VALUE"] = 114] = "BAD_CERTIFICATE_HASH_VALUE";
103
- TlsAlertDescription[TlsAlertDescription["UNKNOWN_PSK_IDENTITY"] = 115] = "UNKNOWN_PSK_IDENTITY";
104
- TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REQUIRED_1_3"] = 116] = "CERTIFICATE_REQUIRED_1_3";
105
- TlsAlertDescription[TlsAlertDescription["NO_APPLICATION_PROTOCOL"] = 120] = "NO_APPLICATION_PROTOCOL";
106
- })(TlsAlertDescription || (TlsAlertDescription = {}));
107
- /**
108
- * TLS version codes (major.minor)
109
- */
110
- export const TlsVersion = {
111
- SSL3: [0x03, 0x00],
112
- TLS1_0: [0x03, 0x01],
113
- TLS1_1: [0x03, 0x02],
114
- TLS1_2: [0x03, 0x03],
115
- TLS1_3: [0x03, 0x04],
116
- };
2
+ import { TlsRecordType, TlsHandshakeType } from '../../protocols/tls/index.js';
3
+ // Re-export from protocols for backward compatibility
4
+ export { TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../../protocols/tls/index.js';
117
5
  /**
118
6
  * Utility functions for TLS protocol operations
119
7
  */
@@ -184,4 +72,4 @@ export class TlsUtils {
184
72
  return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
185
73
  }
186
74
  }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvdGxzL3V0aWxzL3Rscy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksYUFNWDtBQU5ELFdBQVksYUFBYTtJQUN2Qiw4RUFBdUIsQ0FBQTtJQUN2QixvREFBVSxDQUFBO0lBQ1YsNERBQWMsQ0FBQTtJQUNkLDBFQUFxQixDQUFBO0lBQ3JCLDREQUFjLENBQUE7QUFDaEIsQ0FBQyxFQU5XLGFBQWEsS0FBYixhQUFhLFFBTXhCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxnQkFhWDtBQWJELFdBQVksZ0JBQWdCO0lBQzFCLHlFQUFpQixDQUFBO0lBQ2pCLHVFQUFnQixDQUFBO0lBQ2hCLHVFQUFnQixDQUFBO0lBQ2hCLG1GQUFzQixDQUFBO0lBQ3RCLHVGQUF3QixDQUFBO0lBQ3hCLHNFQUFnQixDQUFBO0lBQ2hCLHNGQUF3QixDQUFBO0lBQ3hCLHNGQUF3QixDQUFBO0lBQ3hCLGtGQUFzQixDQUFBO0lBQ3RCLG9GQUF1QixDQUFBO0lBQ3ZCLHNGQUF3QixDQUFBO0lBQ3hCLGdFQUFhLENBQUE7QUFDZixDQUFDLEVBYlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQWEzQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksZ0JBdUJYO0FBdkJELFdBQVksZ0JBQWdCO0lBQzFCLHFFQUFlLENBQUE7SUFDZixxRkFBdUIsQ0FBQTtJQUN2QiwyRkFBMEIsQ0FBQTtJQUMxQiw2RUFBbUIsQ0FBQTtJQUNuQiwyRUFBa0IsQ0FBQTtJQUNsQiwyRUFBa0IsQ0FBQTtJQUNsQixnRkFBcUIsQ0FBQTtJQUNyQixnRkFBcUIsQ0FBQTtJQUNyQix3RkFBeUIsQ0FBQTtJQUN6Qiw0SEFBMkMsQ0FBQTtJQUMzQyx3R0FBaUMsQ0FBQTtJQUNq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
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvdGxzL3V0aWxzL3Rscy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxzREFBc0Q7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsVUFBVSxFQUNYLE1BQU0sOEJBQThCLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNuQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFjO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBYztRQUMvQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBYztRQUN4QyxrRUFBa0U7UUFDbEUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsK0RBQStEO1FBQy9ELHdEQUF3RDtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBYztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxjQUtoQztRQUNDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxjQUFjLENBQUM7UUFDbEUsT0FBTyxHQUFHLFFBQVEsSUFBSSxVQUFVLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQzNELENBQUM7Q0FDRiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartproxy",
3
- "version": "21.0.0",
3
+ "version": "21.1.1",
4
4
  "private": false,
5
5
  "description": "A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.",
6
6
  "main": "dist_ts/index.js",
package/readme.plan.md CHANGED
Binary file
@@ -1,161 +1,44 @@
1
1
  import * as plugins from '../../plugins.js';
2
2
  import { logger } from './logger.js';
3
+ import { ProxyProtocolParser as ProtocolParser, type IProxyInfo, type IProxyParseResult } from '../../protocols/proxy/index.js';
3
4
 
4
- /**
5
- * Interface representing parsed PROXY protocol information
6
- */
7
- export interface IProxyInfo {
8
- protocol: 'TCP4' | 'TCP6' | 'UNKNOWN';
9
- sourceIP: string;
10
- sourcePort: number;
11
- destinationIP: string;
12
- destinationPort: number;
13
- }
14
-
15
- /**
16
- * Interface for parse result including remaining data
17
- */
18
- export interface IProxyParseResult {
19
- proxyInfo: IProxyInfo | null;
20
- remainingData: Buffer;
21
- }
5
+ // Re-export types from protocols for backward compatibility
6
+ export type { IProxyInfo, IProxyParseResult } from '../../protocols/proxy/index.js';
22
7
 
23
8
  /**
24
9
  * Parser for PROXY protocol v1 (text format)
25
10
  * Spec: https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
11
+ *
12
+ * This class now delegates to the protocol parser but adds
13
+ * smartproxy-specific features like socket reading and logging
26
14
  */
27
15
  export class ProxyProtocolParser {
28
- static readonly PROXY_V1_SIGNATURE = 'PROXY ';
29
- static readonly MAX_HEADER_LENGTH = 107; // Max length for v1 header
30
- static readonly HEADER_TERMINATOR = '\r\n';
16
+ static readonly PROXY_V1_SIGNATURE = ProtocolParser.PROXY_V1_SIGNATURE;
17
+ static readonly MAX_HEADER_LENGTH = ProtocolParser.MAX_HEADER_LENGTH;
18
+ static readonly HEADER_TERMINATOR = ProtocolParser.HEADER_TERMINATOR;
31
19
 
32
20
  /**
33
21
  * Parse PROXY protocol v1 header from buffer
34
22
  * Returns proxy info and remaining data after header
35
23
  */
36
24
  static parse(data: Buffer): IProxyParseResult {
37
- // Check if buffer starts with PROXY signature
38
- if (!data.toString('ascii', 0, 6).startsWith(this.PROXY_V1_SIGNATURE)) {
39
- return {
40
- proxyInfo: null,
41
- remainingData: data
42
- };
43
- }
44
-
45
- // Find header terminator
46
- const headerEndIndex = data.indexOf(this.HEADER_TERMINATOR);
47
- if (headerEndIndex === -1) {
48
- // Header incomplete, need more data
49
- if (data.length > this.MAX_HEADER_LENGTH) {
50
- // Header too long, invalid
51
- throw new Error('PROXY protocol header exceeds maximum length');
52
- }
53
- return {
54
- proxyInfo: null,
55
- remainingData: data
56
- };
57
- }
58
-
59
- // Extract header line
60
- const headerLine = data.toString('ascii', 0, headerEndIndex);
61
- const remainingData = data.slice(headerEndIndex + 2); // Skip \r\n
62
-
63
- // Parse header
64
- const parts = headerLine.split(' ');
65
-
66
- if (parts.length < 2) {
67
- throw new Error(`Invalid PROXY protocol header format: ${headerLine}`);
68
- }
69
-
70
- const [signature, protocol] = parts;
71
-
72
- // Validate protocol
73
- if (!['TCP4', 'TCP6', 'UNKNOWN'].includes(protocol)) {
74
- throw new Error(`Invalid PROXY protocol: ${protocol}`);
75
- }
76
-
77
- // For UNKNOWN protocol, ignore addresses
78
- if (protocol === 'UNKNOWN') {
79
- return {
80
- proxyInfo: {
81
- protocol: 'UNKNOWN',
82
- sourceIP: '',
83
- sourcePort: 0,
84
- destinationIP: '',
85
- destinationPort: 0
86
- },
87
- remainingData
88
- };
89
- }
90
-
91
- // For TCP4/TCP6, we need all 6 parts
92
- if (parts.length !== 6) {
93
- throw new Error(`Invalid PROXY protocol header format: ${headerLine}`);
94
- }
95
-
96
- const [, , srcIP, dstIP, srcPort, dstPort] = parts;
97
-
98
- // Validate and parse ports
99
- const sourcePort = parseInt(srcPort, 10);
100
- const destinationPort = parseInt(dstPort, 10);
101
-
102
- if (isNaN(sourcePort) || sourcePort < 0 || sourcePort > 65535) {
103
- throw new Error(`Invalid source port: ${srcPort}`);
104
- }
105
-
106
- if (isNaN(destinationPort) || destinationPort < 0 || destinationPort > 65535) {
107
- throw new Error(`Invalid destination port: ${dstPort}`);
108
- }
109
-
110
- // Validate IP addresses
111
- const protocolType = protocol as 'TCP4' | 'TCP6' | 'UNKNOWN';
112
- if (!this.isValidIP(srcIP, protocolType)) {
113
- throw new Error(`Invalid source IP for ${protocol}: ${srcIP}`);
114
- }
115
-
116
- if (!this.isValidIP(dstIP, protocolType)) {
117
- throw new Error(`Invalid destination IP for ${protocol}: ${dstIP}`);
118
- }
119
-
120
- return {
121
- proxyInfo: {
122
- protocol: protocol as 'TCP4' | 'TCP6',
123
- sourceIP: srcIP,
124
- sourcePort,
125
- destinationIP: dstIP,
126
- destinationPort
127
- },
128
- remainingData
129
- };
25
+ // Delegate to protocol parser
26
+ return ProtocolParser.parse(data);
130
27
  }
131
28
 
132
29
  /**
133
30
  * Generate PROXY protocol v1 header
134
31
  */
135
32
  static generate(info: IProxyInfo): Buffer {
136
- if (info.protocol === 'UNKNOWN') {
137
- return Buffer.from(`PROXY UNKNOWN\r\n`, 'ascii');
138
- }
139
-
140
- const header = `PROXY ${info.protocol} ${info.sourceIP} ${info.destinationIP} ${info.sourcePort} ${info.destinationPort}\r\n`;
141
-
142
- if (header.length > this.MAX_HEADER_LENGTH) {
143
- throw new Error('Generated PROXY protocol header exceeds maximum length');
144
- }
145
-
146
- return Buffer.from(header, 'ascii');
33
+ // Delegate to protocol parser
34
+ return ProtocolParser.generate(info);
147
35
  }
148
36
 
149
37
  /**
150
38
  * Validate IP address format
151
39
  */
152
40
  private static isValidIP(ip: string, protocol: 'TCP4' | 'TCP6' | 'UNKNOWN'): boolean {
153
- if (protocol === 'TCP4') {
154
- return plugins.net.isIPv4(ip);
155
- } else if (protocol === 'TCP6') {
156
- return plugins.net.isIPv6(ip);
157
- }
158
- return false;
41
+ return ProtocolParser.isValidIP(ip, protocol);
159
42
  }
160
43
 
161
44
  /**
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * WebSocket utility functions
3
+ *
4
+ * This module provides smartproxy-specific WebSocket utilities
5
+ * and re-exports protocol utilities from the protocols module
3
6
  */
4
7
 
5
- /**
6
- * Type for WebSocket RawData that can be different types in different environments
7
- * This matches the ws library's type definition
8
- */
9
- export type RawData = Buffer | ArrayBuffer | Buffer[] | any;
8
+ // Import and re-export from protocols
9
+ import { getMessageSize as protocolGetMessageSize, toBuffer as protocolToBuffer } from '../../protocols/websocket/index.js';
10
+ export type { RawData } from '../../protocols/websocket/index.js';
10
11
 
11
12
  /**
12
13
  * Get the length of a WebSocket message regardless of its type
@@ -15,35 +16,9 @@ export type RawData = Buffer | ArrayBuffer | Buffer[] | any;
15
16
  * @param data - The data message from WebSocket (could be any RawData type)
16
17
  * @returns The length of the data in bytes
17
18
  */
18
- export function getMessageSize(data: RawData): number {
19
- if (typeof data === 'string') {
20
- // For string data, get the byte length
21
- return Buffer.from(data, 'utf8').length;
22
- } else if (data instanceof Buffer) {
23
- // For Node.js Buffer
24
- return data.length;
25
- } else if (data instanceof ArrayBuffer) {
26
- // For ArrayBuffer
27
- return data.byteLength;
28
- } else if (Array.isArray(data)) {
29
- // For array of buffers, sum their lengths
30
- return data.reduce((sum, chunk) => {
31
- if (chunk instanceof Buffer) {
32
- return sum + chunk.length;
33
- } else if (chunk instanceof ArrayBuffer) {
34
- return sum + chunk.byteLength;
35
- }
36
- return sum;
37
- }, 0);
38
- } else {
39
- // For other types, try to determine the size or return 0
40
- try {
41
- return Buffer.from(data).length;
42
- } catch (e) {
43
- console.warn('Could not determine message size', e);
44
- return 0;
45
- }
46
- }
19
+ export function getMessageSize(data: import('../../protocols/websocket/index.js').RawData): number {
20
+ // Delegate to protocol implementation
21
+ return protocolGetMessageSize(data);
47
22
  }
48
23
 
49
24
  /**
@@ -52,30 +27,7 @@ export function getMessageSize(data: RawData): number {
52
27
  * @param data - The data message from WebSocket (could be any RawData type)
53
28
  * @returns A Buffer containing the data
54
29
  */
55
- export function toBuffer(data: RawData): Buffer {
56
- if (typeof data === 'string') {
57
- return Buffer.from(data, 'utf8');
58
- } else if (data instanceof Buffer) {
59
- return data;
60
- } else if (data instanceof ArrayBuffer) {
61
- return Buffer.from(data);
62
- } else if (Array.isArray(data)) {
63
- // For array of buffers, concatenate them
64
- return Buffer.concat(data.map(chunk => {
65
- if (chunk instanceof Buffer) {
66
- return chunk;
67
- } else if (chunk instanceof ArrayBuffer) {
68
- return Buffer.from(chunk);
69
- }
70
- return Buffer.from(chunk);
71
- }));
72
- } else {
73
- // For other types, try to convert to Buffer or return empty Buffer
74
- try {
75
- return Buffer.from(data);
76
- } catch (e) {
77
- console.warn('Could not convert message to Buffer', e);
78
- return Buffer.alloc(0);
79
- }
80
- }
30
+ export function toBuffer(data: import('../../protocols/websocket/index.js').RawData): Buffer {
31
+ // Delegate to protocol implementation
32
+ return protocolToBuffer(data);
81
33
  }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * HTTP Protocol Detector
3
+ *
4
+ * Simplified HTTP detection using the new architecture
5
+ */
6
+
7
+ import type { IProtocolDetector } from '../models/interfaces.js';
8
+ import type { IDetectionResult, IDetectionOptions } from '../models/detection-types.js';
9
+ import type { IProtocolDetectionResult, IConnectionContext } from '../../protocols/common/types.js';
10
+ import type { THttpMethod } from '../../protocols/http/index.js';
11
+ import { QuickProtocolDetector } from './quick-detector.js';
12
+ import { RoutingExtractor } from './routing-extractor.js';
13
+ import { DetectionFragmentManager } from '../utils/fragment-manager.js';
14
+
15
+ /**
16
+ * Simplified HTTP detector
17
+ */
18
+ export class HttpDetector implements IProtocolDetector {
19
+ private quickDetector = new QuickProtocolDetector();
20
+ private fragmentManager: DetectionFragmentManager;
21
+
22
+ constructor(fragmentManager?: DetectionFragmentManager) {
23
+ this.fragmentManager = fragmentManager || new DetectionFragmentManager();
24
+ }
25
+
26
+ /**
27
+ * Check if buffer can be handled by this detector
28
+ */
29
+ canHandle(buffer: Buffer): boolean {
30
+ const result = this.quickDetector.quickDetect(buffer);
31
+ return result.protocol === 'http' && result.confidence > 50;
32
+ }
33
+
34
+ /**
35
+ * Get minimum bytes needed for detection
36
+ */
37
+ getMinimumBytes(): number {
38
+ return 4; // "GET " minimum
39
+ }
40
+
41
+ /**
42
+ * Detect HTTP protocol from buffer
43
+ */
44
+ detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null {
45
+ // Quick detection first
46
+ const quickResult = this.quickDetector.quickDetect(buffer);
47
+
48
+ if (quickResult.protocol !== 'http' || quickResult.confidence < 50) {
49
+ return null;
50
+ }
51
+
52
+ // Extract routing information
53
+ const routing = RoutingExtractor.extract(buffer, 'http');
54
+
55
+ // If we don't need full headers, we can return early
56
+ if (quickResult.confidence >= 95 && !options?.extractFullHeaders) {
57
+ return {
58
+ protocol: 'http',
59
+ connectionInfo: {
60
+ protocol: 'http',
61
+ method: quickResult.metadata?.method as THttpMethod,
62
+ domain: routing?.domain,
63
+ path: routing?.path
64
+ },
65
+ isComplete: true
66
+ };
67
+ }
68
+
69
+ // Check if we have complete headers
70
+ const headersEnd = buffer.indexOf('\r\n\r\n');
71
+ const isComplete = headersEnd !== -1;
72
+
73
+ return {
74
+ protocol: 'http',
75
+ connectionInfo: {
76
+ protocol: 'http',
77
+ domain: routing?.domain,
78
+ path: routing?.path,
79
+ method: quickResult.metadata?.method as THttpMethod
80
+ },
81
+ isComplete,
82
+ bytesNeeded: isComplete ? undefined : buffer.length + 512 // Need more for headers
83
+ };
84
+ }
85
+
86
+ /**
87
+ * Handle fragmented detection
88
+ */
89
+ detectWithContext(
90
+ buffer: Buffer,
91
+ context: IConnectionContext,
92
+ options?: IDetectionOptions
93
+ ): IDetectionResult | null {
94
+ const handler = this.fragmentManager.getHandler('http');
95
+ const connectionId = DetectionFragmentManager.createConnectionId(context);
96
+
97
+ // Add fragment
98
+ const result = handler.addFragment(connectionId, buffer);
99
+
100
+ if (result.error) {
101
+ handler.complete(connectionId);
102
+ return null;
103
+ }
104
+
105
+ // Try detection on accumulated buffer
106
+ const detectResult = this.detect(result.buffer!, options);
107
+
108
+ if (detectResult && detectResult.isComplete) {
109
+ handler.complete(connectionId);
110
+ }
111
+
112
+ return detectResult;
113
+ }
114
+ }