HttpClient constructor

HttpClient({
  1. String userAgent = 'Dart/2.12',
  2. HttpProtocol protocol = HttpProtocol.quic,
  3. List<QuicHint> quicHints = const [],
  4. bool brotli = true,
  5. String acceptLanguage = 'en_US',
})

Initiates an HttpClient with the settings provided in the arguments.

The settings control whether this client supports brotli and HttpProtocols like quic, http2 and http/1.1. If quic is enabled, then quicHints can be provided. userAgent and acceptLanguage can also be provided.

Throws CronetNativeError if HttpClient can't be created.

Implementation

HttpClient({
  this.userAgent = 'Dart/2.12',
  this.protocol = HttpProtocol.quic,
  this.quicHints = const [],
  this.brotli = true,
  this.acceptLanguage = 'en_US',
}) : _cronetEngine = cronet.Cronet_Engine_Create() {
  if (_cronetEngine == nullptr) throw Error();
  wrapper.RegisterHttpClient(this, _cronetEngine.cast());
  // Starting the engine with parameters.
  final engineParams = cronet.Cronet_EngineParams_Create();
  if (engineParams == nullptr) throw Error();
  cronet.Cronet_EngineParams_user_agent_set(
      engineParams, userAgent.toNativeUtf8().cast<Int8>());

  switch (protocol) {
    case HttpProtocol.quic:
      cronet.Cronet_EngineParams_enable_quic_set(engineParams, true);
      break;
    case HttpProtocol.http2:
      cronet.Cronet_EngineParams_enable_http2_set(engineParams, true);
      cronet.Cronet_EngineParams_enable_quic_set(engineParams, false);
      break;
    case HttpProtocol.http:
      cronet.Cronet_EngineParams_enable_quic_set(engineParams, false);
      cronet.Cronet_EngineParams_enable_http2_set(engineParams, false);
      break;
    default:
      break;
  }
  if (protocol != HttpProtocol.quic && quicHints.isNotEmpty) {
    throw ArgumentError('Quic is not enabled but quic hints are provided.');
  }
  for (final quicHint in quicHints) {
    final hint = cronet.Cronet_QuicHint_Create();
    if (hint == nullptr) throw Error();
    cronet.Cronet_QuicHint_host_set(
        hint, quicHint.host.toNativeUtf8().cast<Int8>());
    cronet.Cronet_QuicHint_port_set(hint, quicHint.port);
    cronet.Cronet_QuicHint_alternate_port_set(hint, quicHint.alternatePort);
    cronet.Cronet_EngineParams_quic_hints_add(engineParams, hint);
    cronet.Cronet_QuicHint_Destroy(hint);
  }

  cronet.Cronet_EngineParams_enable_brotli_set(engineParams, brotli);
  cronet.Cronet_EngineParams_accept_language_set(
      engineParams, acceptLanguage.toNativeUtf8().cast<Int8>());

  final res =
      cronet.Cronet_Engine_StartWithParams(_cronetEngine, engineParams);
  if (res != Cronet_RESULT.Cronet_RESULT_SUCCESS) {
    throw CronetNativeError(res);
  }
  cronet.Cronet_EngineParams_Destroy(engineParams);
}