createHttpClient method

HttpClient createHttpClient()

Create an HttpClient configured with this proxy setup.

Implementation

HttpClient createHttpClient() {
  SecurityContext? securityContext;

  if (hasTLSCustomization) {
    securityContext = SecurityContext(withTrustedRoots: true);

    if (mtlsConfig?.cert != null) {
      try {
        securityContext.useCertificateChainBytes(
          utf8.encode(mtlsConfig!.cert!),
        );
      } catch (e) {
        stderr.writeln('ProxyConfiguration: Failed to set client cert: $e');
      }
    }

    if (mtlsConfig?.key != null) {
      try {
        securityContext.usePrivateKeyBytes(
          utf8.encode(mtlsConfig!.key!),
          password: mtlsConfig!.passphrase,
        );
      } catch (e) {
        stderr.writeln('ProxyConfiguration: Failed to set client key: $e');
      }
    }

    if (caCertificates != null) {
      for (final cert in caCertificates!) {
        try {
          securityContext.setTrustedCertificatesBytes(utf8.encode(cert));
        } catch (e) {
          stderr.writeln('ProxyConfiguration: Failed to add CA cert: $e');
        }
      }
    }
  }

  final client = securityContext != null
      ? HttpClient(context: securityContext)
      : HttpClient();

  if (hasProxy) {
    final proxy = effectiveProxy!;
    client.findProxy = (uri) {
      if (shouldBypass(uri.toString())) {
        return 'DIRECT';
      }
      final proxyUri = Uri.parse(proxy);
      return 'PROXY ${proxyUri.host}:${proxyUri.port}';
    };
  }

  return client;
}