@api-client/core 0.18.11 → 0.18.13

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 (264) hide show
  1. package/build/src/browser.d.ts +0 -3
  2. package/build/src/browser.d.ts.map +1 -1
  3. package/build/src/browser.js +0 -3
  4. package/build/src/browser.js.map +1 -1
  5. package/build/src/index.d.ts +2 -5
  6. package/build/src/index.d.ts.map +1 -1
  7. package/build/src/index.js +2 -5
  8. package/build/src/index.js.map +1 -1
  9. package/build/src/lib/logging/DefaultLogger.d.ts +14 -0
  10. package/build/src/lib/logging/DefaultLogger.d.ts.map +1 -1
  11. package/build/src/lib/logging/DefaultLogger.js +27 -0
  12. package/build/src/lib/logging/DefaultLogger.js.map +1 -1
  13. package/build/src/lib/logging/index.d.ts +4 -0
  14. package/build/src/lib/logging/index.d.ts.map +1 -0
  15. package/build/src/lib/logging/index.js +10 -0
  16. package/build/src/lib/logging/index.js.map +1 -0
  17. package/build/src/modeling/DomainModel.d.ts.map +1 -1
  18. package/build/src/modeling/DomainModel.js +11 -4
  19. package/build/src/modeling/DomainModel.js.map +1 -1
  20. package/build/src/models/ClientCertificate.d.ts +1 -1
  21. package/build/src/models/ClientCertificate.js.map +1 -1
  22. package/build/src/models/RequestConfig.d.ts +1 -1
  23. package/build/src/models/RequestConfig.js.map +1 -1
  24. package/build/src/models/SerializableError.d.ts +1 -1
  25. package/build/src/models/SerializableError.d.ts.map +1 -1
  26. package/build/src/models/SerializableError.js.map +1 -1
  27. package/build/src/proxy/RequestProxy.d.ts.map +1 -1
  28. package/build/src/proxy/RequestProxy.js +2 -2
  29. package/build/src/proxy/RequestProxy.js.map +1 -1
  30. package/build/src/runtime/http-engine/CoreEngine.d.ts +218 -139
  31. package/build/src/runtime/http-engine/CoreEngine.d.ts.map +1 -1
  32. package/build/src/runtime/http-engine/CoreEngine.js +716 -870
  33. package/build/src/runtime/http-engine/CoreEngine.js.map +1 -1
  34. package/build/src/runtime/http-engine/PayloadSupport.d.ts.map +1 -1
  35. package/build/src/runtime/http-engine/PayloadSupport.js +2 -1
  36. package/build/src/runtime/http-engine/PayloadSupport.js.map +1 -1
  37. package/build/src/runtime/http-engine/auth/AuthManager.d.ts +73 -0
  38. package/build/src/runtime/http-engine/auth/AuthManager.d.ts.map +1 -0
  39. package/build/src/runtime/http-engine/auth/AuthManager.js +186 -0
  40. package/build/src/runtime/http-engine/auth/AuthManager.js.map +1 -0
  41. package/build/src/runtime/http-engine/auth/index.d.ts +2 -0
  42. package/build/src/runtime/http-engine/auth/index.d.ts.map +1 -0
  43. package/build/src/runtime/http-engine/auth/index.js +2 -0
  44. package/build/src/runtime/http-engine/auth/index.js.map +1 -0
  45. package/build/src/runtime/http-engine/certificates/CertificateManager.d.ts +11 -0
  46. package/build/src/runtime/http-engine/certificates/CertificateManager.d.ts.map +1 -0
  47. package/build/src/runtime/http-engine/certificates/CertificateManager.js +76 -0
  48. package/build/src/runtime/http-engine/certificates/CertificateManager.js.map +1 -0
  49. package/build/src/runtime/http-engine/certificates/index.d.ts +2 -0
  50. package/build/src/runtime/http-engine/certificates/index.d.ts.map +1 -0
  51. package/build/src/runtime/http-engine/certificates/index.js +2 -0
  52. package/build/src/runtime/http-engine/certificates/index.js.map +1 -0
  53. package/build/src/runtime/http-engine/compression/CompressionManager.d.ts +25 -0
  54. package/build/src/runtime/http-engine/compression/CompressionManager.d.ts.map +1 -0
  55. package/build/src/runtime/http-engine/compression/CompressionManager.js +89 -0
  56. package/build/src/runtime/http-engine/compression/CompressionManager.js.map +1 -0
  57. package/build/src/runtime/http-engine/compression/index.d.ts +2 -0
  58. package/build/src/runtime/http-engine/compression/index.d.ts.map +1 -0
  59. package/build/src/runtime/http-engine/compression/index.js +2 -0
  60. package/build/src/runtime/http-engine/compression/index.js.map +1 -0
  61. package/build/src/runtime/http-engine/connections/ConnectionManager.d.ts +57 -0
  62. package/build/src/runtime/http-engine/connections/ConnectionManager.d.ts.map +1 -0
  63. package/build/src/runtime/http-engine/connections/ConnectionManager.js +78 -0
  64. package/build/src/runtime/http-engine/connections/ConnectionManager.js.map +1 -0
  65. package/build/src/runtime/http-engine/connections/DigestAuthHandler.d.ts +70 -0
  66. package/build/src/runtime/http-engine/connections/DigestAuthHandler.d.ts.map +1 -0
  67. package/build/src/runtime/http-engine/connections/DigestAuthHandler.js +184 -0
  68. package/build/src/runtime/http-engine/connections/DigestAuthHandler.js.map +1 -0
  69. package/build/src/runtime/http-engine/connections/DirectConnection.d.ts +22 -0
  70. package/build/src/runtime/http-engine/connections/DirectConnection.d.ts.map +1 -0
  71. package/build/src/runtime/http-engine/connections/DirectConnection.js +105 -0
  72. package/build/src/runtime/http-engine/connections/DirectConnection.js.map +1 -0
  73. package/build/src/runtime/http-engine/connections/ProxyAuthHandler.d.ts +60 -0
  74. package/build/src/runtime/http-engine/connections/ProxyAuthHandler.d.ts.map +1 -0
  75. package/build/src/runtime/http-engine/connections/ProxyAuthHandler.js +138 -0
  76. package/build/src/runtime/http-engine/connections/ProxyAuthHandler.js.map +1 -0
  77. package/build/src/runtime/http-engine/connections/ProxyConnection.d.ts +14 -0
  78. package/build/src/runtime/http-engine/connections/ProxyConnection.d.ts.map +1 -0
  79. package/build/src/runtime/http-engine/connections/ProxyConnection.js +47 -0
  80. package/build/src/runtime/http-engine/connections/ProxyConnection.js.map +1 -0
  81. package/build/src/runtime/http-engine/connections/TunnelConnection.d.ts +13 -0
  82. package/build/src/runtime/http-engine/connections/TunnelConnection.d.ts.map +1 -0
  83. package/build/src/runtime/http-engine/connections/TunnelConnection.js +175 -0
  84. package/build/src/runtime/http-engine/connections/TunnelConnection.js.map +1 -0
  85. package/build/src/runtime/http-engine/connections/index.d.ts +7 -0
  86. package/build/src/runtime/http-engine/connections/index.d.ts.map +1 -0
  87. package/build/src/runtime/http-engine/connections/index.js +7 -0
  88. package/build/src/runtime/http-engine/connections/index.js.map +1 -0
  89. package/build/src/runtime/http-engine/constants.d.ts +69 -0
  90. package/build/src/runtime/http-engine/constants.d.ts.map +1 -0
  91. package/build/src/runtime/http-engine/constants.js +90 -0
  92. package/build/src/runtime/http-engine/constants.js.map +1 -0
  93. package/build/src/runtime/http-engine/cookies/CookieProcessor.d.ts +5 -0
  94. package/build/src/runtime/http-engine/cookies/CookieProcessor.d.ts.map +1 -0
  95. package/build/src/runtime/http-engine/cookies/CookieProcessor.js +20 -0
  96. package/build/src/runtime/http-engine/cookies/CookieProcessor.js.map +1 -0
  97. package/build/src/runtime/http-engine/cookies/index.d.ts +2 -0
  98. package/build/src/runtime/http-engine/cookies/index.d.ts.map +1 -0
  99. package/build/src/runtime/http-engine/cookies/index.js +2 -0
  100. package/build/src/runtime/http-engine/cookies/index.js.map +1 -0
  101. package/build/src/runtime/http-engine/errors/HttpEngineErrors.d.ts +156 -0
  102. package/build/src/runtime/http-engine/errors/HttpEngineErrors.d.ts.map +1 -0
  103. package/build/src/runtime/http-engine/errors/HttpEngineErrors.js +227 -0
  104. package/build/src/runtime/http-engine/errors/HttpEngineErrors.js.map +1 -0
  105. package/build/src/runtime/http-engine/errors/index.d.ts +2 -0
  106. package/build/src/runtime/http-engine/errors/index.d.ts.map +1 -0
  107. package/build/src/runtime/http-engine/errors/index.js +2 -0
  108. package/build/src/runtime/http-engine/errors/index.js.map +1 -0
  109. package/build/src/runtime/http-engine/message/MessageBuilder.d.ts +66 -0
  110. package/build/src/runtime/http-engine/message/MessageBuilder.d.ts.map +1 -0
  111. package/build/src/runtime/http-engine/message/MessageBuilder.js +161 -0
  112. package/build/src/runtime/http-engine/message/MessageBuilder.js.map +1 -0
  113. package/build/src/runtime/http-engine/message/MessageProcessor.d.ts +27 -0
  114. package/build/src/runtime/http-engine/message/MessageProcessor.d.ts.map +1 -0
  115. package/build/src/runtime/http-engine/message/MessageProcessor.js +51 -0
  116. package/build/src/runtime/http-engine/message/MessageProcessor.js.map +1 -0
  117. package/build/src/runtime/http-engine/message/index.d.ts +3 -0
  118. package/build/src/runtime/http-engine/message/index.d.ts.map +1 -0
  119. package/build/src/runtime/http-engine/message/index.js +3 -0
  120. package/build/src/runtime/http-engine/message/index.js.map +1 -0
  121. package/build/src/runtime/http-engine/ntlm/NtlmAuth.d.ts +2 -8
  122. package/build/src/runtime/http-engine/ntlm/NtlmAuth.d.ts.map +1 -1
  123. package/build/src/runtime/http-engine/ntlm/NtlmAuth.js +11 -5
  124. package/build/src/runtime/http-engine/ntlm/NtlmAuth.js.map +1 -1
  125. package/build/src/runtime/http-engine/ntlm/NtlmMessage.js +6 -6
  126. package/build/src/runtime/http-engine/ntlm/NtlmMessage.js.map +1 -1
  127. package/build/src/runtime/http-engine/parsers/BodyParser.d.ts +39 -0
  128. package/build/src/runtime/http-engine/parsers/BodyParser.d.ts.map +1 -0
  129. package/build/src/runtime/http-engine/parsers/BodyParser.js +145 -0
  130. package/build/src/runtime/http-engine/parsers/BodyParser.js.map +1 -0
  131. package/build/src/runtime/http-engine/parsers/HeadersParser.d.ts +29 -0
  132. package/build/src/runtime/http-engine/parsers/HeadersParser.d.ts.map +1 -0
  133. package/build/src/runtime/http-engine/parsers/HeadersParser.js +88 -0
  134. package/build/src/runtime/http-engine/parsers/HeadersParser.js.map +1 -0
  135. package/build/src/runtime/http-engine/parsers/HttpResponseParser.d.ts +91 -0
  136. package/build/src/runtime/http-engine/parsers/HttpResponseParser.d.ts.map +1 -0
  137. package/build/src/runtime/http-engine/parsers/HttpResponseParser.js +236 -0
  138. package/build/src/runtime/http-engine/parsers/HttpResponseParser.js.map +1 -0
  139. package/build/src/runtime/http-engine/parsers/StatusParser.d.ts +20 -0
  140. package/build/src/runtime/http-engine/parsers/StatusParser.d.ts.map +1 -0
  141. package/build/src/runtime/http-engine/parsers/StatusParser.js +51 -0
  142. package/build/src/runtime/http-engine/parsers/StatusParser.js.map +1 -0
  143. package/build/src/runtime/http-engine/parsers/index.d.ts +5 -0
  144. package/build/src/runtime/http-engine/parsers/index.d.ts.map +1 -0
  145. package/build/src/runtime/http-engine/parsers/index.js +5 -0
  146. package/build/src/runtime/http-engine/parsers/index.js.map +1 -0
  147. package/build/src/runtime/http-engine/response/ResponseProcessor.d.ts +22 -0
  148. package/build/src/runtime/http-engine/response/ResponseProcessor.d.ts.map +1 -0
  149. package/build/src/runtime/http-engine/response/ResponseProcessor.js +25 -0
  150. package/build/src/runtime/http-engine/response/ResponseProcessor.js.map +1 -0
  151. package/build/src/runtime/http-engine/response/index.d.ts +2 -0
  152. package/build/src/runtime/http-engine/response/index.d.ts.map +1 -0
  153. package/build/src/runtime/http-engine/response/index.js +2 -0
  154. package/build/src/runtime/http-engine/response/index.js.map +1 -0
  155. package/build/src/runtime/http-engine/statistics/StatisticsProcessor.d.ts +7 -0
  156. package/build/src/runtime/http-engine/statistics/StatisticsProcessor.d.ts.map +1 -0
  157. package/build/src/runtime/http-engine/statistics/StatisticsProcessor.js +40 -0
  158. package/build/src/runtime/http-engine/statistics/StatisticsProcessor.js.map +1 -0
  159. package/build/src/runtime/http-engine/statistics/index.d.ts +2 -0
  160. package/build/src/runtime/http-engine/statistics/index.d.ts.map +1 -0
  161. package/build/src/runtime/http-engine/statistics/index.js +2 -0
  162. package/build/src/runtime/http-engine/statistics/index.js.map +1 -0
  163. package/build/src/runtime/http-engine/url/UrlProcessor.d.ts +24 -0
  164. package/build/src/runtime/http-engine/url/UrlProcessor.d.ts.map +1 -0
  165. package/build/src/runtime/http-engine/url/UrlProcessor.js +50 -0
  166. package/build/src/runtime/http-engine/url/UrlProcessor.js.map +1 -0
  167. package/build/src/runtime/http-engine/url/index.d.ts +2 -0
  168. package/build/src/runtime/http-engine/url/index.d.ts.map +1 -0
  169. package/build/src/runtime/http-engine/url/index.js +2 -0
  170. package/build/src/runtime/http-engine/url/index.js.map +1 -0
  171. package/build/src/runtime/http-runner/HttpRequestRunner.d.ts +3 -3
  172. package/build/src/runtime/http-runner/HttpRequestRunner.d.ts.map +1 -1
  173. package/build/src/runtime/http-runner/HttpRequestRunner.js.map +1 -1
  174. package/build/src/runtime/node/InteropInterfaces.d.ts +3 -3
  175. package/build/src/runtime/node/InteropInterfaces.d.ts.map +1 -1
  176. package/build/src/runtime/node/InteropInterfaces.js.map +1 -1
  177. package/build/src/runtime/node/ProjectRequestRunner.d.ts +2 -2
  178. package/build/src/runtime/node/ProjectRequestRunner.d.ts.map +1 -1
  179. package/build/src/runtime/node/ProjectRequestRunner.js.map +1 -1
  180. package/build/src/runtime/node/ProjectRunner.d.ts.map +1 -1
  181. package/build/src/runtime/node/ProjectRunner.js +2 -2
  182. package/build/src/runtime/node/ProjectRunner.js.map +1 -1
  183. package/build/tsconfig.tsbuildinfo +1 -1
  184. package/data/models/example-generator-api.json +24 -24
  185. package/package.json +2 -2
  186. package/src/lib/logging/DefaultLogger.ts +32 -0
  187. package/src/modeling/DomainModel.ts +11 -4
  188. package/src/models/ClientCertificate.ts +1 -1
  189. package/src/models/RequestConfig.ts +1 -1
  190. package/src/models/SerializableError.ts +1 -1
  191. package/src/proxy/RequestProxy.ts +2 -2
  192. package/src/runtime/http-engine/CoreEngine.ts +858 -893
  193. package/src/runtime/http-engine/PayloadSupport.ts +2 -1
  194. package/src/runtime/http-engine/auth/AuthManager.ts +242 -0
  195. package/src/runtime/http-engine/certificates/CertificateManager.ts +74 -0
  196. package/src/runtime/http-engine/compression/CompressionManager.ts +99 -0
  197. package/src/runtime/http-engine/connections/ConnectionManager.ts +123 -0
  198. package/src/runtime/http-engine/connections/DigestAuthHandler.ts +238 -0
  199. package/src/runtime/http-engine/connections/DirectConnection.ts +134 -0
  200. package/src/runtime/http-engine/connections/ProxyAuthHandler.ts +179 -0
  201. package/src/runtime/http-engine/connections/ProxyConnection.ts +55 -0
  202. package/src/runtime/http-engine/connections/TunnelConnection.ts +192 -0
  203. package/src/runtime/http-engine/constants.ts +103 -0
  204. package/src/runtime/http-engine/cookies/CookieProcessor.ts +25 -0
  205. package/src/runtime/http-engine/errors/HttpEngineErrors.ts +319 -0
  206. package/src/runtime/http-engine/message/MessageBuilder.ts +201 -0
  207. package/src/runtime/http-engine/message/MessageProcessor.ts +73 -0
  208. package/src/runtime/http-engine/ntlm/NtlmAuth.ts +16 -13
  209. package/src/runtime/http-engine/ntlm/NtlmMessage.ts +6 -6
  210. package/src/runtime/http-engine/parsers/BodyParser.ts +171 -0
  211. package/src/runtime/http-engine/parsers/HeadersParser.ts +103 -0
  212. package/src/runtime/http-engine/parsers/HttpResponseParser.ts +280 -0
  213. package/src/runtime/http-engine/parsers/StatusParser.ts +69 -0
  214. package/src/runtime/http-engine/response/ResponseProcessor.ts +46 -0
  215. package/src/runtime/http-engine/statistics/StatisticsProcessor.ts +52 -0
  216. package/src/runtime/http-engine/url/UrlProcessor.ts +55 -0
  217. package/src/runtime/http-runner/HttpRequestRunner.ts +3 -3
  218. package/src/runtime/node/InteropInterfaces.ts +3 -3
  219. package/src/runtime/node/ProjectRequestRunner.ts +2 -2
  220. package/src/runtime/node/ProjectRunner.ts +2 -2
  221. package/tests/servers/ProxyServer.ts +32 -19
  222. package/tests/servers/express-routes/ApiEndpoint.ts +24 -0
  223. package/tests/servers/express-routes/BasicAuthRoute.ts +36 -0
  224. package/tests/servers/express-routes/BearerAuthRoute.ts +35 -0
  225. package/tests/servers/express-routes/NTLMRoute.ts +2 -3
  226. package/tests/servers/express-routes/PostApi.ts +15 -2
  227. package/tests/servers/express-routes/RedirectsApi.ts +12 -1
  228. package/tests/servers/express-routes/ResponsesApi.ts +1 -1
  229. package/tests/servers/express-routes/StreamApi.ts +19 -0
  230. package/tests/servers/oauth2mock/ServerMock.js +1 -1
  231. package/tests/unit/modeling/domain_model_entities.spec.ts +306 -1
  232. package/tests/unit/runtime/http-engine/HttpResponseParser.spec.ts +337 -0
  233. package/tests/unit/runtime/http-engine/abort.spec.ts +4 -5
  234. package/tests/unit/runtime/http-engine/auth.spec.ts +7 -58
  235. package/tests/unit/runtime/http-engine/certificates/CertificateManager.spec.ts +482 -0
  236. package/tests/unit/runtime/http-engine/certificates.spec.ts +2 -2
  237. package/tests/unit/runtime/http-engine/compression/CompressionManager.spec.ts +498 -0
  238. package/tests/unit/runtime/http-engine/compression.spec.ts +3 -72
  239. package/tests/unit/runtime/http-engine/connections/ConnectionManager.spec.ts +379 -0
  240. package/tests/unit/runtime/http-engine/connections/DigestAuthHandler.spec.ts +164 -0
  241. package/tests/unit/runtime/http-engine/core_engine.spec.ts +561 -0
  242. package/tests/unit/runtime/http-engine/engine_statuses.spec.ts +2 -2
  243. package/tests/unit/runtime/http-engine/events.spec.ts +2 -2
  244. package/tests/unit/runtime/http-engine/headers.spec.ts +2 -88
  245. package/tests/unit/runtime/http-engine/hosts.spec.ts +2 -2
  246. package/tests/unit/runtime/http-engine/http-get.spec.ts +2 -2
  247. package/tests/unit/runtime/http-engine/http-post.spec.ts +2 -2
  248. package/tests/unit/runtime/http-engine/logger.spec.ts +0 -8
  249. package/tests/unit/runtime/http-engine/message.spec.ts +2 -194
  250. package/tests/unit/runtime/http-engine/params.spec.ts +4 -4
  251. package/tests/unit/runtime/http-engine/proxy.spec.ts +15 -14
  252. package/tests/unit/runtime/http-engine/redirects.spec.ts +2 -2
  253. package/tests/unit/runtime/http-engine/responses.spec.ts +170 -277
  254. package/tests/unit/runtime/http-engine/timeout.spec.ts +3 -3
  255. package/tests/unit/runtime/http-engine/timings.spec.ts +2 -2
  256. package/tests/unit/runtime/proxy/HttpProjectProxy.spec.ts +25 -28
  257. package/tests/unit/runtime/runners/project_runner.spec.ts +2 -2
  258. package/tests/unit/runtime/runners/request_runner.spec.ts +2 -2
  259. package/build/src/runtime/http-engine/HttpEngine.d.ts +0 -311
  260. package/build/src/runtime/http-engine/HttpEngine.d.ts.map +0 -1
  261. package/build/src/runtime/http-engine/HttpEngine.js +0 -802
  262. package/build/src/runtime/http-engine/HttpEngine.js.map +0 -1
  263. package/src/runtime/http-engine/HttpEngine.ts +0 -952
  264. package/tests/unit/runtime/http-engine/connecting.spec.ts +0 -140
@@ -0,0 +1,88 @@
1
+ const nlNlBuffer = Buffer.from([13, 10, 13, 10]);
2
+ const nlBuffer = Buffer.from([13, 10]);
3
+ /**
4
+ * Parser for HTTP headers
5
+ */
6
+ export class HeadersParser {
7
+ logger;
8
+ constructor(logger) {
9
+ this.logger = logger;
10
+ }
11
+ /**
12
+ * Parse HTTP headers from buffer
13
+ * @param data Buffer containing header data
14
+ * @param existingHeaders Previously accumulated headers
15
+ * @returns Headers parse result
16
+ */
17
+ parse(data, existingHeaders) {
18
+ this.logger.info('Processing headers');
19
+ // Looking for end of headers section
20
+ let index = data.indexOf(nlNlBuffer);
21
+ let padding = 4;
22
+ if (index === -1) {
23
+ // It can also be 2x ASCII 10
24
+ const _index = data.indexOf(Buffer.from([10, 10]));
25
+ if (_index !== -1) {
26
+ index = _index;
27
+ padding = 2;
28
+ }
29
+ }
30
+ // https://github.com/jarrodek/socket-fetch/issues/3
31
+ const enterIndex = data.indexOf(nlBuffer);
32
+ if (index === -1 && enterIndex !== 0) {
33
+ // end in next chunk
34
+ if (!existingHeaders) {
35
+ return {
36
+ complete: false,
37
+ headers: data,
38
+ };
39
+ }
40
+ else {
41
+ const sum = existingHeaders.length + data.length;
42
+ const combined = Buffer.concat([existingHeaders, data], sum);
43
+ return {
44
+ complete: false,
45
+ headers: combined,
46
+ };
47
+ }
48
+ }
49
+ if (enterIndex !== 0) {
50
+ const headersArray = data.slice(0, index);
51
+ if (!existingHeaders) {
52
+ return {
53
+ complete: true,
54
+ headers: headersArray,
55
+ remaining: this.extractRemaining(data, index, padding),
56
+ };
57
+ }
58
+ else {
59
+ const sum = existingHeaders.length + headersArray.length;
60
+ const combined = Buffer.concat([existingHeaders, headersArray], sum);
61
+ return {
62
+ complete: true,
63
+ headers: combined,
64
+ remaining: this.extractRemaining(data, index, padding),
65
+ };
66
+ }
67
+ }
68
+ return {
69
+ complete: true,
70
+ headers: existingHeaders,
71
+ remaining: this.extractRemaining(data, index, padding),
72
+ };
73
+ }
74
+ /**
75
+ * Extract remaining data after headers
76
+ * @param data Original data buffer
77
+ * @param index Index where headers end
78
+ * @param padding Padding to skip
79
+ * @returns Remaining data
80
+ */
81
+ extractRemaining(data, index, padding) {
82
+ const start = index === -1 ? 0 : index;
83
+ const enterIndex = data.indexOf(nlBuffer);
84
+ const move = enterIndex === 0 ? 2 : padding;
85
+ return data.slice(start + move);
86
+ }
87
+ }
88
+ //# sourceMappingURL=HeadersParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeadersParser.js","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/HeadersParser.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Logger, type ILogObj } from '../../../lib/logging/index.js'\n\nconst nlNlBuffer = Buffer.from([13, 10, 13, 10])\nconst nlBuffer = Buffer.from([13, 10])\n\nexport interface HeadersParseResult {\n complete: boolean\n headers?: Buffer\n remaining?: Buffer\n}\n\n/**\n * Parser for HTTP headers\n */\nexport class HeadersParser {\n private logger: Logger<ILogObj>\n\n constructor(logger: Logger<ILogObj>) {\n this.logger = logger\n }\n\n /**\n * Parse HTTP headers from buffer\n * @param data Buffer containing header data\n * @param existingHeaders Previously accumulated headers\n * @returns Headers parse result\n */\n parse(data: Buffer, existingHeaders?: Buffer): HeadersParseResult {\n this.logger.info('Processing headers')\n\n // Looking for end of headers section\n let index = data.indexOf(nlNlBuffer)\n let padding = 4\n\n if (index === -1) {\n // It can also be 2x ASCII 10\n const _index = data.indexOf(Buffer.from([10, 10]))\n if (_index !== -1) {\n index = _index\n padding = 2\n }\n }\n\n // https://github.com/jarrodek/socket-fetch/issues/3\n const enterIndex = data.indexOf(nlBuffer)\n\n if (index === -1 && enterIndex !== 0) {\n // end in next chunk\n if (!existingHeaders) {\n return {\n complete: false,\n headers: data,\n }\n } else {\n const sum = existingHeaders.length + data.length\n const combined = Buffer.concat([existingHeaders, data], sum)\n return {\n complete: false,\n headers: combined,\n }\n }\n }\n\n if (enterIndex !== 0) {\n const headersArray = data.slice(0, index)\n if (!existingHeaders) {\n return {\n complete: true,\n headers: headersArray,\n remaining: this.extractRemaining(data, index, padding),\n }\n } else {\n const sum = existingHeaders.length + headersArray.length\n const combined = Buffer.concat([existingHeaders, headersArray], sum)\n return {\n complete: true,\n headers: combined,\n remaining: this.extractRemaining(data, index, padding),\n }\n }\n }\n\n return {\n complete: true,\n headers: existingHeaders,\n remaining: this.extractRemaining(data, index, padding),\n }\n }\n\n /**\n * Extract remaining data after headers\n * @param data Original data buffer\n * @param index Index where headers end\n * @param padding Padding to skip\n * @returns Remaining data\n */\n private extractRemaining(data: Buffer, index: number, padding: number): Buffer {\n const start = index === -1 ? 0 : index\n const enterIndex = data.indexOf(nlBuffer)\n const move = enterIndex === 0 ? 2 : padding\n return data.slice(start + move)\n }\n}\n"]}
@@ -0,0 +1,91 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Headers } from '../../../lib/headers/Headers.js';
3
+ import { type Logger, type ILogObj } from '../../../lib/logging/index.js';
4
+ export declare enum RequestState {
5
+ Status = 0,
6
+ Headers = 1,
7
+ Body = 2,
8
+ Done = 3
9
+ }
10
+ export interface ResponseInfo {
11
+ status?: number;
12
+ contentLength?: number;
13
+ chunked: boolean;
14
+ body?: Buffer;
15
+ chunk?: Buffer;
16
+ chunkSize?: number;
17
+ }
18
+ export interface ParserCallbacks {
19
+ onStatusParsed: (status: number, statusText: string) => void;
20
+ onHeadersParsed: (headers: Headers) => void;
21
+ onBodyComplete: (body: Buffer) => void;
22
+ onError: (error: Error) => void;
23
+ onAbort: () => void;
24
+ emit: (event: string, detail?: unknown) => void;
25
+ }
26
+ /**
27
+ * HTTP Response Parser
28
+ * Handles parsing of HTTP response data including status, headers, and body
29
+ */
30
+ export declare class HttpResponseParser extends EventEmitter {
31
+ private state;
32
+ private rawHeaders?;
33
+ private responseInfo;
34
+ private logger;
35
+ private callbacks;
36
+ private aborted;
37
+ private statusParser;
38
+ private headersParser;
39
+ private bodyParser;
40
+ constructor(logger: Logger<ILogObj>, callbacks: ParserCallbacks);
41
+ /**
42
+ * Process incoming HTTP response data
43
+ * @param data Buffer containing HTTP response data
44
+ */
45
+ processData(data: Buffer): void;
46
+ /**
47
+ * Process HTTP status line
48
+ * @param data Buffer containing status line data
49
+ * @returns Remaining data after status parsing
50
+ */
51
+ private processStatus;
52
+ /**
53
+ * Process HTTP headers
54
+ * @param data Buffer containing header data
55
+ * @returns Remaining data after header parsing
56
+ */
57
+ private processHeaders;
58
+ /**
59
+ * Parse headers and extract response information
60
+ * @param buffer Raw headers buffer
61
+ */
62
+ private parseHeaders;
63
+ /**
64
+ * Check if response should end after headers
65
+ * @param data Remaining data after headers
66
+ * @returns Data to continue processing or undefined to end
67
+ */
68
+ private postHeaders;
69
+ /**
70
+ * Process HTTP body data
71
+ * @param data Buffer containing body data
72
+ */
73
+ private processBody;
74
+ /**
75
+ * Abort the parser
76
+ */
77
+ abort(): void;
78
+ /**
79
+ * Reset parser state
80
+ */
81
+ reset(): void;
82
+ /**
83
+ * Get current parser state
84
+ */
85
+ getState(): RequestState;
86
+ /**
87
+ * Get response information
88
+ */
89
+ getResponseInfo(): ResponseInfo;
90
+ }
91
+ //# sourceMappingURL=HttpResponseParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpResponseParser.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/HttpResponseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAMzE,oBAAY,YAAY;IACtB,MAAM,IAAA;IACN,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,IAAI,IAAA;CACL;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5D,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAChD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,UAAU,CAAY;gBAElB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,eAAe;IAa/D;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA0B/B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAwBrB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA6BtB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAiCpB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,eAAe,IAAI,YAAY;CAGhC"}
@@ -0,0 +1,236 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Headers } from '../../../lib/headers/Headers.js';
3
+ import { StatusParser } from './StatusParser.js';
4
+ import { HeadersParser } from './HeadersParser.js';
5
+ import { BodyParser } from './BodyParser.js';
6
+ export var RequestState;
7
+ (function (RequestState) {
8
+ RequestState[RequestState["Status"] = 0] = "Status";
9
+ RequestState[RequestState["Headers"] = 1] = "Headers";
10
+ RequestState[RequestState["Body"] = 2] = "Body";
11
+ RequestState[RequestState["Done"] = 3] = "Done";
12
+ })(RequestState || (RequestState = {}));
13
+ /**
14
+ * HTTP Response Parser
15
+ * Handles parsing of HTTP response data including status, headers, and body
16
+ */
17
+ export class HttpResponseParser extends EventEmitter {
18
+ state = RequestState.Status;
19
+ rawHeaders;
20
+ responseInfo;
21
+ logger;
22
+ callbacks;
23
+ aborted = false;
24
+ statusParser;
25
+ headersParser;
26
+ bodyParser;
27
+ constructor(logger, callbacks) {
28
+ super();
29
+ this.logger = logger;
30
+ this.callbacks = callbacks;
31
+ this.responseInfo = {
32
+ chunked: false,
33
+ };
34
+ this.statusParser = new StatusParser(logger);
35
+ this.headersParser = new HeadersParser(logger);
36
+ this.bodyParser = new BodyParser(logger, this.responseInfo);
37
+ }
38
+ /**
39
+ * Process incoming HTTP response data
40
+ * @param data Buffer containing HTTP response data
41
+ */
42
+ processData(data) {
43
+ if (this.aborted) {
44
+ return;
45
+ }
46
+ let remaining = data;
47
+ if (this.state === RequestState.Status) {
48
+ remaining = this.processStatus(remaining);
49
+ if (!remaining) {
50
+ return;
51
+ }
52
+ }
53
+ if (this.state === RequestState.Headers) {
54
+ remaining = this.processHeaders(remaining);
55
+ if (!remaining) {
56
+ return;
57
+ }
58
+ }
59
+ if (this.state === RequestState.Body) {
60
+ this.processBody(remaining);
61
+ }
62
+ }
63
+ /**
64
+ * Process HTTP status line
65
+ * @param data Buffer containing status line data
66
+ * @returns Remaining data after status parsing
67
+ */
68
+ processStatus(data) {
69
+ if (this.aborted) {
70
+ return;
71
+ }
72
+ if (!data) {
73
+ return;
74
+ }
75
+ try {
76
+ const result = this.statusParser.parse(data);
77
+ if (result) {
78
+ this.responseInfo.status = result.status;
79
+ this.callbacks.onStatusParsed(result.status, result.statusText);
80
+ this.state = RequestState.Headers;
81
+ return result.remaining;
82
+ }
83
+ }
84
+ catch (error) {
85
+ this.callbacks.onError(error);
86
+ }
87
+ return data;
88
+ }
89
+ /**
90
+ * Process HTTP headers
91
+ * @param data Buffer containing header data
92
+ * @returns Remaining data after header parsing
93
+ */
94
+ processHeaders(data) {
95
+ if (this.aborted) {
96
+ return;
97
+ }
98
+ if (!data) {
99
+ this.parseHeaders();
100
+ return;
101
+ }
102
+ try {
103
+ const result = this.headersParser.parse(data, this.rawHeaders);
104
+ if (result.complete) {
105
+ this.rawHeaders = result.headers;
106
+ this.parseHeaders(this.rawHeaders);
107
+ delete this.rawHeaders;
108
+ this.state = RequestState.Body;
109
+ return this.postHeaders(result.remaining);
110
+ }
111
+ else {
112
+ this.rawHeaders = result.headers;
113
+ return;
114
+ }
115
+ }
116
+ catch (error) {
117
+ this.callbacks.onError(error);
118
+ }
119
+ return data;
120
+ }
121
+ /**
122
+ * Parse headers and extract response information
123
+ * @param buffer Raw headers buffer
124
+ */
125
+ parseHeaders(buffer) {
126
+ let raw = '';
127
+ if (buffer) {
128
+ raw = buffer.toString();
129
+ }
130
+ this.logger.info('Received headers list', raw);
131
+ const headers = new Headers(raw);
132
+ // Extract response information
133
+ if (headers.has('Content-Length')) {
134
+ this.responseInfo.contentLength = Number(headers.get('Content-Length'));
135
+ }
136
+ if (headers.has('Transfer-Encoding')) {
137
+ const tr = headers.get('Transfer-Encoding');
138
+ if (tr === 'chunked') {
139
+ this.responseInfo.chunked = true;
140
+ }
141
+ }
142
+ this.callbacks.onHeadersParsed(headers);
143
+ const rawHeaders = headers.toString();
144
+ const detail = {
145
+ returnValue: true,
146
+ value: rawHeaders,
147
+ };
148
+ this.callbacks.emit('headersreceived', detail);
149
+ if (!detail.returnValue) {
150
+ this.abort();
151
+ }
152
+ }
153
+ /**
154
+ * Check if response should end after headers
155
+ * @param data Remaining data after headers
156
+ * @returns Data to continue processing or undefined to end
157
+ */
158
+ postHeaders(data) {
159
+ // Check if response status indicates no body should be present
160
+ const status = this.responseInfo.status;
161
+ if (typeof status === 'number' && (status === 204 || status === 304 || (status >= 100 && status < 200))) {
162
+ // 204 No Content, 304 Not Modified, and informational responses do not have a body
163
+ this.state = RequestState.Done;
164
+ this.callbacks.onBodyComplete(Buffer.alloc(0));
165
+ return;
166
+ }
167
+ if (!data || data.length === 0) {
168
+ if (this.responseInfo.contentLength === 0) {
169
+ this.state = RequestState.Done;
170
+ this.callbacks.onBodyComplete(Buffer.alloc(0));
171
+ return;
172
+ }
173
+ return;
174
+ }
175
+ return data;
176
+ }
177
+ /**
178
+ * Process HTTP body data
179
+ * @param data Buffer containing body data
180
+ */
181
+ processBody(data) {
182
+ if (this.aborted || !data) {
183
+ return;
184
+ }
185
+ try {
186
+ if (this.responseInfo.chunked) {
187
+ this.bodyParser.processChunked(data, (body) => {
188
+ this.state = RequestState.Done;
189
+ this.callbacks.onBodyComplete(body);
190
+ });
191
+ }
192
+ else {
193
+ this.bodyParser.processContentLength(data, (body) => {
194
+ this.state = RequestState.Done;
195
+ this.callbacks.onBodyComplete(body);
196
+ });
197
+ }
198
+ }
199
+ catch (error) {
200
+ this.callbacks.onError(error);
201
+ }
202
+ }
203
+ /**
204
+ * Abort the parser
205
+ */
206
+ abort() {
207
+ this.aborted = true;
208
+ this.state = RequestState.Done;
209
+ this.callbacks.onAbort();
210
+ }
211
+ /**
212
+ * Reset parser state
213
+ */
214
+ reset() {
215
+ this.state = RequestState.Status;
216
+ this.rawHeaders = undefined;
217
+ this.responseInfo = {
218
+ chunked: false,
219
+ };
220
+ this.aborted = false;
221
+ this.bodyParser = new BodyParser(this.logger, this.responseInfo);
222
+ }
223
+ /**
224
+ * Get current parser state
225
+ */
226
+ getState() {
227
+ return this.state;
228
+ }
229
+ /**
230
+ * Get response information
231
+ */
232
+ getResponseInfo() {
233
+ return this.responseInfo;
234
+ }
235
+ }
236
+ //# sourceMappingURL=HttpResponseParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpResponseParser.js","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/HttpResponseParser.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'events'\nimport { Headers } from '../../../lib/headers/Headers.js'\nimport { type Logger, type ILogObj } from '../../../lib/logging/index.js'\nimport type { HeadersReceivedDetail } from '../CoreEngine.js'\nimport { StatusParser } from './StatusParser.js'\nimport { HeadersParser } from './HeadersParser.js'\nimport { BodyParser } from './BodyParser.js'\n\nexport enum RequestState {\n Status,\n Headers,\n Body,\n Done,\n}\n\nexport interface ResponseInfo {\n status?: number\n contentLength?: number\n chunked: boolean\n body?: Buffer\n chunk?: Buffer\n chunkSize?: number\n}\n\nexport interface ParserCallbacks {\n onStatusParsed: (status: number, statusText: string) => void\n onHeadersParsed: (headers: Headers) => void\n onBodyComplete: (body: Buffer) => void\n onError: (error: Error) => void\n onAbort: () => void\n emit: (event: string, detail?: unknown) => void\n}\n\n/**\n * HTTP Response Parser\n * Handles parsing of HTTP response data including status, headers, and body\n */\nexport class HttpResponseParser extends EventEmitter {\n private state = RequestState.Status\n private rawHeaders?: Buffer\n private responseInfo: ResponseInfo\n private logger: Logger<ILogObj>\n private callbacks: ParserCallbacks\n private aborted = false\n\n private statusParser: StatusParser\n private headersParser: HeadersParser\n private bodyParser: BodyParser\n\n constructor(logger: Logger<ILogObj>, callbacks: ParserCallbacks) {\n super()\n this.logger = logger\n this.callbacks = callbacks\n this.responseInfo = {\n chunked: false,\n }\n\n this.statusParser = new StatusParser(logger)\n this.headersParser = new HeadersParser(logger)\n this.bodyParser = new BodyParser(logger, this.responseInfo)\n }\n\n /**\n * Process incoming HTTP response data\n * @param data Buffer containing HTTP response data\n */\n processData(data: Buffer): void {\n if (this.aborted) {\n return\n }\n\n let remaining: Buffer | undefined = data\n\n if (this.state === RequestState.Status) {\n remaining = this.processStatus(remaining)\n if (!remaining) {\n return\n }\n }\n\n if (this.state === RequestState.Headers) {\n remaining = this.processHeaders(remaining)\n if (!remaining) {\n return\n }\n }\n\n if (this.state === RequestState.Body) {\n this.processBody(remaining)\n }\n }\n\n /**\n * Process HTTP status line\n * @param data Buffer containing status line data\n * @returns Remaining data after status parsing\n */\n private processStatus(data?: Buffer): Buffer | undefined {\n if (this.aborted) {\n return\n }\n\n if (!data) {\n return\n }\n\n try {\n const result = this.statusParser.parse(data)\n if (result) {\n this.responseInfo.status = result.status\n this.callbacks.onStatusParsed(result.status, result.statusText)\n this.state = RequestState.Headers\n return result.remaining\n }\n } catch (error) {\n this.callbacks.onError(error as Error)\n }\n\n return data\n }\n\n /**\n * Process HTTP headers\n * @param data Buffer containing header data\n * @returns Remaining data after header parsing\n */\n private processHeaders(data?: Buffer): Buffer | undefined {\n if (this.aborted) {\n return\n }\n\n if (!data) {\n this.parseHeaders()\n return\n }\n\n try {\n const result = this.headersParser.parse(data, this.rawHeaders)\n if (result.complete) {\n this.rawHeaders = result.headers\n this.parseHeaders(this.rawHeaders)\n delete this.rawHeaders\n this.state = RequestState.Body\n return this.postHeaders(result.remaining)\n } else {\n this.rawHeaders = result.headers\n return\n }\n } catch (error) {\n this.callbacks.onError(error as Error)\n }\n\n return data\n }\n\n /**\n * Parse headers and extract response information\n * @param buffer Raw headers buffer\n */\n private parseHeaders(buffer?: Buffer): void {\n let raw = ''\n if (buffer) {\n raw = buffer.toString()\n }\n\n this.logger.info('Received headers list', raw)\n const headers = new Headers(raw)\n\n // Extract response information\n if (headers.has('Content-Length')) {\n this.responseInfo.contentLength = Number(headers.get('Content-Length'))\n }\n if (headers.has('Transfer-Encoding')) {\n const tr = headers.get('Transfer-Encoding')\n if (tr === 'chunked') {\n this.responseInfo.chunked = true\n }\n }\n\n this.callbacks.onHeadersParsed(headers)\n\n const rawHeaders = headers.toString()\n const detail: HeadersReceivedDetail = {\n returnValue: true,\n value: rawHeaders,\n }\n this.callbacks.emit('headersreceived', detail)\n if (!detail.returnValue) {\n this.abort()\n }\n }\n\n /**\n * Check if response should end after headers\n * @param data Remaining data after headers\n * @returns Data to continue processing or undefined to end\n */\n private postHeaders(data?: Buffer): Buffer | undefined {\n // Check if response status indicates no body should be present\n const status = this.responseInfo.status\n if (typeof status === 'number' && (status === 204 || status === 304 || (status >= 100 && status < 200))) {\n // 204 No Content, 304 Not Modified, and informational responses do not have a body\n this.state = RequestState.Done\n this.callbacks.onBodyComplete(Buffer.alloc(0))\n return\n }\n\n if (!data || data.length === 0) {\n if (this.responseInfo.contentLength === 0) {\n this.state = RequestState.Done\n this.callbacks.onBodyComplete(Buffer.alloc(0))\n return\n }\n return\n }\n return data\n }\n\n /**\n * Process HTTP body data\n * @param data Buffer containing body data\n */\n private processBody(data?: Buffer): void {\n if (this.aborted || !data) {\n return\n }\n\n try {\n if (this.responseInfo.chunked) {\n this.bodyParser.processChunked(data, (body) => {\n this.state = RequestState.Done\n this.callbacks.onBodyComplete(body)\n })\n } else {\n this.bodyParser.processContentLength(data, (body) => {\n this.state = RequestState.Done\n this.callbacks.onBodyComplete(body)\n })\n }\n } catch (error) {\n this.callbacks.onError(error as Error)\n }\n }\n\n /**\n * Abort the parser\n */\n abort(): void {\n this.aborted = true\n this.state = RequestState.Done\n this.callbacks.onAbort()\n }\n\n /**\n * Reset parser state\n */\n reset(): void {\n this.state = RequestState.Status\n this.rawHeaders = undefined\n this.responseInfo = {\n chunked: false,\n }\n this.aborted = false\n this.bodyParser = new BodyParser(this.logger, this.responseInfo)\n }\n\n /**\n * Get current parser state\n */\n getState(): RequestState {\n return this.state\n }\n\n /**\n * Get response information\n */\n getResponseInfo(): ResponseInfo {\n return this.responseInfo\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { type Logger, type ILogObj } from '../../../lib/logging/index.js';
2
+ export interface StatusParseResult {
3
+ status: number;
4
+ statusText: string;
5
+ remaining: Buffer;
6
+ }
7
+ /**
8
+ * Parser for HTTP status lines
9
+ */
10
+ export declare class StatusParser {
11
+ private logger;
12
+ constructor(logger: Logger<ILogObj>);
13
+ /**
14
+ * Parse HTTP status line from buffer
15
+ * @param data Buffer containing status line data
16
+ * @returns Parsed status result or undefined if incomplete
17
+ */
18
+ parse(data: Buffer): StatusParseResult | undefined;
19
+ }
20
+ //# sourceMappingURL=StatusParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusParser.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/StatusParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAIzE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;IAInC;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;CA2CnD"}
@@ -0,0 +1,51 @@
1
+ const nlBuffer = Buffer.from([13, 10]);
2
+ /**
3
+ * Parser for HTTP status lines
4
+ */
5
+ export class StatusParser {
6
+ logger;
7
+ constructor(logger) {
8
+ this.logger = logger;
9
+ }
10
+ /**
11
+ * Parse HTTP status line from buffer
12
+ * @param data Buffer containing status line data
13
+ * @returns Parsed status result or undefined if incomplete
14
+ */
15
+ parse(data) {
16
+ this.logger.info('Processing status');
17
+ const index = data.indexOf(nlBuffer);
18
+ if (index === -1) {
19
+ // Incomplete status line, need more data
20
+ return undefined;
21
+ }
22
+ let statusLine = data.slice(0, index).toString();
23
+ const remaining = data.slice(index + 2);
24
+ // Remove HTTP version prefix
25
+ statusLine = statusLine.replace(/HTTP\/\d(\.\d)?\s/, '');
26
+ const delimiterPos = statusLine.indexOf(' ');
27
+ let status;
28
+ let msg = '';
29
+ if (delimiterPos === -1) {
30
+ status = statusLine;
31
+ }
32
+ else {
33
+ status = statusLine.substr(0, delimiterPos);
34
+ msg = statusLine.substr(delimiterPos + 1);
35
+ }
36
+ let typedStatus = Number(status);
37
+ if (Number.isNaN(typedStatus)) {
38
+ typedStatus = 0;
39
+ }
40
+ if (msg && msg.indexOf('\n') !== -1) {
41
+ msg = msg.split('\n')[0];
42
+ }
43
+ this.logger.info('Received status', typedStatus, msg);
44
+ return {
45
+ status: typedStatus,
46
+ statusText: msg,
47
+ remaining,
48
+ };
49
+ }
50
+ }
51
+ //# sourceMappingURL=StatusParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusParser.js","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/StatusParser.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AAQtC;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAiB;IAE/B,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAErC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,yCAAyC;YACzC,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAA;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QAEvC,6BAA6B;QAC7B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;QAExD,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,IAAI,MAAc,CAAA;QAClB,IAAI,GAAG,GAAG,EAAE,CAAA;QAEZ,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,UAAU,CAAA;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;YAC3C,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;QAC3C,CAAC;QAED,IAAI,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QAChC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,WAAW,GAAG,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACpC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA;QAErD,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,GAAG;YACf,SAAS;SACV,CAAA;IACH,CAAC;CACF","sourcesContent":["import { type Logger, type ILogObj } from '../../../lib/logging/index.js'\n\nconst nlBuffer = Buffer.from([13, 10])\n\nexport interface StatusParseResult {\n status: number\n statusText: string\n remaining: Buffer\n}\n\n/**\n * Parser for HTTP status lines\n */\nexport class StatusParser {\n private logger: Logger<ILogObj>\n\n constructor(logger: Logger<ILogObj>) {\n this.logger = logger\n }\n\n /**\n * Parse HTTP status line from buffer\n * @param data Buffer containing status line data\n * @returns Parsed status result or undefined if incomplete\n */\n parse(data: Buffer): StatusParseResult | undefined {\n this.logger.info('Processing status')\n\n const index = data.indexOf(nlBuffer)\n if (index === -1) {\n // Incomplete status line, need more data\n return undefined\n }\n\n let statusLine = data.slice(0, index).toString()\n const remaining = data.slice(index + 2)\n\n // Remove HTTP version prefix\n statusLine = statusLine.replace(/HTTP\\/\\d(\\.\\d)?\\s/, '')\n\n const delimiterPos = statusLine.indexOf(' ')\n let status: string\n let msg = ''\n\n if (delimiterPos === -1) {\n status = statusLine\n } else {\n status = statusLine.substr(0, delimiterPos)\n msg = statusLine.substr(delimiterPos + 1)\n }\n\n let typedStatus = Number(status)\n if (Number.isNaN(typedStatus)) {\n typedStatus = 0\n }\n\n if (msg && msg.indexOf('\\n') !== -1) {\n msg = msg.split('\\n')[0]\n }\n\n this.logger.info('Received status', typedStatus, msg)\n\n return {\n status: typedStatus,\n statusText: msg,\n remaining,\n }\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export { HttpResponseParser, RequestState, type ResponseInfo, type ParserCallbacks } from './HttpResponseParser.js';
2
+ export { StatusParser, type StatusParseResult } from './StatusParser.js';
3
+ export { HeadersParser, type HeadersParseResult } from './HeadersParser.js';
4
+ export { BodyParser, type BodyCompleteCallback } from './BodyParser.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACnH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { HttpResponseParser, RequestState } from './HttpResponseParser.js';
2
+ export { StatusParser } from './StatusParser.js';
3
+ export { HeadersParser } from './HeadersParser.js';
4
+ export { BodyParser } from './BodyParser.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAA2C,MAAM,yBAAyB,CAAA;AACnH,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAA6B,MAAM,iBAAiB,CAAA","sourcesContent":["export { HttpResponseParser, RequestState, type ResponseInfo, type ParserCallbacks } from './HttpResponseParser.js'\nexport { StatusParser, type StatusParseResult } from './StatusParser.js'\nexport { HeadersParser, type HeadersParseResult } from './HeadersParser.js'\nexport { BodyParser, type BodyCompleteCallback } from './BodyParser.js'\n"]}
@@ -0,0 +1,22 @@
1
+ import { Response } from '../../../models/Response.js';
2
+ import { Headers } from '../../../lib/headers/Headers.js';
3
+ export interface ResponseProcessingContext {
4
+ status: number;
5
+ currentResponse?: Response;
6
+ currentHeaders?: Headers;
7
+ followRedirects: boolean;
8
+ auth?: {
9
+ method: string;
10
+ };
11
+ aborted: boolean;
12
+ }
13
+ export interface ResponseProcessingResult {
14
+ shouldContinue: boolean;
15
+ action: 'redirect' | 'auth' | 'publish' | 'abort';
16
+ data?: Record<string, unknown>;
17
+ }
18
+ /**
19
+ * Process the response and determine the next action
20
+ */
21
+ export declare function processResponse(context: ResponseProcessingContext): ResponseProcessingResult;
22
+ //# sourceMappingURL=ResponseProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponseProcessor.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/response/ResponseProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAGzD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,QAAQ,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,yBAAyB,GAAG,wBAAwB,CAuB5F"}
@@ -0,0 +1,25 @@
1
+ import { isRedirect, STATUS_UNAUTHORIZED } from '../constants.js';
2
+ /**
3
+ * Process the response and determine the next action
4
+ */
5
+ export function processResponse(context) {
6
+ const { status, followRedirects, auth, aborted } = context;
7
+ if (aborted) {
8
+ return { shouldContinue: false, action: 'abort' };
9
+ }
10
+ // Handle redirects
11
+ if (isRedirect(status)) {
12
+ if (followRedirects) {
13
+ return { shouldContinue: false, action: 'redirect', data: { status } };
14
+ }
15
+ }
16
+ // Handle authentication challenges
17
+ if (status === STATUS_UNAUTHORIZED && auth) {
18
+ if (auth.method === 'ntlm') {
19
+ return { shouldContinue: false, action: 'auth', data: { method: 'ntlm' } };
20
+ }
21
+ }
22
+ // Normal response - publish it
23
+ return { shouldContinue: false, action: 'publish' };
24
+ }
25
+ //# sourceMappingURL=ResponseProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponseProcessor.js","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/response/ResponseProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAiBjE;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAkC;IAChE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAE1D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IACnD,CAAC;IAED,mBAAmB;IACnB,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAA;QACxE,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,KAAK,mBAAmB,IAAI,IAAI,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAA;QAC5E,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AACrD,CAAC","sourcesContent":["import { Response } from '../../../models/Response.js'\nimport { Headers } from '../../../lib/headers/Headers.js'\nimport { isRedirect, STATUS_UNAUTHORIZED } from '../constants.js'\n\nexport interface ResponseProcessingContext {\n status: number\n currentResponse?: Response\n currentHeaders?: Headers\n followRedirects: boolean\n auth?: { method: string }\n aborted: boolean\n}\n\nexport interface ResponseProcessingResult {\n shouldContinue: boolean\n action: 'redirect' | 'auth' | 'publish' | 'abort'\n data?: Record<string, unknown>\n}\n\n/**\n * Process the response and determine the next action\n */\nexport function processResponse(context: ResponseProcessingContext): ResponseProcessingResult {\n const { status, followRedirects, auth, aborted } = context\n\n if (aborted) {\n return { shouldContinue: false, action: 'abort' }\n }\n\n // Handle redirects\n if (isRedirect(status)) {\n if (followRedirects) {\n return { shouldContinue: false, action: 'redirect', data: { status } }\n }\n }\n\n // Handle authentication challenges\n if (status === STATUS_UNAUTHORIZED && auth) {\n if (auth.method === 'ntlm') {\n return { shouldContinue: false, action: 'auth', data: { method: 'ntlm' } }\n }\n }\n\n // Normal response - publish it\n return { shouldContinue: false, action: 'publish' }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export { processResponse, type ResponseProcessingContext, type ResponseProcessingResult } from './ResponseProcessor.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,yBAAyB,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { processResponse } from './ResponseProcessor.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAiE,MAAM,wBAAwB,CAAA","sourcesContent":["export { processResponse, type ResponseProcessingContext, type ResponseProcessingResult } from './ResponseProcessor.js'\n"]}
@@ -0,0 +1,7 @@
1
+ import { RequestTime } from '../../../models/RequestTime.js';
2
+ import type { RequestStats } from '../CoreEngine.js';
3
+ /**
4
+ * Creates HAR 1.2 timings object from stats.
5
+ */
6
+ export declare function computeStats(stats: RequestStats): RequestTime;
7
+ //# sourceMappingURL=StatisticsProcessor.d.ts.map