@api-client/core 0.18.12 → 0.18.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/browser.d.ts +0 -3
- package/build/src/browser.d.ts.map +1 -1
- package/build/src/browser.js +0 -3
- package/build/src/browser.js.map +1 -1
- package/build/src/index.d.ts +2 -5
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js +2 -5
- package/build/src/index.js.map +1 -1
- package/build/src/lib/logging/DefaultLogger.d.ts +14 -0
- package/build/src/lib/logging/DefaultLogger.d.ts.map +1 -1
- package/build/src/lib/logging/DefaultLogger.js +27 -0
- package/build/src/lib/logging/DefaultLogger.js.map +1 -1
- package/build/src/lib/logging/index.d.ts +4 -0
- package/build/src/lib/logging/index.d.ts.map +1 -0
- package/build/src/lib/logging/index.js +10 -0
- package/build/src/lib/logging/index.js.map +1 -0
- package/build/src/modeling/DomainValidation.d.ts +78 -0
- package/build/src/modeling/DomainValidation.d.ts.map +1 -1
- package/build/src/modeling/DomainValidation.js +78 -0
- package/build/src/modeling/DomainValidation.js.map +1 -1
- package/build/src/modeling/validation/entity_validation.d.ts +17 -3
- package/build/src/modeling/validation/entity_validation.d.ts.map +1 -1
- package/build/src/modeling/validation/entity_validation.js +51 -10
- package/build/src/modeling/validation/entity_validation.js.map +1 -1
- package/build/src/models/ClientCertificate.d.ts +1 -1
- package/build/src/models/ClientCertificate.js.map +1 -1
- package/build/src/models/RequestConfig.d.ts +1 -1
- package/build/src/models/RequestConfig.js.map +1 -1
- package/build/src/models/SerializableError.d.ts +1 -1
- package/build/src/models/SerializableError.d.ts.map +1 -1
- package/build/src/models/SerializableError.js.map +1 -1
- package/build/src/proxy/RequestProxy.d.ts.map +1 -1
- package/build/src/proxy/RequestProxy.js +2 -2
- package/build/src/proxy/RequestProxy.js.map +1 -1
- package/build/src/runtime/http-engine/CoreEngine.d.ts +218 -139
- package/build/src/runtime/http-engine/CoreEngine.d.ts.map +1 -1
- package/build/src/runtime/http-engine/CoreEngine.js +716 -870
- package/build/src/runtime/http-engine/CoreEngine.js.map +1 -1
- package/build/src/runtime/http-engine/PayloadSupport.d.ts.map +1 -1
- package/build/src/runtime/http-engine/PayloadSupport.js +2 -1
- package/build/src/runtime/http-engine/PayloadSupport.js.map +1 -1
- package/build/src/runtime/http-engine/auth/AuthManager.d.ts +73 -0
- package/build/src/runtime/http-engine/auth/AuthManager.d.ts.map +1 -0
- package/build/src/runtime/http-engine/auth/AuthManager.js +186 -0
- package/build/src/runtime/http-engine/auth/AuthManager.js.map +1 -0
- package/build/src/runtime/http-engine/auth/index.d.ts +2 -0
- package/build/src/runtime/http-engine/auth/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/auth/index.js +2 -0
- package/build/src/runtime/http-engine/auth/index.js.map +1 -0
- package/build/src/runtime/http-engine/certificates/CertificateManager.d.ts +11 -0
- package/build/src/runtime/http-engine/certificates/CertificateManager.d.ts.map +1 -0
- package/build/src/runtime/http-engine/certificates/CertificateManager.js +76 -0
- package/build/src/runtime/http-engine/certificates/CertificateManager.js.map +1 -0
- package/build/src/runtime/http-engine/certificates/index.d.ts +2 -0
- package/build/src/runtime/http-engine/certificates/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/certificates/index.js +2 -0
- package/build/src/runtime/http-engine/certificates/index.js.map +1 -0
- package/build/src/runtime/http-engine/compression/CompressionManager.d.ts +25 -0
- package/build/src/runtime/http-engine/compression/CompressionManager.d.ts.map +1 -0
- package/build/src/runtime/http-engine/compression/CompressionManager.js +89 -0
- package/build/src/runtime/http-engine/compression/CompressionManager.js.map +1 -0
- package/build/src/runtime/http-engine/compression/index.d.ts +2 -0
- package/build/src/runtime/http-engine/compression/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/compression/index.js +2 -0
- package/build/src/runtime/http-engine/compression/index.js.map +1 -0
- package/build/src/runtime/http-engine/connections/ConnectionManager.d.ts +57 -0
- package/build/src/runtime/http-engine/connections/ConnectionManager.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/ConnectionManager.js +78 -0
- package/build/src/runtime/http-engine/connections/ConnectionManager.js.map +1 -0
- package/build/src/runtime/http-engine/connections/DigestAuthHandler.d.ts +70 -0
- package/build/src/runtime/http-engine/connections/DigestAuthHandler.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/DigestAuthHandler.js +184 -0
- package/build/src/runtime/http-engine/connections/DigestAuthHandler.js.map +1 -0
- package/build/src/runtime/http-engine/connections/DirectConnection.d.ts +22 -0
- package/build/src/runtime/http-engine/connections/DirectConnection.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/DirectConnection.js +105 -0
- package/build/src/runtime/http-engine/connections/DirectConnection.js.map +1 -0
- package/build/src/runtime/http-engine/connections/ProxyAuthHandler.d.ts +60 -0
- package/build/src/runtime/http-engine/connections/ProxyAuthHandler.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/ProxyAuthHandler.js +138 -0
- package/build/src/runtime/http-engine/connections/ProxyAuthHandler.js.map +1 -0
- package/build/src/runtime/http-engine/connections/ProxyConnection.d.ts +14 -0
- package/build/src/runtime/http-engine/connections/ProxyConnection.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/ProxyConnection.js +47 -0
- package/build/src/runtime/http-engine/connections/ProxyConnection.js.map +1 -0
- package/build/src/runtime/http-engine/connections/TunnelConnection.d.ts +13 -0
- package/build/src/runtime/http-engine/connections/TunnelConnection.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/TunnelConnection.js +175 -0
- package/build/src/runtime/http-engine/connections/TunnelConnection.js.map +1 -0
- package/build/src/runtime/http-engine/connections/index.d.ts +7 -0
- package/build/src/runtime/http-engine/connections/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/connections/index.js +7 -0
- package/build/src/runtime/http-engine/connections/index.js.map +1 -0
- package/build/src/runtime/http-engine/constants.d.ts +69 -0
- package/build/src/runtime/http-engine/constants.d.ts.map +1 -0
- package/build/src/runtime/http-engine/constants.js +90 -0
- package/build/src/runtime/http-engine/constants.js.map +1 -0
- package/build/src/runtime/http-engine/cookies/CookieProcessor.d.ts +5 -0
- package/build/src/runtime/http-engine/cookies/CookieProcessor.d.ts.map +1 -0
- package/build/src/runtime/http-engine/cookies/CookieProcessor.js +20 -0
- package/build/src/runtime/http-engine/cookies/CookieProcessor.js.map +1 -0
- package/build/src/runtime/http-engine/cookies/index.d.ts +2 -0
- package/build/src/runtime/http-engine/cookies/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/cookies/index.js +2 -0
- package/build/src/runtime/http-engine/cookies/index.js.map +1 -0
- package/build/src/runtime/http-engine/errors/HttpEngineErrors.d.ts +156 -0
- package/build/src/runtime/http-engine/errors/HttpEngineErrors.d.ts.map +1 -0
- package/build/src/runtime/http-engine/errors/HttpEngineErrors.js +227 -0
- package/build/src/runtime/http-engine/errors/HttpEngineErrors.js.map +1 -0
- package/build/src/runtime/http-engine/errors/index.d.ts +2 -0
- package/build/src/runtime/http-engine/errors/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/errors/index.js +2 -0
- package/build/src/runtime/http-engine/errors/index.js.map +1 -0
- package/build/src/runtime/http-engine/message/MessageBuilder.d.ts +66 -0
- package/build/src/runtime/http-engine/message/MessageBuilder.d.ts.map +1 -0
- package/build/src/runtime/http-engine/message/MessageBuilder.js +161 -0
- package/build/src/runtime/http-engine/message/MessageBuilder.js.map +1 -0
- package/build/src/runtime/http-engine/message/MessageProcessor.d.ts +27 -0
- package/build/src/runtime/http-engine/message/MessageProcessor.d.ts.map +1 -0
- package/build/src/runtime/http-engine/message/MessageProcessor.js +51 -0
- package/build/src/runtime/http-engine/message/MessageProcessor.js.map +1 -0
- package/build/src/runtime/http-engine/message/index.d.ts +3 -0
- package/build/src/runtime/http-engine/message/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/message/index.js +3 -0
- package/build/src/runtime/http-engine/message/index.js.map +1 -0
- package/build/src/runtime/http-engine/ntlm/NtlmAuth.d.ts +2 -8
- package/build/src/runtime/http-engine/ntlm/NtlmAuth.d.ts.map +1 -1
- package/build/src/runtime/http-engine/ntlm/NtlmAuth.js +11 -5
- package/build/src/runtime/http-engine/ntlm/NtlmAuth.js.map +1 -1
- package/build/src/runtime/http-engine/ntlm/NtlmMessage.js +6 -6
- package/build/src/runtime/http-engine/ntlm/NtlmMessage.js.map +1 -1
- package/build/src/runtime/http-engine/parsers/BodyParser.d.ts +39 -0
- package/build/src/runtime/http-engine/parsers/BodyParser.d.ts.map +1 -0
- package/build/src/runtime/http-engine/parsers/BodyParser.js +145 -0
- package/build/src/runtime/http-engine/parsers/BodyParser.js.map +1 -0
- package/build/src/runtime/http-engine/parsers/HeadersParser.d.ts +29 -0
- package/build/src/runtime/http-engine/parsers/HeadersParser.d.ts.map +1 -0
- package/build/src/runtime/http-engine/parsers/HeadersParser.js +88 -0
- package/build/src/runtime/http-engine/parsers/HeadersParser.js.map +1 -0
- package/build/src/runtime/http-engine/parsers/HttpResponseParser.d.ts +91 -0
- package/build/src/runtime/http-engine/parsers/HttpResponseParser.d.ts.map +1 -0
- package/build/src/runtime/http-engine/parsers/HttpResponseParser.js +236 -0
- package/build/src/runtime/http-engine/parsers/HttpResponseParser.js.map +1 -0
- package/build/src/runtime/http-engine/parsers/StatusParser.d.ts +20 -0
- package/build/src/runtime/http-engine/parsers/StatusParser.d.ts.map +1 -0
- package/build/src/runtime/http-engine/parsers/StatusParser.js +51 -0
- package/build/src/runtime/http-engine/parsers/StatusParser.js.map +1 -0
- package/build/src/runtime/http-engine/parsers/index.d.ts +5 -0
- package/build/src/runtime/http-engine/parsers/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/parsers/index.js +5 -0
- package/build/src/runtime/http-engine/parsers/index.js.map +1 -0
- package/build/src/runtime/http-engine/response/ResponseProcessor.d.ts +22 -0
- package/build/src/runtime/http-engine/response/ResponseProcessor.d.ts.map +1 -0
- package/build/src/runtime/http-engine/response/ResponseProcessor.js +25 -0
- package/build/src/runtime/http-engine/response/ResponseProcessor.js.map +1 -0
- package/build/src/runtime/http-engine/response/index.d.ts +2 -0
- package/build/src/runtime/http-engine/response/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/response/index.js +2 -0
- package/build/src/runtime/http-engine/response/index.js.map +1 -0
- package/build/src/runtime/http-engine/statistics/StatisticsProcessor.d.ts +7 -0
- package/build/src/runtime/http-engine/statistics/StatisticsProcessor.d.ts.map +1 -0
- package/build/src/runtime/http-engine/statistics/StatisticsProcessor.js +40 -0
- package/build/src/runtime/http-engine/statistics/StatisticsProcessor.js.map +1 -0
- package/build/src/runtime/http-engine/statistics/index.d.ts +2 -0
- package/build/src/runtime/http-engine/statistics/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/statistics/index.js +2 -0
- package/build/src/runtime/http-engine/statistics/index.js.map +1 -0
- package/build/src/runtime/http-engine/url/UrlProcessor.d.ts +24 -0
- package/build/src/runtime/http-engine/url/UrlProcessor.d.ts.map +1 -0
- package/build/src/runtime/http-engine/url/UrlProcessor.js +50 -0
- package/build/src/runtime/http-engine/url/UrlProcessor.js.map +1 -0
- package/build/src/runtime/http-engine/url/index.d.ts +2 -0
- package/build/src/runtime/http-engine/url/index.d.ts.map +1 -0
- package/build/src/runtime/http-engine/url/index.js +2 -0
- package/build/src/runtime/http-engine/url/index.js.map +1 -0
- package/build/src/runtime/http-runner/HttpRequestRunner.d.ts +3 -3
- package/build/src/runtime/http-runner/HttpRequestRunner.d.ts.map +1 -1
- package/build/src/runtime/http-runner/HttpRequestRunner.js.map +1 -1
- package/build/src/runtime/node/InteropInterfaces.d.ts +3 -3
- package/build/src/runtime/node/InteropInterfaces.d.ts.map +1 -1
- package/build/src/runtime/node/InteropInterfaces.js.map +1 -1
- package/build/src/runtime/node/ProjectRequestRunner.d.ts +2 -2
- package/build/src/runtime/node/ProjectRequestRunner.d.ts.map +1 -1
- package/build/src/runtime/node/ProjectRequestRunner.js.map +1 -1
- package/build/src/runtime/node/ProjectRunner.d.ts.map +1 -1
- package/build/src/runtime/node/ProjectRunner.js +2 -2
- package/build/src/runtime/node/ProjectRunner.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/lib/logging/DefaultLogger.ts +32 -0
- package/src/modeling/DomainValidation.ts +78 -0
- package/src/modeling/validation/entity_validation.ts +59 -10
- package/src/models/ClientCertificate.ts +1 -1
- package/src/models/RequestConfig.ts +1 -1
- package/src/models/SerializableError.ts +1 -1
- package/src/proxy/RequestProxy.ts +2 -2
- package/src/runtime/http-engine/CoreEngine.ts +858 -893
- package/src/runtime/http-engine/PayloadSupport.ts +2 -1
- package/src/runtime/http-engine/auth/AuthManager.ts +242 -0
- package/src/runtime/http-engine/certificates/CertificateManager.ts +74 -0
- package/src/runtime/http-engine/compression/CompressionManager.ts +99 -0
- package/src/runtime/http-engine/connections/ConnectionManager.ts +123 -0
- package/src/runtime/http-engine/connections/DigestAuthHandler.ts +238 -0
- package/src/runtime/http-engine/connections/DirectConnection.ts +134 -0
- package/src/runtime/http-engine/connections/ProxyAuthHandler.ts +179 -0
- package/src/runtime/http-engine/connections/ProxyConnection.ts +55 -0
- package/src/runtime/http-engine/connections/TunnelConnection.ts +192 -0
- package/src/runtime/http-engine/constants.ts +103 -0
- package/src/runtime/http-engine/cookies/CookieProcessor.ts +25 -0
- package/src/runtime/http-engine/errors/HttpEngineErrors.ts +319 -0
- package/src/runtime/http-engine/message/MessageBuilder.ts +201 -0
- package/src/runtime/http-engine/message/MessageProcessor.ts +73 -0
- package/src/runtime/http-engine/ntlm/NtlmAuth.ts +16 -13
- package/src/runtime/http-engine/ntlm/NtlmMessage.ts +6 -6
- package/src/runtime/http-engine/parsers/BodyParser.ts +171 -0
- package/src/runtime/http-engine/parsers/HeadersParser.ts +103 -0
- package/src/runtime/http-engine/parsers/HttpResponseParser.ts +280 -0
- package/src/runtime/http-engine/parsers/StatusParser.ts +69 -0
- package/src/runtime/http-engine/response/ResponseProcessor.ts +46 -0
- package/src/runtime/http-engine/statistics/StatisticsProcessor.ts +52 -0
- package/src/runtime/http-engine/url/UrlProcessor.ts +55 -0
- package/src/runtime/http-runner/HttpRequestRunner.ts +3 -3
- package/src/runtime/node/InteropInterfaces.ts +3 -3
- package/src/runtime/node/ProjectRequestRunner.ts +2 -2
- package/src/runtime/node/ProjectRunner.ts +2 -2
- package/tests/servers/ProxyServer.ts +32 -19
- package/tests/servers/express-routes/ApiEndpoint.ts +24 -0
- package/tests/servers/express-routes/BasicAuthRoute.ts +36 -0
- package/tests/servers/express-routes/BearerAuthRoute.ts +35 -0
- package/tests/servers/express-routes/NTLMRoute.ts +2 -3
- package/tests/servers/express-routes/PostApi.ts +15 -2
- package/tests/servers/express-routes/RedirectsApi.ts +12 -1
- package/tests/servers/express-routes/ResponsesApi.ts +1 -1
- package/tests/servers/express-routes/StreamApi.ts +19 -0
- package/tests/servers/oauth2mock/ServerMock.js +1 -1
- package/tests/unit/modeling/validation/entity_validation.spec.ts +95 -0
- package/tests/unit/runtime/http-engine/HttpResponseParser.spec.ts +337 -0
- package/tests/unit/runtime/http-engine/abort.spec.ts +4 -5
- package/tests/unit/runtime/http-engine/auth.spec.ts +7 -58
- package/tests/unit/runtime/http-engine/certificates/CertificateManager.spec.ts +482 -0
- package/tests/unit/runtime/http-engine/certificates.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/compression/CompressionManager.spec.ts +498 -0
- package/tests/unit/runtime/http-engine/compression.spec.ts +3 -72
- package/tests/unit/runtime/http-engine/connections/ConnectionManager.spec.ts +379 -0
- package/tests/unit/runtime/http-engine/connections/DigestAuthHandler.spec.ts +164 -0
- package/tests/unit/runtime/http-engine/core_engine.spec.ts +561 -0
- package/tests/unit/runtime/http-engine/engine_statuses.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/events.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/headers.spec.ts +2 -88
- package/tests/unit/runtime/http-engine/hosts.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/http-get.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/http-post.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/logger.spec.ts +0 -8
- package/tests/unit/runtime/http-engine/message.spec.ts +2 -194
- package/tests/unit/runtime/http-engine/params.spec.ts +4 -4
- package/tests/unit/runtime/http-engine/proxy.spec.ts +15 -14
- package/tests/unit/runtime/http-engine/redirects.spec.ts +2 -2
- package/tests/unit/runtime/http-engine/responses.spec.ts +170 -277
- package/tests/unit/runtime/http-engine/timeout.spec.ts +3 -3
- package/tests/unit/runtime/http-engine/timings.spec.ts +2 -2
- package/tests/unit/runtime/proxy/HttpProjectProxy.spec.ts +25 -28
- package/tests/unit/runtime/runners/project_runner.spec.ts +2 -2
- package/tests/unit/runtime/runners/request_runner.spec.ts +2 -2
- package/build/src/runtime/http-engine/HttpEngine.d.ts +0 -311
- package/build/src/runtime/http-engine/HttpEngine.d.ts.map +0 -1
- package/build/src/runtime/http-engine/HttpEngine.js +0 -802
- package/build/src/runtime/http-engine/HttpEngine.js.map +0 -1
- package/src/runtime/http-engine/HttpEngine.ts +0 -952
- package/tests/unit/runtime/http-engine/connecting.spec.ts +0 -140
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoreEngine.js","sourceRoot":"","sources":["../../../../src/runtime/http-engine/CoreEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import net from 'net'\nimport tls from 'tls'\nimport http from 'http'\nimport https from 'https'\nimport { HttpEngine, HttpEngineOptions, HeadersReceivedDetail } from './HttpEngine.js'\nimport { IRequestLog } from '../../models/RequestLog.js'\nimport { IHttpRequest } from '../../models/HttpRequest.js'\nimport { Response } from '../../models/Response.js'\nimport { SerializableError } from '../../models/SerializableError.js'\nimport { Headers } from '../../lib/headers/Headers.js'\nimport * as PayloadSupport from './PayloadSupport.js'\nimport { addContentLength, getPort } from './RequestUtils.js'\nimport { INtlmAuthorization } from '../../models/Authorization.js'\nimport { NtlmAuth, INtlmAuthConfig } from './ntlm/NtlmAuth.js'\nimport { PayloadSerializer } from '../../lib/transformers/PayloadSerializer.js'\nimport { ResponseRedirect } from '../../models/ResponseRedirect.js'\n\nconst nlBuffer = Buffer.from([13, 10])\nconst nlNlBuffer = Buffer.from([13, 10, 13, 10])\n\nexport enum RequestState {\n Status,\n Headers,\n Body,\n Done,\n}\n\ninterface ResponseInfo {\n contentLength?: number\n chunked: boolean\n body?: Buffer\n chunk?: Buffer\n chunkSize?: number\n}\n\n/**\n * API Client's HTTP engine.\n * An HTTP 1.1 engine working directly on the socket. It communicates with the remote machine and\n * collects stats about the request and response.\n */\nexport class CoreEngine extends HttpEngine {\n state = RequestState.Status\n rawHeaders?: Buffer\n _hostTestReg = /^\\s*host\\s*:/im\n\n responseInfo: ResponseInfo\n hasProxy: boolean\n isProxyTunnel: boolean\n isProxySsl: boolean\n\n constructor(request: IHttpRequest, opts: HttpEngineOptions = {}) {\n super(request, opts)\n this.responseInfo = {\n chunked: false,\n }\n this.hasProxy = !!this.opts.proxy\n this.isProxyTunnel = this.hasProxy && this.request.url.startsWith('https:')\n this.isProxySsl = !!this.opts.proxy && this.opts.proxy.startsWith('https:')\n }\n\n /**\n * Sends the request\n */\n async send(): Promise<IRequestLog> {\n const promise = this.wrapExecution()\n this.sendRequest()\n return promise\n }\n\n private async sendRequest(): Promise<void> {\n try {\n if (this.hasProxy) {\n await this.connectProxy()\n } else {\n await this.connect()\n }\n if (!this.socket || this.aborted) {\n return\n }\n const message = await this.prepareMessage()\n await this.writeMessage(message)\n } catch (cause) {\n const e = cause as SerializableError\n const err = new SerializableError(e.message, { cause: e })\n if (e.code || e.code === 0) {\n err.code = e.code as string\n }\n this.abort()\n this._errorRequest({\n message: err.message,\n code: err.code,\n })\n throw cause\n }\n }\n\n /**\n * Cleans the state after finished.\n */\n override _cleanUp(): void {\n super._cleanUp()\n this.state = RequestState.Status\n this.rawHeaders = undefined\n this.responseInfo = {\n chunked: false,\n }\n }\n\n /**\n * Cleans up the state for redirect.\n */\n override _cleanUpRedirect(): void {\n super._cleanUpRedirect()\n this.state = RequestState.Status\n this.rawHeaders = undefined\n this.responseInfo = {\n chunked: false,\n }\n }\n\n /**\n * Prepares an HTTP message from API Client's request object.\n *\n * @returns Resolved promise to an `ArrayBuffer`.\n */\n async prepareMessage(): Promise<Buffer> {\n let payload = this.request.payload\n if (['get', 'head'].includes(this.request.method.toLowerCase())) {\n payload = undefined\n }\n const headers = new Headers(this.request.toHeadersString())\n this.prepareHeaders(headers, !!payload)\n const auth = this.hasProxy && !this.isProxyTunnel ? this._proxyAuthHeader() : undefined\n if (auth) {\n headers.set('proxy-authorization', auth)\n }\n const buffer = PayloadSupport.payloadToBuffer(headers, payload)\n if (buffer) {\n addContentLength(this.request.method || 'GET', buffer, headers)\n }\n\n this._handleAuthorization(headers)\n this.sentRequest.headers = headers.toString()\n const message = this._prepareMessage(headers, buffer)\n if (this.auth) {\n // This restores altered by authorization original headers\n // so it can be safe to use when redirecting\n if (this.auth.headers) {\n this.request.headers = this.auth.headers\n delete this.auth.headers\n }\n }\n return message\n }\n\n /**\n * Sends a data to a socket.\n *\n * @param buffer HTTP message to send\n */\n writeMessage(buffer: Buffer): Promise<void> {\n this.logger.debug(`Writing the message to the socket...`)\n let msg = buffer.toString()\n const limit = this.opts.sentMessageLimit\n if (limit && limit > 0 && msg.length >= limit) {\n msg = msg.substr(0, limit)\n msg += ' ...'\n }\n this.sentRequest.httpMessage = msg\n const startTime = Date.now()\n this.stats.startTime = startTime\n this.sentRequest.startTime = startTime\n\n this.stats.messageStart = Date.now()\n return new Promise((resolve) => {\n this.socket?.write(buffer, () => {\n this.logger.debug(`The message has been sent.`)\n this.stats.sentTime = Date.now()\n try {\n this.emit('loadstart')\n } catch {\n //\n }\n resolve()\n })\n })\n }\n\n /**\n * Connects to a server and sends the message.\n *\n * @returns Promise resolved when socket is connected.\n */\n async connect(): Promise<net.Socket> {\n const port = getPort(this.uri.port, this.uri.protocol)\n const host = this.uri.hostname\n let socket\n if (port === 443 || this.uri.protocol === 'https:') {\n socket = await this._connectTls(port, host)\n } else {\n socket = await this._connect(port, host)\n }\n const { timeout } = this\n if (timeout > 0) {\n socket.setTimeout(timeout)\n }\n this.socket = socket\n this._addSocketListeners(socket)\n socket.resume()\n return socket\n }\n\n /**\n * Connects to a server and writes a message using insecure connection.\n *\n * @param port A port number to connect to.\n * @param host A host name to connect to\n * @returns A promise resolved when the message was sent to a server\n */\n _connect(port: number, host: string): Promise<net.Socket> {\n this.logger.debug('Opening an HTTP connection...')\n return new Promise((resolve, reject) => {\n this.stats.connectionTime = Date.now()\n const isIp = net.isIP(host)\n if (isIp) {\n this.stats.lookupTime = Date.now()\n }\n const client = net.createConnection(port, host, () => {\n this.logger.debug('HTTP connection established.')\n this.stats.connectedTime = Date.now()\n resolve(client)\n })\n client.pause()\n if (!isIp) {\n client.once('lookup', () => {\n this.stats.lookupTime = Date.now()\n })\n }\n client.once('error', (err: Error) => reject(err))\n })\n }\n\n /**\n * Connects to a server and writes a message using secured connection.\n *\n * @param port A port number to connect to.\n * @param host A host name to connect to\n * @returns A promise resolved when the message was sent to a server\n */\n _connectTls(port: number, host: string): Promise<tls.TLSSocket> {\n this.logger.debug('Opening an SSL connection...')\n const { opts } = this\n const options: tls.ConnectionOptions = {}\n const isIp = net.isIP(host)\n if (!isIp) {\n options.servername = host\n }\n if (opts.validateCertificates) {\n options.checkServerIdentity = this._checkServerIdentity.bind(this)\n } else {\n options.rejectUnauthorized = false\n options.checkServerIdentity = (): Error | undefined => {\n return undefined\n }\n // target.requestOCSP = false;\n }\n const certs = this.opts.certificates\n if (Array.isArray(certs)) {\n certs.forEach((cert) => this._addClientCertificate(cert, options))\n }\n return new Promise((resolve, reject) => {\n const time = Date.now()\n this.stats.connectionTime = time\n if (isIp) {\n this.stats.lookupTime = time\n }\n const client = tls.connect(port, host, options, () => {\n this.logger.debug('SSL connection established.')\n const connectTime = Date.now()\n this.stats.connectedTime = connectTime\n this.stats.secureStartTime = connectTime\n resolve(client)\n })\n client.pause()\n client.once('error', (e: Error) => reject(e))\n if (!isIp) {\n client.once('lookup', () => {\n this.stats.lookupTime = Date.now()\n })\n }\n client.once('secureConnect', () => {\n this.stats.secureConnectedTime = Date.now()\n })\n })\n }\n\n /**\n * Prepares a full HTTP message body\n *\n * @param httpHeaders The list ogf headers to append.\n * @param buffer The buffer with the HTTP message\n * @returns The Buffer of the HTTP message\n */\n _prepareMessage(httpHeaders: Headers, buffer?: Buffer): Buffer {\n this.logger.debug('Preparing an HTTP message...')\n const headers = []\n // const search = this.uri.search;\n // let path = this.uri.pathname;\n // if (search) {\n // path += search;\n // }\n // headers.push(`${this.arcRequest.method} ${path} HTTP/1.1`);\n const status = this._createHttpStatus()\n this.logger.debug(`Created message status: ${status}`)\n headers.push(status)\n if (this._hostRequired()) {\n this.logger.debug(`Adding the \"host\" header: ${this.hostHeader}`)\n headers.push(`Host: ${this.hostHeader}`)\n }\n let str = headers.join('\\r\\n')\n const addHeaders = httpHeaders.toString()\n if (addHeaders) {\n this.logger.debug(`Adding headers to the request...`)\n str += '\\r\\n'\n str += PayloadSupport.normalizeString(addHeaders)\n }\n const startBuffer = Buffer.from(str, 'utf8')\n const endBuffer = Buffer.from(new Uint8Array([13, 10, 13, 10]))\n let body\n let sum = startBuffer.length + endBuffer.length\n if (buffer) {\n sum += buffer.length\n body = Buffer.concat([startBuffer, endBuffer, buffer], sum)\n } else {\n body = Buffer.concat([startBuffer, endBuffer], sum)\n }\n this.logger.debug(`The message is ready.`)\n return body\n }\n\n /**\n * Creates an HTTP status line for the message.\n * For proxy connections it, depending whether target is SSL or not, sets the path\n * as the full URL or just the authority.\n * @returns The generates status message.\n */\n _createHttpStatus(): string {\n const { request, uri, hasProxy, isProxyTunnel } = this\n const parts = [request.method]\n if (hasProxy && !isProxyTunnel) {\n // if (isProxyTunnel) {\n // // when a tunnel then the target is over SSL so the default port is 443.\n // parts.push(`${uri.hostname}:${uri.port || 443}`);\n // } else {\n // parts.push(arcRequest.url);\n // }\n parts.push(request.url)\n } else {\n let path = uri.pathname\n if (uri.search) {\n path += uri.search\n }\n parts.push(path)\n }\n\n parts.push('HTTP/1.1')\n return parts.join(' ')\n }\n\n /**\n * Tests if current connection is required to add `host` header.\n * It returns `false` only if `host` header has been already provided.\n *\n * @returns True when the `host` header should be added to the headers list.\n */\n _hostRequired(): boolean {\n const headers = this.request.headers\n if (typeof headers !== 'string') {\n return true\n }\n return !this._hostTestReg.test(headers)\n }\n\n /**\n * Alters authorization header depending on the `auth` object\n * @param headers A headers object where to append headers when needed\n */\n _handleAuthorization(headers: Headers): void {\n const { authorization } = this.opts\n const enabled = Array.isArray(authorization) ? authorization.filter((i) => i.enabled) : []\n if (!enabled.length) {\n return\n }\n const ntlm = enabled.find((i) => i.type === 'ntlm')\n if (ntlm) {\n this._authorizeNtlm(ntlm.config as INtlmAuthorization, headers)\n }\n }\n\n /**\n * Authorize the request with NTLM\n * @param authData Credentials to use\n * @param headers A headers object where to append headers if needed\n */\n _authorizeNtlm(authData: INtlmAuthorization, headers: Headers): void {\n const init = { ...authData, url: this.request.url } as INtlmAuthConfig\n const auth = new NtlmAuth(init)\n if (!this.auth) {\n this.auth = {\n method: 'ntlm',\n state: 0,\n headers: headers.toString(),\n }\n const msg = auth.createMessage1(this.uri.host)\n headers.set('Authorization', `NTLM ${msg.toBase64()}`)\n headers.set('Connection', 'keep-alive')\n } else if (this.auth && this.auth.state === 1) {\n const msg = auth.createMessage3(this.auth.challengeHeader as string, this.uri.host)\n this.auth.state = 2\n headers.set('Authorization', `NTLM ${msg.toBase64()}`)\n }\n }\n\n /**\n * Add event listeners to existing socket.\n * @param socket An instance of the socket.\n * @return The same socket. Used for chaining.\n */\n _addSocketListeners(socket: net.Socket): net.Socket {\n let received = false\n socket.on('data', (data) => {\n this.logger.debug(`Received server data from the socket...`)\n if (!received) {\n const now = Date.now()\n this.stats.firstReceiveTime = now\n this.emit('firstbyte')\n received = true\n }\n data = Buffer.from(data)\n try {\n this._processSocketMessage(data)\n } catch (e) {\n const err = e as Error\n this._errorRequest({\n message: err.message || 'Unknown error occurred',\n })\n return\n }\n })\n socket.once('timeout', () => {\n this.state = RequestState.Done\n this._errorRequest(new Error('Connection timeout.'))\n socket.destroy()\n })\n socket.on('end', () => {\n this.logger.debug(`Server connection ended.`)\n socket.removeAllListeners('timeout')\n socket.removeAllListeners('error')\n const endTime = Date.now()\n this.stats.lastReceivedTime = endTime\n this.sentRequest.endTime = endTime\n if (this.state !== RequestState.Done) {\n if (!this.currentResponse) {\n this.logger.error(`Connection closed without receiving any data.`)\n // The parser haven't found the end of message so there was no message!\n const e = new SerializableError('Connection closed without receiving any data', 100)\n this._errorRequest(e)\n } else {\n // There is an issue with the response. Size mismatch? Anyway,\n // it tries to create a response from current data.\n this.emit('loadend')\n this._publishResponse()\n }\n }\n })\n socket.once('error', (err) => {\n socket.removeAllListeners('timeout')\n this._errorRequest(err)\n })\n return socket\n }\n\n /**\n * Processes response message chunk\n * @param buffer Message buffer\n */\n _processResponse(buffer: Buffer): void {\n this._processSocketMessage(buffer)\n this._reportResponse()\n }\n\n /**\n * Reports response after processing it.\n */\n _reportResponse(): void {\n this._clearSocketEventListeners()\n const { aborted, currentResponse } = this\n if (aborted || !currentResponse) {\n return\n }\n const { status } = currentResponse\n\n const endTime = Date.now()\n this.stats.lastReceivedTime = endTime\n this.sentRequest.endTime = endTime\n\n if (status >= 300 && status < 400) {\n if (this.followRedirects && this._reportRedirect(status)) {\n this.closeClient()\n return\n }\n } else if (status === 401 && this.auth) {\n switch (this.auth.method) {\n case 'ntlm':\n this.handleNtlmResponse()\n return\n }\n }\n this.closeClient()\n this.emit('loadend')\n this._publishResponse()\n }\n\n /**\n * Generate response object and publish it to the listeners.\n */\n override _publishResponse(): Promise<void> {\n this.state = RequestState.Done\n if (!this._rawBody) {\n if (this.responseInfo.body) {\n this._rawBody = this.responseInfo.body\n } else if (this.responseInfo.chunk) {\n this._rawBody = this.responseInfo.chunk\n }\n }\n return super._publishResponse()\n }\n\n /**\n * @param location The redirect location.\n * @return Redirect response object\n */\n override async _createRedirectResponse(location: string): Promise<ResponseRedirect> {\n const { currentResponse = new Response() } = this\n this.currentResponse = currentResponse\n if (!this.currentResponse.payload) {\n if (this._rawBody) {\n this.currentResponse.payload = PayloadSerializer.stringifyBuffer(this._rawBody)\n } else if (this.responseInfo.body) {\n this.currentResponse.payload = PayloadSerializer.stringifyBuffer(this.responseInfo.body)\n } else if (this.responseInfo.chunk) {\n this.currentResponse.payload = PayloadSerializer.stringifyBuffer(this.responseInfo.chunk)\n }\n }\n return super._createRedirectResponse(location)\n }\n\n /**\n * closes the connection, if any\n */\n closeClient(): void {\n if (this.socket && !this.socket.destroyed) {\n this.socket.destroy()\n }\n }\n\n /**\n * Handles the response with NTLM authorization\n */\n handleNtlmResponse(): void {\n const { auth } = this\n if (!auth) {\n throw new Error('No auth data.')\n }\n if (auth.state === 0) {\n if (this.currentHeaders.has('www-authenticate')) {\n auth.state = 1\n auth.challengeHeader = this.currentHeaders.get('www-authenticate')\n this._cleanUpRedirect()\n this.prepareMessage().then((message) => this.writeMessage(message))\n return\n }\n }\n delete this.auth\n this.emit('loadend')\n this._publishResponse()\n }\n\n /**\n * Process received message.\n *\n * @param data Received message.\n */\n _processSocketMessage(data: Buffer): void {\n if (this.aborted) {\n return\n }\n if (this.state === RequestState.Done) {\n return\n }\n let remaining: Buffer | undefined = data\n if (this.state === RequestState.Status) {\n remaining = this._processStatus(remaining)\n if (!remaining) {\n return\n }\n }\n if (this.state === RequestState.Headers) {\n remaining = this._processHeaders(remaining)\n if (!remaining) {\n return\n }\n }\n if (this.state === RequestState.Body) {\n this._processBody(remaining)\n return\n }\n }\n\n /**\n * Read status line from the response.\n * This function will set `status` and `statusText` fields\n * and then will set `state` to HEADERS.\n *\n * @param data The received data\n */\n _processStatus(data?: Buffer): Buffer | undefined {\n if (this.aborted) {\n return\n }\n const response = Response.fromValues(0)\n response.loadingTime = 0\n this.currentResponse = response\n if (!data) {\n return\n }\n\n this.logger.info('Processing status')\n const index = data.indexOf(nlBuffer)\n let statusLine = data.slice(0, index).toString()\n data = data.slice(index + 2)\n statusLine = statusLine.replace(/HTTP\\/\\d(\\.\\d)?\\s/, '')\n const delimiterPos = statusLine.indexOf(' ')\n let status\n let msg = ''\n if (delimiterPos === -1) {\n status = statusLine\n } else {\n status = statusLine.substr(0, delimiterPos)\n msg = statusLine.substr(delimiterPos + 1)\n }\n let typedStatus = Number(status)\n if (Number.isNaN(typedStatus)) {\n typedStatus = 0\n }\n if (msg && msg.indexOf('\\n') !== -1) {\n msg = msg.split('\\n')[0]\n }\n const cr = this.currentResponse as Response\n cr.status = typedStatus\n cr.statusText = msg\n this.logger.info('Received status', typedStatus, msg)\n this.state = RequestState.Headers\n return data\n }\n\n /**\n * Read headers from the received data.\n *\n * @param data Received data\n * @returns Remaining data in the buffer.\n */\n _processHeaders(data?: Buffer): Buffer | undefined {\n if (this.aborted) {\n return\n }\n if (!data) {\n this._parseHeaders()\n return\n }\n this.logger.info('Processing headers')\n // Looking for end of headers section\n let index = data.indexOf(nlNlBuffer)\n let padding = 4\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 if (index === -1 && enterIndex !== 0) {\n // end in next chunk\n if (!this.rawHeaders) {\n this.rawHeaders = data\n } else {\n const sum = this.rawHeaders.length + data.length\n this.rawHeaders = Buffer.concat([this.rawHeaders, data], sum)\n }\n return\n }\n if (enterIndex !== 0) {\n const headersArray = data.slice(0, index)\n if (!this.rawHeaders) {\n this.rawHeaders = headersArray\n } else {\n const sum = this.rawHeaders.length + headersArray.length\n this.rawHeaders = Buffer.concat([this.rawHeaders, headersArray], sum)\n }\n }\n this._parseHeaders(this.rawHeaders)\n delete this.rawHeaders\n this.state = RequestState.Body\n const start = index === -1 ? 0 : index\n const move = enterIndex === 0 ? 2 : padding\n data = data.slice(start + move)\n return this._postHeaders(data)\n }\n\n /**\n * Check the response headers and end the request if necessary.\n * @param data Current response data buffer\n */\n _postHeaders(data: Buffer): Buffer | undefined {\n if (this.request.method === 'HEAD') {\n this._reportResponse()\n return\n }\n if (data.length === 0) {\n if (this.currentResponse?.status === 204) {\n this._reportResponse()\n return\n }\n if (this.currentHeaders.has('Content-Length')) {\n // If the server do not close the connection and clearly indicate that\n // there are no further data to receive the app can close the connection\n // and prepare the response.\n const length = Number(this.currentHeaders.get('Content-Length'))\n if (!Number.isNaN(length) && length === 0) {\n this._reportResponse()\n return\n }\n }\n // See: https://github.com/advanced-rest-client/arc-electron/issues/106\n // The client should wait until the connection is closed instead of assuming it should end the request.\n\n // else if (!this.currentHeaders.has('Transfer-Encoding') || !this.currentHeaders.get('Transfer-Encoding')) {\n // // Fix for https://github.com/jarrodek/socket-fetch/issues/6\n // // There is no body in the response.\n // // this._reportResponse();\n // return;\n // }\n return\n }\n return data\n }\n\n /**\n * This function assumes that all headers has been read and it's\n * just before changing the status to BODY.\n */\n _parseHeaders(buffer?: Buffer): void {\n let raw = ''\n if (buffer) {\n raw = buffer.toString()\n }\n ;(this.currentResponse as Response).headers = raw\n this.logger.info('Received headers list', raw)\n const headers = new Headers(raw)\n this.currentHeaders = headers\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 const rawHeaders = headers.toString()\n const detail: HeadersReceivedDetail = {\n returnValue: true,\n value: rawHeaders,\n }\n this.emit('headersreceived', detail)\n if (!detail.returnValue) {\n this.abort()\n }\n }\n\n /**\n * @param data A data to process\n */\n _processBody(data?: Buffer): void {\n if (this.aborted || !data) {\n return\n }\n if (this.responseInfo.chunked) {\n this._processBodyChunked(data)\n } else {\n this._processBodyContentLength(data)\n }\n }\n\n _processBodyContentLength(data: Buffer): void {\n if (typeof this.responseInfo.contentLength === 'undefined') {\n this._errorRequest(new Error(`The content-length header of the response is missing.`))\n return\n }\n if (!this.responseInfo.body) {\n this.responseInfo.body = data\n if (data.length >= this.responseInfo.contentLength) {\n this._reportResponse()\n return\n }\n return\n }\n const sum = this.responseInfo.body.length + data.length\n this.responseInfo.body = Buffer.concat([this.responseInfo.body, data], sum)\n if (this.responseInfo.body.length >= this.responseInfo.contentLength) {\n this._reportResponse()\n return\n }\n }\n\n /**\n * @param data A latest data to process\n */\n _processBodyChunked(data?: Buffer): void {\n if (!data) {\n return\n }\n if (this.responseInfo.chunk) {\n data = Buffer.concat([this.responseInfo.chunk, data], this.responseInfo.chunk.length + data.length)\n this.responseInfo.chunk = undefined\n }\n\n while (true) {\n if (this.responseInfo.chunkSize === 0 && data.indexOf(nlNlBuffer) === 0) {\n this._reportResponse()\n return\n }\n if (!this.responseInfo.chunkSize) {\n data = this.readChunkSize(data)\n if (!data) {\n return\n }\n if (!this.responseInfo.chunkSize && this.responseInfo.chunkSize !== 0) {\n // It may happen that node's buffer cuts the data\n // just before the chunk size.\n // It should proceed it in next portion of the data.\n this.responseInfo.chunk = data\n return\n }\n if (!this.responseInfo.chunkSize) {\n this._reportResponse()\n return\n }\n }\n const size = Math.min(this.responseInfo.chunkSize, data.length)\n const sliced = data.slice(0, size)\n if (!this._rawBody) {\n this._rawBody = sliced\n } else {\n const sum = size + this._rawBody.length\n this._rawBody = Buffer.concat([this._rawBody, sliced], sum)\n }\n\n this.responseInfo.chunkSize -= size\n if (data.length === 0) {\n // this.logger.warn('Next chunk will start with CRLF!');\n return\n }\n data = data.slice(size + 2) // + CR\n if (data.length === 0) {\n // this.logger.info('No more data here. Waiting for new chunk');\n return\n }\n }\n }\n\n /**\n * If response's Transfer-Encoding is 'chunked' read until next CR.\n * Everything before it is a chunk size.\n */\n readChunkSize(array: Buffer): Buffer | undefined {\n if (this.aborted) {\n return\n }\n let index = array.indexOf(nlBuffer)\n if (index === -1) {\n // not found in this portion of data.\n return array\n }\n if (index === 0) {\n // Node's buffer cuts CRLF after the end of chunk data, without last CLCR,\n // here's to fix it.\n // It can be either new line from the last chunk or end of\n // the message where\n // the rest of the array is [13, 10, 48, 13, 10, 13, 10]\n if (array.indexOf(nlNlBuffer) === 0) {\n this.responseInfo.chunkSize = 0\n return Buffer.alloc(0)\n }\n array = array.slice(index + 2)\n index = array.indexOf(nlBuffer)\n }\n // this.logger.info('Size index: ', index);\n const chunkSize = parseInt(array.slice(0, index).toString(), 16)\n if (Number.isNaN(chunkSize)) {\n this.responseInfo.chunkSize = undefined\n return array.slice(index + 2)\n }\n this.responseInfo.chunkSize = chunkSize\n return array.slice(index + 2)\n }\n\n /**\n * Connects to a server through a proxy. Depending on the proxy type the returned socket\n * is a socket created after creating a tunnel (SSL) or the proxy socket.\n *\n * @returns Promise resolved when socket is connected.\n */\n async connectProxy(): Promise<net.Socket | undefined> {\n let socket\n if (this.isProxyTunnel) {\n socket = await this.connectTunnel(this.isProxySsl)\n } else {\n socket = await this.proxyHttp(this.isProxySsl)\n }\n if (!socket) {\n return\n }\n const { timeout } = this\n if (timeout > 0) {\n socket.setTimeout(timeout)\n }\n this.socket = socket\n this._addSocketListeners(socket)\n socket.resume()\n return socket\n }\n\n /**\n * Creates a tunnel to a Proxy for SSL connections.\n * The returned socket is the one created after the tunnel is established.\n * @param proxyIsSsl Whether the proxy is an SSL connection.\n * @returns Promise resolved when socket is connected.\n */\n async connectTunnel(proxyIsSsl = false): Promise<net.Socket | undefined> {\n this.logger.debug(`Creating a tunnel through the proxy...`)\n const { proxy } = this.opts\n const { url } = this.request\n if (!proxy) {\n throw new Error(`No proxy configuration found.`)\n }\n let proxyUrl = proxy\n if (proxyIsSsl && !proxyUrl.startsWith('https:')) {\n proxyUrl = `https://${proxyUrl}`\n } else if (!proxyIsSsl && !proxyUrl.startsWith('http:')) {\n proxyUrl = `http://${proxyUrl}`\n }\n const proxyUri = new URL(proxyUrl)\n const targetUrl = new URL(url)\n const proxyPort = proxyUri.port || (proxyIsSsl ? 443 : 80)\n const targetPort = targetUrl.port || 443 // target is always SSL so 443.\n const authority = `${targetUrl.hostname}:${targetPort}`\n const connectOptions: https.RequestOptions = {\n host: proxyUri.hostname,\n port: proxyPort,\n method: 'CONNECT',\n path: authority,\n headers: {\n host: authority,\n },\n }\n if (proxyIsSsl) {\n connectOptions.rejectUnauthorized = false\n // @ts-expect-error This is correct!\n connectOptions.requestOCSP = false\n }\n const auth = this._proxyAuthHeader()\n if (auth) {\n this.logger.debug(`Adding proxy authorization.`)\n ;(connectOptions.headers as http.OutgoingHttpHeaders)['proxy-authorization'] = auth\n }\n const lib = proxyIsSsl ? https : http\n return new Promise((resolve, reject) => {\n this.stats.connectionTime = Date.now()\n const connectRequest = lib.request(connectOptions)\n connectRequest.once('socket', (socket: net.Socket) => {\n socket.on('lookup', () => {\n this.stats.lookupTime = Date.now()\n })\n })\n\n connectRequest.on('error', (err) => {\n this.logger.error('Error establishing proxy tunnel:', err)\n reject(\n new SerializableError(\n `Failed to establish proxy tunnel: ${err.message}`,\n (err as Error & { code: string }).code ? Number((err as Error & { code: string }).code) : 111\n )\n )\n })\n\n connectRequest.on('connect', async (res: http.IncomingMessage, socket: net.Socket, head: Buffer) => {\n const time = Date.now()\n this.stats.connectedTime = time\n this.stats.secureStartTime = time\n if (typeof this.stats.lookupTime === 'undefined') {\n this.stats.lookupTime = time\n }\n if (res.statusCode === 401) {\n this.currentHeaders = new Headers(res.headers)\n const currentResponse = Response.fromValues(res.statusCode, res.statusMessage, this.currentHeaders.toString())\n currentResponse.loadingTime = 0\n this.currentResponse = currentResponse\n if (head.length) {\n this._rawBody = head\n currentResponse.payload = PayloadSerializer.stringifyBuffer(head)\n }\n connectRequest.destroy()\n resolve(undefined)\n setTimeout(() => {\n // const e = new NetError('The proxy requires authentication.', 127);\n this._publishResponse()\n })\n } else if (res.statusCode === 407) {\n await this.handleProxyAuthentication(res, socket)\n } else if (res.statusCode !== 200) {\n this.logger.debug(`The proxy tunnel ended with ${res.statusCode} status code. Erroring request.`)\n connectRequest.destroy()\n const errorMessage =\n res.statusMessage || `Proxy tunnel establishment failed with status code ${res.statusCode}`\n const e = new SerializableError(errorMessage, res.statusCode)\n reject(e)\n } else {\n this.logger.debug(`Established a proxy tunnel.`)\n this.logger.debug(`Upgrading connection to SSL...`)\n const tlsSocket = tls.connect({ socket, rejectUnauthorized: false }, () => {\n this.logger.debug(`Connection upgraded to SSL.`)\n resolve(tlsSocket)\n })\n tlsSocket.once('secureConnect', () => {\n this.stats.secureConnectedTime = Date.now()\n })\n }\n })\n connectRequest.end()\n })\n }\n\n async handleProxyAuthentication(res: http.IncomingMessage, socket: net.Socket): Promise<void> {\n if (res.statusCode === 407) {\n // Proxy Authentication Required\n this.currentHeaders = new Headers(res.headers)\n const authHeader = this.currentHeaders.get('proxy-authenticate')\n\n if (authHeader && authHeader.startsWith('Digest')) {\n // Parse the Digest challenge and update _proxyAuthHeader to generate the correct response.\n this._errorRequest(new SerializableError(`Unsupported proxy authentication scheme: ${authHeader}`, 127))\n socket.destroy()\n // this._cleanUpRedirect(); // Might need adjustments\n // const message = await this.prepareMessage();\n // this.writeMessage(message);\n } else if (authHeader && authHeader.startsWith('Basic')) {\n // Basic auth is usually handled directly in _proxyAuthHeader, so this might be redundant.\n this._cleanUpRedirect() // Might need adjustments\n const message = await this.prepareMessage()\n this.writeMessage(message)\n } else {\n // Unsupported authentication scheme\n this._errorRequest(new SerializableError(`Unsupported proxy authentication scheme: ${authHeader}`, 127))\n socket.destroy()\n }\n }\n }\n\n /**\n * Creates connection to a proxy for an HTTP (non-SSL) transport.\n * This is the same as calling _connect or _connectTls but the target is the proxy and not the\n * target URL. The message sent to the proxy server is different than the one sent\n * to the target.\n * @param proxyIsSsl\n * @returns Promise resolved when socket is connected.\n */\n async proxyHttp(proxyIsSsl = false): Promise<net.Socket> {\n this.logger.debug('Proxying an HTTP request...')\n const { proxy } = this.opts\n if (!proxy) {\n throw new Error(`No proxy configuration found.`)\n }\n let proxyUrl = proxy\n if (proxyIsSsl && !proxyUrl.startsWith('https:')) {\n proxyUrl = `https://${proxyUrl}`\n } else if (!proxyIsSsl && !proxyUrl.startsWith('http:')) {\n proxyUrl = `http://${proxyUrl}`\n }\n const proxyUri = new URL(proxyUrl)\n const port = Number(proxyUri.port || 443)\n const host = proxyUri.hostname\n let socket\n try {\n if (proxyIsSsl) {\n socket = await this._connectTls(port, host)\n } else {\n socket = await this._connect(port, host)\n }\n } catch (error) {\n const err = error as Error & { code?: string }\n throw new SerializableError(`Failed to connect to proxy: ${err.message}`, err.code ? Number(err.code) : 112)\n }\n return socket\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CoreEngine.js","sourceRoot":"","sources":["../../../../src/runtime/http-engine/CoreEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import net from 'net'\nimport { URL } from 'url'\nimport tls from 'tls'\nimport { EventEmitter } from 'events'\nimport { Logger, type ILogObj } from 'tslog'\nimport { IRequestLog } from '../../models/RequestLog.js'\nimport { IHttpRequest, HttpRequest } from '../../models/HttpRequest.js'\nimport { IRequestBaseConfig } from '../../models/RequestConfig.js'\nimport { IRequestAuthorization } from '../../models/RequestAuthorization.js'\n\nimport { HttpCertificate } from '../../models/ClientCertificate.js'\nimport { SentRequest } from '../../models/SentRequest.js'\nimport { Response } from '../../models/Response.js'\nimport { ErrorResponse } from '../../models/ErrorResponse.js'\nimport { RequestsSize } from '../../models/RequestsSize.js'\nimport { HttpResponse } from '../../models/HttpResponse.js'\nimport { ResponseRedirect } from '../../models/ResponseRedirect.js'\nimport { RequestLog } from '../../models/RequestLog.js'\nimport { RequestTime } from '../../models/RequestTime.js'\nimport { SerializableError } from '../../models/SerializableError.js'\nimport { ResponseAuthorization } from '../../models/ResponseAuthorization.js'\nimport { Headers } from '../../lib/headers/Headers.js'\nimport { getPort } from './RequestUtils.js'\n\nimport { HttpResponseParser, ParserCallbacks, RequestState } from './parsers/index.js'\nimport { ConnectionManager } from './connections/index.js'\nimport { AuthManager, type ProxyAuthCredentials } from './auth/index.js'\nimport { MessageBuilder } from './message/index.js'\nimport { HttpEngineErrorFactory } from './errors/index.js'\nimport { isMethodWithoutBody, HEADER_PROXY_AUTHORIZATION } from './constants.js'\nimport { decompress } from './compression/index.js'\nimport { checkServerIdentity } from './certificates/index.js'\nimport { readUrl, getHostHeader, getRedirectLocation, isRedirectLoop } from './url/index.js'\nimport { processRedirectCookies } from './cookies/index.js'\nimport { computeStats } from './statistics/index.js'\nimport { processResponse } from './response/index.js'\nimport { getCodeMessage } from './HttpErrorCodes.js'\nimport { createLogger } from '../../lib/logging/index.js'\nimport * as PayloadSupport from './PayloadSupport.js'\nimport { addContentLength } from './RequestUtils.js'\nimport { PayloadSerializer } from '../../lib/transformers/PayloadSerializer.js'\nimport { ProxyAuthenticationError } from './errors/HttpEngineErrors.js'\n\nexport interface HttpEngineOptions extends IRequestBaseConfig {\n /**\n * The authorization configuration to apply to the request.\n */\n authorization?: IRequestAuthorization[]\n /**\n * Logger object.\n */\n logger?: Logger<ILogObj>\n /**\n * A certificate to use with the request.\n */\n certificates?: HttpCertificate[]\n}\n\nexport interface RequestStats {\n firstReceiveTime?: number\n lastReceivedTime?: number\n messageStart?: number\n sentTime?: number\n connectionTime?: number\n lookupTime?: number\n connectedTime?: number\n secureStartTime?: number\n secureConnectedTime?: number\n startTime?: number\n responseTime?: number\n receivingTime?: number\n}\n\nexport interface ResponseErrorInit {\n code?: number | string\n message?: string\n}\n\nexport interface BeforeRedirectDetail {\n location: string\n returnValue: boolean\n}\n\nexport interface HeadersReceivedDetail {\n value: string\n returnValue: boolean\n}\n\nexport interface IRequestAuthState {\n method: 'ntlm'\n state: number\n headers?: string\n challengeHeader?: string\n}\n\nexport const mainPromiseSymbol = Symbol('mainPromise')\n\n/**\n * API Client's HTTP engine with refactored parsing and connection handling.\n * An HTTP 1.1 engine working directly on the socket. It communicates with the remote machine and\n * collects stats about the request and response.\n */\nexport class CoreEngine extends EventEmitter {\n request: HttpRequest\n opts: HttpEngineOptions\n logger: Logger<ILogObj>\n\n /**\n * The current sent request\n */\n sentRequest: SentRequest\n\n redirects: ResponseRedirect[] = []\n /**\n * When true the request has been aborted.\n */\n aborted = false\n /**\n * Parsed value of the request URL.\n */\n uri: URL\n\n socket?: net.Socket\n /**\n * Host header can be different than registered URL because of\n * `hosts` rules.\n * If a rule changes host value of the URL the original URL host value\n * is used when generating the request and not overwritten one.\n * This way virtual hosts can be tested using hosts.\n */\n hostHeader: string | undefined\n\n protected hostTestReg = /^\\s*host\\s*:/im\n /**\n * Set when the request is redirected.\n */\n redirecting = false\n\n /**\n * The response headers.\n * The object may be empty when the response is not set.\n */\n currentHeaders = new Headers()\n\n /**\n * The response object build during the execution.\n */\n currentResponse?: Response\n\n /**\n * Keeps the raw body in a temporary buffer while processing the response.\n */\n _rawBody?: Buffer\n\n stats: RequestStats = {}\n\n auth?: IRequestAuthState\n\n protected mainResolver?: (log: IRequestLog) => void\n protected mainRejecter?: (err: SerializableError) => void;\n [mainPromiseSymbol]?: Promise<IRequestLog>\n\n protected _signal?: AbortSignal\n\n // CoreEngine specific properties\n private parser: HttpResponseParser\n private connectionManager: ConnectionManager\n private authManager: AuthManager\n private messageBuilder: MessageBuilder\n\n hasProxy: boolean\n isProxyTunnel: boolean\n isProxySsl: boolean\n\n /**\n * @return True if following redirects is allowed.\n */\n get followRedirects(): boolean {\n const { opts } = this\n if (typeof opts.followRedirects === 'boolean') {\n return opts.followRedirects\n }\n return true\n }\n\n /**\n * The request timeout.\n */\n get timeout(): number {\n const { opts } = this\n if (typeof opts.timeout === 'number') {\n return opts.timeout\n }\n return 0\n }\n\n /**\n * The abort signal to set on this request.\n * Aborts the request when the signal fires.\n */\n get signal(): AbortSignal | undefined {\n return this._signal\n }\n\n set signal(value: AbortSignal | undefined) {\n const old = this._signal\n if (old === value) {\n return\n }\n this._signal = value\n if (old) {\n old.removeEventListener('abort', this._abortHandler)\n }\n if (value) {\n value.addEventListener('abort', this._abortHandler)\n }\n }\n\n constructor(request: IHttpRequest, opts: HttpEngineOptions = {}) {\n super()\n this.request = new HttpRequest({ ...request })\n this.opts = opts\n this.logger = this.setupLogger(opts)\n this.sentRequest = new SentRequest({ ...request, startTime: Date.now() })\n this.uri = this.readUrl(request.url)\n this.hostHeader = this.getHostHeader(request.url)\n\n // CoreEngine specific initialization\n this.hasProxy = !!this.opts.proxy\n this.isProxyTunnel = this.hasProxy && this.request.url.startsWith('https:')\n this.isProxySsl = !!this.opts.proxy && this.opts.proxy.startsWith('https:')\n\n // Initialize the HTTP response parser\n this.parser = new HttpResponseParser(this.logger, this.createParserCallbacks())\n\n // Initialize the connection manager\n this.connectionManager = new ConnectionManager(this.logger, this.stats)\n\n // Initialize the auth manager\n const proxyCredentials: ProxyAuthCredentials = {\n proxyUsername: this.opts.proxyUsername,\n proxyPassword: this.opts.proxyPassword,\n proxyAuthorization: this.opts.proxyAuthorization,\n }\n\n this.authManager = new AuthManager({\n logger: this.logger,\n proxyCredentials,\n })\n\n // Initialize the message builder\n this.messageBuilder = new MessageBuilder({\n logger: this.logger,\n request: this.request as IHttpRequest,\n hasProxy: this.hasProxy,\n isProxyTunnel: this.isProxyTunnel,\n hostHeader: this.hostHeader,\n })\n\n this._abortHandler = this._abortHandler.bind(this)\n if (opts.signal) {\n this.signal = opts.signal\n }\n }\n\n /**\n * Creates a logger object to log debug output.\n */\n setupLogger(opts: HttpEngineOptions = {}): Logger<ILogObj> {\n if (opts.logger) {\n return opts.logger\n }\n return createLogger()\n }\n\n /**\n * Updates the `uri` property from current request URL\n */\n readUrl(value: string): URL {\n return readUrl(value, { hosts: this.opts.hosts })\n }\n\n /**\n * Get host header for the request\n */\n getHostHeader(url: string): string | undefined {\n return getHostHeader(url, { hosts: this.opts.hosts })\n }\n\n /**\n * Aborts current request.\n * It emits `error` event\n */\n abort(): void {\n this.logger.debug('Aborting the request...')\n this.aborted = true\n if (!this.socket) {\n return\n }\n this.socket.removeAllListeners()\n if (this.socket.destroyed) {\n this.socket = undefined\n return\n }\n this.socket.pause()\n this.socket.destroy()\n this.socket = undefined\n }\n\n /**\n * Handler for the `abort` event on the `AbortSignal`.\n */\n protected _abortHandler(): void {\n const e = new SerializableError('Request aborted', 3)\n this._errorRequest(e)\n this.abort()\n }\n\n /**\n * Create parser callbacks to handle parsed data\n */\n private createParserCallbacks(): ParserCallbacks {\n return {\n onStatusParsed: (status: number, statusText: string) => {\n this.logger.debug('onStatusParsed called', status, statusText)\n const response = Response.fromValues(status, statusText)\n response.loadingTime = 0\n this.currentResponse = response\n },\n onHeadersParsed: (headers: Headers) => {\n this.logger.debug('onHeadersParsed called')\n this.currentHeaders = headers\n if (this.currentResponse) {\n this.currentResponse.headers = headers.toString()\n }\n },\n onBodyComplete: (body: Buffer) => {\n this.logger.debug('onBodyComplete called')\n this._rawBody = body\n this._reportResponse().catch((error) => {\n this.logger.error('Error in _reportResponse:', error)\n this._errorRequest({\n message: `Response processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n })\n })\n },\n onError: (error: Error) => {\n this.logger.debug('onError called', error)\n this._errorRequest({\n message: error.message || 'Unknown error occurred',\n })\n },\n onAbort: () => {\n this.logger.debug('onAbort called')\n this.abort()\n },\n emit: (event: string, detail?: unknown) => {\n this.logger.debug('emit called', event, detail)\n this.emit(event, detail)\n },\n }\n }\n\n /**\n * Sends the request\n */\n async send(): Promise<IRequestLog> {\n const promise = this.wrapExecution()\n this.sendRequest()\n return promise\n }\n\n private async sendRequest(): Promise<void> {\n try {\n // Use the connection manager to establish the connection\n const socket = await this.establishConnection()\n if (!socket || this.aborted) {\n return\n }\n\n const message = await this.prepareMessage()\n await this.writeMessage(message)\n } catch (cause) {\n if (cause instanceof ProxyAuthenticationError) {\n this.currentHeaders = new Headers(cause.response.headers)\n const currentResponse = Response.fromValues(\n cause.response.statusCode || 401,\n cause.response.statusMessage,\n this.currentHeaders.toString()\n )\n currentResponse.loadingTime = 0\n this.currentResponse = currentResponse\n if (cause.head.length) {\n this._rawBody = cause.head\n currentResponse.payload = PayloadSerializer.stringifyBuffer(cause.head)\n }\n this._publishResponse()\n return\n }\n const e = cause as SerializableError\n const err = new SerializableError(e.message, { cause: e })\n if (e.code || e.code === 0) {\n err.code = e.code as string\n }\n this.abort()\n this._errorRequest({\n message: err.message,\n code: err.code,\n })\n }\n }\n\n /**\n * Establish connection using the connection manager\n */\n private async establishConnection(): Promise<net.Socket> {\n const port = getPort(this.uri.port, this.uri.protocol)\n const host = this.uri.hostname\n const protocol = this.uri.protocol\n\n const socket = await this.connectionManager.createConnection(host, port, protocol, this.opts)\n const { timeout } = this\n if (timeout > 0) {\n socket.setTimeout(timeout)\n }\n this.socket = socket\n this._addSocketListeners(socket)\n socket.resume()\n return socket\n }\n\n /**\n * Decompresses received body if `content-encoding` header is set.\n */\n async decompress(body?: Buffer): Promise<Buffer | undefined> {\n return decompress(body, {\n aborted: this.aborted,\n headers: this.currentHeaders,\n })\n }\n\n /**\n * Prepares headers list to be send to the remote machine.\n * If `defaultHeaders` option is set then it adds `user-agent` and `accept`\n * headers.\n */\n prepareHeaders(headers: Headers, withPayload = false): void {\n if (this.opts.defaultHeaders) {\n if (!headers.has('user-agent')) {\n if (this.opts.defaultUserAgent) {\n headers.set('user-agent', this.opts.defaultUserAgent)\n } else {\n headers.set('user-agent', 'api client')\n }\n }\n if (!headers.has('accept')) {\n if (this.opts.defaultAccept) {\n headers.set('accept', this.opts.defaultAccept)\n } else {\n headers.set('accept', '*/*')\n }\n }\n }\n if (withPayload) {\n if (!headers.has('content-type') && this.request.payloadOptions) {\n if (this.request.payloadOptions.mime) {\n headers.set('content-type', this.request.payloadOptions.mime)\n }\n }\n }\n }\n\n /**\n * Cleans the state after finished.\n */\n _cleanUp(): void {\n this.redirects = []\n this.currentHeaders = new Headers()\n this.currentResponse = undefined\n this._rawBody = undefined\n this.redirecting = false\n this.stats = {}\n this.mainRejecter = undefined\n this.mainResolver = undefined\n this._clearSocketEventListeners()\n this.parser.reset()\n }\n\n /**\n * Cleans up the state for redirect.\n */\n _cleanUpRedirect(): void {\n this.currentHeaders = new Headers()\n this.currentResponse = undefined\n this._rawBody = undefined\n this.stats = {}\n this._clearSocketEventListeners()\n this.parser.reset()\n }\n\n /**\n * Reports response when redirected.\n */\n _reportRedirect(status: number): boolean {\n const { request, currentHeaders } = this\n if (!currentHeaders) {\n return false\n }\n const rerUrl = currentHeaders.get('location')\n // https://github.com/jarrodek/socket-fetch/issues/13\n const redirectOptions = this.getRedirectOptions(status, request.method, rerUrl)\n if (!redirectOptions.redirect) {\n return false\n }\n this.redirecting = true\n setTimeout(() => this._redirectRequest(redirectOptions))\n return true\n }\n\n /**\n * Get redirect options based on status and method\n */\n private getRedirectOptions(\n status: number,\n method?: string,\n location?: string\n ): { redirect: boolean; location?: string; forceGet?: boolean } {\n if (!location) {\n return { redirect: false }\n }\n\n // 301, 302, 303, 307, 308 are redirect status codes\n if (status >= 300 && status < 400) {\n const forceGet = status === 301 || status === 302 || status === 303\n return { redirect: true, location, forceGet }\n }\n\n return { redirect: false }\n }\n\n /**\n * Creates a response and adds it to the redirects list and redirects\n * the request to the new location.\n */\n async _redirectRequest(options: { redirect: boolean; location?: string; forceGet?: boolean }): Promise<void> {\n if (this.followRedirects === false) {\n this._publishResponse()\n return\n }\n const location = options.location && this.getRedirectLocation(options.location, this.request.url)\n if (!location) {\n this._errorRequest({ code: 302 })\n return\n }\n\n // check if this is infinite loop\n if (this.isRedirectLoop(location, this.redirects)) {\n this._errorRequest({ code: 310 })\n return\n }\n\n const detail: BeforeRedirectDetail = {\n location,\n returnValue: true,\n }\n this.emit('beforeredirect', detail)\n if (!detail.returnValue) {\n this._publishResponse()\n return\n }\n try {\n const responseCookies = this.currentHeaders.get('set-cookie')\n const response = await this._createRedirectResponse(location)\n this.redirects.push(response)\n this._cleanUpRedirect()\n if (responseCookies) {\n this._processRedirectCookies(responseCookies, location)\n }\n this.redirecting = false\n\n this.request.url = location\n this.sentRequest.url = location\n if (options.forceGet) {\n this.request.method = 'GET'\n }\n this.uri = this.readUrl(location)\n this.hostHeader = this.getHostHeader(location)\n // No idea why but without setTimeout the program loses it's\n // scope after calling the function.\n setTimeout(() => this.send())\n } catch (e) {\n const error = e as Error\n this._errorRequest({\n message: (error && error.message) || 'Unknown error occurred',\n })\n }\n }\n\n /**\n * Get redirect location\n */\n private getRedirectLocation(location: string, currentUrl: string): string {\n return getRedirectLocation(location, currentUrl)\n }\n\n /**\n * Check if redirect is a loop\n */\n private isRedirectLoop(location: string, redirects: ResponseRedirect[]): boolean {\n return isRedirectLoop(location, redirects)\n }\n\n /**\n * @param location The redirect location.\n * @return Redirect response object\n */\n async _createRedirectResponse(location: string): Promise<ResponseRedirect> {\n const { currentResponse = new Response() } = this\n\n const response = HttpResponse.fromValues(\n currentResponse.status,\n currentResponse.statusText,\n currentResponse.headers\n )\n if (currentResponse.payload) {\n response.payload = currentResponse.payload\n }\n\n const body = await this.decompress(this._rawBody)\n if (body) {\n await response.writePayload(body)\n currentResponse.payload = response.payload\n }\n\n const redirect = ResponseRedirect.fromValues(\n location,\n response.toJSON(),\n this.stats.startTime,\n this.stats.responseTime\n )\n redirect.timings = this._computeStats(this.stats)\n\n return redirect\n }\n\n /**\n * Creates a response object\n */\n async _createResponse(): Promise<Response> {\n if (this.aborted) {\n throw new Error(`Request aborted.`)\n }\n const { currentResponse } = this\n if (!currentResponse) {\n throw new Error(`Tried to create a response but no response data is set.`)\n }\n const { status } = currentResponse\n if (status === undefined) {\n throw new Error(`The response status is empty.\nIt means that the successful connection wasn't made.\nCheck your request parameters.`)\n }\n const body = await this.decompress(this._rawBody)\n const response = Response.fromValues(status, currentResponse.statusText, currentResponse.headers)\n response.timings = this._computeStats(this.stats)\n response.loadingTime = response.timings.total()\n if (body) {\n await response.writePayload(body)\n currentResponse.payload = response.payload\n }\n if (status === 401) {\n this.logger.silly('Setting auth on the response...')\n response.auth = this._getAuth()\n }\n return response\n }\n\n /**\n * Finishes the response with error message.\n */\n _errorRequest(opts: ResponseErrorInit): void {\n const { currentResponse } = this\n this.aborted = true\n let message\n if (opts.code && !opts.message) {\n message = getCodeMessage(opts.code)\n } else if (opts.message) {\n message = opts.message\n }\n message = message || 'Unknown error occurred'\n const error = new SerializableError(message, opts.code)\n const log = RequestLog.fromRequest(this.sentRequest.toJSON())\n const response = ErrorResponse.fromError(error)\n log.response = response\n if (currentResponse && currentResponse.status) {\n response.status = currentResponse.status\n response.statusText = currentResponse.statusText\n response.headers = currentResponse.headers\n response.payload = currentResponse.payload\n }\n this.finalizeRequest(log)\n this._cleanUp()\n }\n\n /**\n * Generates authorization info object from response.\n */\n _getAuth(): ResponseAuthorization {\n this.logger.debug('Getting auth from response headers')\n let auth = this.currentHeaders.get('www-authenticate')\n const result = new ResponseAuthorization()\n if (auth) {\n this.logger.silly('Auth header found', auth)\n auth = auth.toLowerCase()\n if (auth.indexOf('ntlm') !== -1) {\n this.logger.silly('Detected NTLM authorization')\n result.method = 'ntlm'\n } else if (auth.indexOf('basic') !== -1) {\n result.method = 'basic'\n this.logger.silly('Detected basic authorization')\n } else if (auth.indexOf('digest') !== -1) {\n result.method = 'digest'\n this.logger.silly('Detected digest authorization')\n }\n }\n return result\n }\n\n /**\n * Creates HAR 1.2 timings object from stats.\n */\n _computeStats(stats: RequestStats): RequestTime {\n return computeStats(stats)\n }\n\n /**\n * Handles cookie exchange when redirecting the request.\n */\n _processRedirectCookies(responseCookies: string, location: string): void {\n this.request.headers = processRedirectCookies(\n responseCookies,\n location,\n this.request.url,\n this.request.toHeadersString()\n )\n }\n\n /**\n * Checks certificate identity using TLS api.\n */\n _checkServerIdentity(host: string, cert: tls.PeerCertificate): Error | undefined {\n return checkServerIdentity(host, cert)\n }\n\n /**\n * Clears event listeners of the socket object,\n */\n _clearSocketEventListeners(): void {\n if (!this.socket) {\n return\n }\n this.socket.removeAllListeners('error')\n this.socket.removeAllListeners('timeout')\n this.socket.removeAllListeners('end')\n }\n\n /**\n * Called with the `send()` function to initialize the main promise returned by the send function.\n * The send function returns a promise that is resolved when the request finish.\n */\n protected wrapExecution(): Promise<IRequestLog> {\n let promise: Promise<IRequestLog>\n if (this[mainPromiseSymbol]) {\n promise = this[mainPromiseSymbol] as Promise<IRequestLog>\n } else {\n promise = new Promise((resolve, reject) => {\n this.mainResolver = resolve\n this.mainRejecter = reject\n })\n this[mainPromiseSymbol] = promise\n }\n return promise\n }\n\n /**\n * Called by the request finalizer or error finalized to report the response.\n */\n protected finalizeRequest(log: RequestLog | SerializableError): void {\n const { mainRejecter, mainResolver } = this\n if (!mainRejecter || !mainResolver) {\n return\n }\n\n if (log instanceof SerializableError) {\n mainRejecter(log)\n } else {\n mainResolver(log.toJSON())\n }\n this.mainRejecter = undefined\n this.mainResolver = undefined\n this[mainPromiseSymbol] = undefined\n }\n\n /**\n * Prepares an HTTP message from API Client's request object.\n */\n async prepareMessage(): Promise<Buffer> {\n let payload = this.request.payload\n if (isMethodWithoutBody(this.request.method)) {\n payload = undefined\n }\n const headers = new Headers(this.request.toHeadersString())\n this.prepareHeaders(headers, !!payload)\n const auth = this.hasProxy && !this.isProxyTunnel ? this._proxyAuthHeader() : undefined\n if (auth) {\n headers.set(HEADER_PROXY_AUTHORIZATION, auth)\n }\n const buffer = PayloadSupport.payloadToBuffer(headers, payload)\n if (buffer) {\n addContentLength(this.request.method || 'GET', buffer, headers)\n }\n\n this._handleAuthorization(headers)\n this.sentRequest.headers = headers.toString()\n\n // Update message builder with current host header\n this.messageBuilder.updateHostHeader(this.hostHeader || '')\n\n const message = this.messageBuilder.buildMessage(headers, buffer)\n if (this.auth) {\n // This restores altered by authorization original headers\n // so it can be safe to use when redirecting\n if (this.auth.headers) {\n this.request.headers = this.auth.headers\n delete this.auth.headers\n }\n }\n return message\n }\n\n /**\n * Sends a data to a socket.\n */\n writeMessage(buffer: Buffer): Promise<void> {\n this.logger.debug(`Writing the message to the socket...`)\n let msg = buffer.toString()\n const limit = this.opts.sentMessageLimit\n if (limit && limit > 0 && msg.length >= limit) {\n msg = msg.substring(0, limit)\n msg += ' ...'\n }\n this.sentRequest.httpMessage = msg\n const startTime = Date.now()\n this.stats.startTime = startTime\n this.sentRequest.startTime = startTime\n\n this.stats.messageStart = Date.now()\n return new Promise((resolve) => {\n this.socket?.write(buffer, () => {\n this.logger.debug(`The message has been sent.`)\n this.stats.sentTime = Date.now()\n try {\n this.emit('loadstart')\n } catch {\n //\n }\n resolve()\n })\n })\n }\n\n /**\n * Alters authorization header depending on the `auth` object\n */\n _handleAuthorization(headers: Headers): void {\n const { authorization } = this.opts\n this.authManager.handleRequestAuthorization(headers, authorization, this.uri.host)\n\n // Sync the auth state from AuthManager to parent class for compatibility\n const authState = this.authManager.getAuthState()\n if (authState) {\n this.auth = authState\n }\n }\n\n /**\n * Generate proxy authorization header\n */\n _proxyAuthHeader(): string | undefined {\n return this.authManager.generateProxyAuthHeader()\n }\n\n /**\n * Add event listeners to existing socket.\n */\n _addSocketListeners(socket: net.Socket): net.Socket {\n let received = false\n socket.on('data', (data) => {\n this.logger.debug(`Received server data from the socket...`)\n if (!received) {\n const now = Date.now()\n this.stats.firstReceiveTime = now\n this.emit('firstbyte')\n received = true\n }\n data = Buffer.from(data)\n try {\n // Use the new parser instead of the old parsing methods\n this.parser.processData(data)\n this.logger.debug('Parser state:', this.parser.getState())\n } catch (e) {\n this.logger.error('Error in _addSocketListeners:', e)\n const err = e as Error\n this._errorRequest({\n message: err.message || 'Unknown error occurred',\n })\n return\n }\n })\n socket.once('timeout', () => {\n this.logger.debug(`Socket timeout occurred after ${this.timeout}ms.`)\n this.parser.abort()\n this._errorRequest(HttpEngineErrorFactory.connectionTimeout(this.timeout))\n socket.destroy()\n })\n socket.on('end', () => {\n const endTime = Date.now()\n this.logger.debug(`Server connection ended.`)\n socket.removeAllListeners('timeout')\n socket.removeAllListeners('error')\n socket.removeAllListeners('data')\n this.stats.lastReceivedTime = endTime\n this.sentRequest.endTime = endTime\n // console.log(`Socket ended at ${endTime} in state`, this.parser.getState())\n if (this.parser.getState() !== RequestState.Done) {\n if (!this.currentResponse) {\n const message = `Connection closed without receiving any data.`\n this.logger.error(message)\n const e = HttpEngineErrorFactory.connectionError(message, 100)\n this._errorRequest(e)\n } else {\n this.emit('loadend')\n this._publishResponse()\n }\n }\n })\n socket.once('error', (err) => {\n this.logger.error(`Socket error occurred: ${err.message}`)\n socket.removeAllListeners('timeout')\n this._errorRequest(err)\n })\n return socket\n }\n\n /**\n * Reports response after processing it.\n */\n async _reportResponse(): Promise<void> {\n this._clearSocketEventListeners()\n const { aborted, currentResponse } = this\n if (aborted || !currentResponse) {\n return\n }\n const { status } = currentResponse\n\n const endTime = Date.now()\n this.stats.lastReceivedTime = endTime\n this.sentRequest.endTime = endTime\n\n const result = processResponse({\n status,\n currentResponse,\n currentHeaders: this.currentHeaders,\n followRedirects: this.followRedirects,\n auth: this.auth,\n aborted: this.aborted,\n })\n\n switch (result.action) {\n case 'redirect':\n if (this._reportRedirect(status)) {\n this.closeClient()\n return\n }\n break\n case 'auth':\n if (result.data?.method === 'ntlm') {\n await this.handleNtlmResponse()\n return\n }\n break\n case 'publish':\n this.closeClient()\n this.emit('loadend')\n this._publishResponse()\n break\n case 'abort':\n // Already aborted, do nothing\n break\n }\n }\n\n /**\n * Generate response object and publish it to the listeners.\n */\n async _publishResponse(): Promise<void> {\n if (this.aborted) {\n return\n }\n try {\n const response = await this._createResponse()\n const result = RequestLog.fromRequestResponse(this.sentRequest.toJSON(), response.toJSON())\n if (this.redirects.length) {\n result.redirects = this.redirects\n }\n result.size = new RequestsSize()\n if (this.sentRequest.httpMessage) {\n result.size.request = Buffer.from(this.sentRequest.httpMessage).length\n }\n if (response.payload) {\n if (typeof response.payload === 'string') {\n result.size.response = response.payload.length\n } else {\n result.size.response = response.payload.data.length\n }\n }\n this.finalizeRequest(result)\n } catch (e) {\n const error = e as Error\n this.logger.error('Error in _publishResponse:', error)\n this._errorRequest({\n message: (error && error.message) || 'Unknown error occurred',\n })\n }\n this.abort()\n this._cleanUp()\n }\n\n /**\n * closes the connection, if any\n */\n closeClient(): void {\n if (this.socket && !this.socket.destroyed) {\n this.logger.debug('Closing the socket connection...')\n this.socket.destroy()\n }\n }\n\n /**\n * Handles the response with NTLM authorization\n */\n async handleNtlmResponse(): Promise<void> {\n this.logger.debug('Handling NTLM response...')\n this.logger.debug('Current headers:', this.currentHeaders?.toString())\n this.logger.debug('Auth state:', this.authManager.getAuthState())\n\n const shouldRetry = this.authManager.handleNtlmResponse(this.currentHeaders)\n this.logger.debug('Should retry NTLM:', shouldRetry)\n\n if (shouldRetry) {\n // Update the parent auth state to match AuthManager state\n this.auth = this.authManager.getAuthState()\n this._cleanUpRedirect()\n\n try {\n const message = await this.prepareMessage()\n await this.writeMessage(message)\n // Don't return here - let the socket listeners handle the response\n } catch (error) {\n this.logger.error('Failed to retry NTLM authentication:', error)\n this._errorRequest({\n message: `NTLM retry failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n })\n }\n return\n }\n\n this.logger.debug('NTLM authentication completed')\n // Clear both auth states\n this.authManager.clearAuthState()\n delete this.auth\n this.emit('loadend')\n this._publishResponse()\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadSupport.d.ts","sourceRoot":"","sources":["../../../../src/runtime/http-engine/PayloadSupport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadSupport.d.ts","sourceRoot":"","sources":["../../../../src/runtime/http-engine/PayloadSupport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAEtD,OAAO,EACL,OAAO,EAKR,MAAM,6CAA6C,CAAA;AAEpD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA4CvF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import formDataConverter from './FormData.js';
|
|
2
|
+
import { HttpEngineErrorFactory } from './errors/index.js';
|
|
2
3
|
import { PayloadSerializer, } from '../../lib/transformers/PayloadSerializer.js';
|
|
3
4
|
/**
|
|
4
5
|
* Normalizes line endings to CRLF
|
|
@@ -74,6 +75,6 @@ export function payloadToBuffer(headers, payload) {
|
|
|
74
75
|
headers.set('Content-Type', result.type);
|
|
75
76
|
return result.buffer;
|
|
76
77
|
}
|
|
77
|
-
throw
|
|
78
|
+
throw HttpEngineErrorFactory.unsupportedPayload(payload.type);
|
|
78
79
|
}
|
|
79
80
|
//# sourceMappingURL=PayloadSupport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadSupport.js","sourceRoot":"","sources":["../../../../src/runtime/http-engine/PayloadSupport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PayloadSupport.js","sourceRoot":"","sources":["../../../../src/runtime/http-engine/PayloadSupport.ts"],"names":[],"mappings":"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","sourcesContent":["import formDataConverter from './FormData.js'\nimport { Headers } from '../../lib/headers/Headers.js'\nimport { HttpEngineErrorFactory } from './errors/index.js'\nimport {\n Payload,\n PayloadSerializer,\n IMultipartBody,\n IFileMeta,\n IBlobMeta,\n} from '../../lib/transformers/PayloadSerializer.js'\n\n/**\n * Normalizes line endings to CRLF\n * https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/wtf/text/line_ending.cc;l=68\n *\n * @param string A string to be normalized.\n * @return normalized string\n */\nexport function normalizeString(string: string): string {\n let result = ''\n for (let i = 0; i < string.length; i++) {\n const c = string[i]\n const p = string[i + 1]\n if (c === '\\r') {\n // Safe to look ahead because of trailing '\\0'.\n if (p && p !== '\\n') {\n // Turn CR into CRLF.\n result += '\\r'\n result += '\\n'\n }\n } else if (c === '\\n') {\n result += '\\r'\n result += '\\n'\n } else {\n // Leave other characters alone.\n result += c\n }\n }\n return result\n}\n\n/**\n * Transforms the request payload into a `Buffer`\n *\n * @param headers A headers object where to append headers when needed\n * @param payload A payload message\n * @returns A promise resolved to a `Buffer`.\n */\nexport function payloadToBuffer(headers: Headers, payload?: Payload): Buffer | undefined {\n if (!payload) {\n return undefined\n }\n if (typeof payload === 'string') {\n payload = normalizeString(payload)\n return Buffer.from(payload, 'utf8')\n }\n\n if (payload.type === 'string') {\n return payloadToBuffer(headers, payload.data as string)\n }\n\n if (payload.type === 'file') {\n const meta = payload.meta as IFileMeta\n if (!headers.has('content-type') && meta.mime) {\n headers.set('content-type', meta.mime)\n }\n return PayloadSerializer.deserializeFileBuffer(payload)\n }\n\n if (payload.type === 'blob') {\n const meta = payload.meta as IBlobMeta\n if (!headers.has('content-type') && meta.mime) {\n headers.set('content-type', meta.mime)\n }\n return PayloadSerializer.deserializeBlobBuffer(payload)\n }\n\n if (payload.type === 'buffer') {\n return PayloadSerializer.deserializeBuffer(payload.data as number[])\n }\n\n if (payload.type === 'arraybuffer') {\n return PayloadSerializer.deserializeArrayBufferBuffer(payload.data as number[])\n }\n\n if (payload.type === 'formdata') {\n const result = formDataConverter(payload.data as IMultipartBody[])\n headers.set('Content-Type', result.type)\n return result.buffer\n }\n\n throw HttpEngineErrorFactory.unsupportedPayload(payload.type)\n}\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Headers } from '../../../lib/headers/Headers.js';
|
|
2
|
+
import { type Logger, type ILogObj } from '../../../lib/logging/index.js';
|
|
3
|
+
import type { INtlmAuthorization, IAuthorizationSettingsUnion } from '../../../models/Authorization.js';
|
|
4
|
+
import type { IRequestAuthState } from '../CoreEngine.js';
|
|
5
|
+
export interface ProxyAuthCredentials {
|
|
6
|
+
proxyUsername?: string;
|
|
7
|
+
proxyPassword?: string;
|
|
8
|
+
proxyAuthorization?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AuthOptions {
|
|
11
|
+
logger: Logger<ILogObj>;
|
|
12
|
+
proxyCredentials?: ProxyAuthCredentials;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthorizationConfig {
|
|
15
|
+
type: string;
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
config?: IAuthorizationSettingsUnion;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Manages all authentication logic for HTTP requests
|
|
21
|
+
*/
|
|
22
|
+
export declare class AuthManager {
|
|
23
|
+
private logger;
|
|
24
|
+
private proxyCredentials?;
|
|
25
|
+
private authState?;
|
|
26
|
+
constructor(options: AuthOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Handle all authorization types for request headers.
|
|
29
|
+
* It applied authorization data defined on the request object.
|
|
30
|
+
*/
|
|
31
|
+
handleRequestAuthorization(headers: Headers, authorizationConfig?: AuthorizationConfig[], hostname?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Handle NTLM authentication
|
|
34
|
+
*/
|
|
35
|
+
handleNtlmAuth(authData: INtlmAuthorization, headers: Headers, hostname?: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Handle NTLM response from server
|
|
38
|
+
*/
|
|
39
|
+
handleNtlmResponse(headers: Headers): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Generate proxy authorization header
|
|
42
|
+
*/
|
|
43
|
+
generateProxyAuthHeader(): string | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Handle Basic authentication
|
|
46
|
+
*/
|
|
47
|
+
handleBasicAuth(username: string, password: string, headers: Headers): void;
|
|
48
|
+
/**
|
|
49
|
+
* Handle Bearer token authentication
|
|
50
|
+
*/
|
|
51
|
+
handleBearerAuth(token: string, headers: Headers): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get current authentication state
|
|
54
|
+
*/
|
|
55
|
+
getAuthState(): IRequestAuthState | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Set authentication state
|
|
58
|
+
*/
|
|
59
|
+
setAuthState(state: IRequestAuthState): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clear authentication state
|
|
62
|
+
*/
|
|
63
|
+
clearAuthState(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Check if authentication is in progress
|
|
66
|
+
*/
|
|
67
|
+
isAuthenticating(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Check if we have credentials for proxy authentication
|
|
70
|
+
*/
|
|
71
|
+
hasProxyCredentials(): boolean;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=AuthManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/http-engine/auth/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAEvG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAWzD,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACvB,gBAAgB,CAAC,EAAE,oBAAoB,CAAA;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,2BAA2B,CAAA;CACrC;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAsB;IAC/C,OAAO,CAAC,SAAS,CAAC,CAAmB;gBAEzB,OAAO,EAAE,WAAW;IAKhC;;;OAGG;IACH,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAqClH;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAqCvF;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IA6B7C;;OAEG;IACH,uBAAuB,IAAI,MAAM,GAAG,SAAS;IA8B7C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAK3E;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAIvD;;OAEG;IACH,YAAY,IAAI,iBAAiB,GAAG,SAAS;IAI7C;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAI5C;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,mBAAmB,IAAI,OAAO;CAI/B"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { NtlmAuth } from '../ntlm/NtlmAuth.js';
|
|
2
|
+
import { HttpEngineErrorFactory } from '../errors/index.js';
|
|
3
|
+
import { HEADER_AUTHORIZATION, HEADER_CONNECTION, HEADER_WWW_AUTHENTICATE, NTLM_PREFIX, KEEP_ALIVE, BASIC_PREFIX, } from '../constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* Manages all authentication logic for HTTP requests
|
|
6
|
+
*/
|
|
7
|
+
export class AuthManager {
|
|
8
|
+
logger;
|
|
9
|
+
proxyCredentials;
|
|
10
|
+
authState;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.logger = options.logger;
|
|
13
|
+
this.proxyCredentials = options.proxyCredentials;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Handle all authorization types for request headers.
|
|
17
|
+
* It applied authorization data defined on the request object.
|
|
18
|
+
*/
|
|
19
|
+
handleRequestAuthorization(headers, authorizationConfig, hostname) {
|
|
20
|
+
if (!authorizationConfig || !Array.isArray(authorizationConfig)) {
|
|
21
|
+
this.logger.debug(`No authorization data on the request. Skipping setting up authorization.`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const enabled = authorizationConfig.filter((i) => i.enabled);
|
|
25
|
+
if (!enabled.length) {
|
|
26
|
+
this.logger.debug(`No enabled authorization data on the request. Skipping setting up authorization.`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const ntlm = enabled.find((i) => i.type === 'ntlm');
|
|
30
|
+
if (ntlm && ntlm.config) {
|
|
31
|
+
this.logger.debug(`Found NTLM authorization config.`);
|
|
32
|
+
this.handleNtlmAuth(ntlm.config, headers, hostname);
|
|
33
|
+
}
|
|
34
|
+
const basic = enabled.find((i) => i.type === 'basic');
|
|
35
|
+
if (basic && basic.config) {
|
|
36
|
+
this.logger.debug(`Found basic authorization config.`);
|
|
37
|
+
const config = basic.config;
|
|
38
|
+
if (config.username && config.password) {
|
|
39
|
+
this.handleBasicAuth(config.username, config.password, headers);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const bearer = enabled.find((i) => i.type === 'bearer');
|
|
43
|
+
if (bearer && bearer.config) {
|
|
44
|
+
this.logger.debug(`Found bearer authorization config.`);
|
|
45
|
+
const config = bearer.config;
|
|
46
|
+
if (config.token) {
|
|
47
|
+
this.handleBearerAuth(config.token, headers);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Handle NTLM authentication
|
|
53
|
+
*/
|
|
54
|
+
handleNtlmAuth(authData, headers, hostname) {
|
|
55
|
+
try {
|
|
56
|
+
const auth = new NtlmAuth(authData);
|
|
57
|
+
if (!this.authState) {
|
|
58
|
+
this.authState = {
|
|
59
|
+
method: 'ntlm',
|
|
60
|
+
state: 0,
|
|
61
|
+
headers: headers.toString(),
|
|
62
|
+
};
|
|
63
|
+
// Use the provided hostname or empty string for Message1
|
|
64
|
+
const msg = auth.createMessage1(hostname || '');
|
|
65
|
+
headers.set(HEADER_AUTHORIZATION, `${NTLM_PREFIX}${msg.toBase64()}`);
|
|
66
|
+
headers.set(HEADER_CONNECTION, KEEP_ALIVE);
|
|
67
|
+
this.logger.debug('Set NTLM message1 header with hostname:', hostname || '');
|
|
68
|
+
}
|
|
69
|
+
else if (this.authState && this.authState.state === 1) {
|
|
70
|
+
if (!this.authState.challengeHeader) {
|
|
71
|
+
throw new Error('NTLM challenge header is missing');
|
|
72
|
+
}
|
|
73
|
+
// Use the provided hostname or empty string for Message3
|
|
74
|
+
const msg = auth.createMessage3(this.authState.challengeHeader, hostname || '');
|
|
75
|
+
this.authState.state = 2;
|
|
76
|
+
headers.set(HEADER_AUTHORIZATION, `${NTLM_PREFIX}${msg.toBase64()}`);
|
|
77
|
+
this.logger.debug('Set NTLM message3 header with hostname:', hostname || '');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.logger.warn('Invalid NTLM state:', this.authState?.state);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.logger.error('NTLM authentication error:', error);
|
|
85
|
+
delete this.authState;
|
|
86
|
+
throw HttpEngineErrorFactory.authenticationError(`NTLM authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, 'ntlm');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Handle NTLM response from server
|
|
91
|
+
*/
|
|
92
|
+
handleNtlmResponse(headers) {
|
|
93
|
+
if (!this.authState) {
|
|
94
|
+
throw HttpEngineErrorFactory.authenticationError('No auth data.', undefined, 'ntlm');
|
|
95
|
+
}
|
|
96
|
+
this.logger.debug('Handling NTLM response.');
|
|
97
|
+
if (this.authState.state === 0) {
|
|
98
|
+
if (headers.has(HEADER_WWW_AUTHENTICATE)) {
|
|
99
|
+
this.authState.state = 1;
|
|
100
|
+
const authHeader = headers.get(HEADER_WWW_AUTHENTICATE);
|
|
101
|
+
// Extract just the base64 part after "NTLM " prefix
|
|
102
|
+
this.authState.challengeHeader = authHeader?.replace(/^NTLM\s+/i, '') || '';
|
|
103
|
+
if (!this.authState.challengeHeader) {
|
|
104
|
+
this.logger.error('NTLM challenge header is empty after parsing');
|
|
105
|
+
delete this.authState;
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
this.logger.debug('NTLM challenge header was set:', this.authState.challengeHeader);
|
|
109
|
+
return true; // Indicates we need to retry with challenge
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Authentication complete or failed
|
|
113
|
+
this.logger.debug('NTLM authentication complete or failed.');
|
|
114
|
+
delete this.authState;
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate proxy authorization header
|
|
119
|
+
*/
|
|
120
|
+
generateProxyAuthHeader() {
|
|
121
|
+
const { proxyUsername, proxyPassword, proxyAuthorization } = this.proxyCredentials || {};
|
|
122
|
+
if (!proxyUsername || !proxyPassword) {
|
|
123
|
+
if (!proxyAuthorization) {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
return proxyAuthorization;
|
|
127
|
+
}
|
|
128
|
+
if (!proxyAuthorization || proxyAuthorization === 'Basic') {
|
|
129
|
+
// Basic authentication
|
|
130
|
+
const token = Buffer.from(`${proxyUsername}:${proxyPassword}`).toString('base64');
|
|
131
|
+
return `${BASIC_PREFIX}${token}`;
|
|
132
|
+
}
|
|
133
|
+
if (proxyAuthorization === 'Digest') {
|
|
134
|
+
// Note: Digest authentication is handled by ProxyAuthHandler in connections
|
|
135
|
+
// This is just a placeholder for the header format
|
|
136
|
+
this.logger.warn('Digest proxy authentication should be handled by ProxyAuthHandler');
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
throw HttpEngineErrorFactory.authenticationError(`Unsupported proxy authorization type: ${proxyAuthorization}`, undefined, 'proxy');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Handle Basic authentication
|
|
143
|
+
*/
|
|
144
|
+
handleBasicAuth(username, password, headers) {
|
|
145
|
+
const token = Buffer.from(`${username}:${password}`).toString('base64');
|
|
146
|
+
headers.set(HEADER_AUTHORIZATION, `${BASIC_PREFIX}${token}`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Handle Bearer token authentication
|
|
150
|
+
*/
|
|
151
|
+
handleBearerAuth(token, headers) {
|
|
152
|
+
headers.set(HEADER_AUTHORIZATION, `Bearer ${token}`);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get current authentication state
|
|
156
|
+
*/
|
|
157
|
+
getAuthState() {
|
|
158
|
+
return this.authState;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Set authentication state
|
|
162
|
+
*/
|
|
163
|
+
setAuthState(state) {
|
|
164
|
+
this.authState = state;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clear authentication state
|
|
168
|
+
*/
|
|
169
|
+
clearAuthState() {
|
|
170
|
+
delete this.authState;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if authentication is in progress
|
|
174
|
+
*/
|
|
175
|
+
isAuthenticating() {
|
|
176
|
+
return !!this.authState;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if we have credentials for proxy authentication
|
|
180
|
+
*/
|
|
181
|
+
hasProxyCredentials() {
|
|
182
|
+
const { proxyUsername, proxyPassword, proxyAuthorization } = this.proxyCredentials || {};
|
|
183
|
+
return !!(proxyUsername && proxyPassword) || !!proxyAuthorization;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=AuthManager.js.map
|