[cronet_http] Add DNS configuration options to CronetEngine.build (#1945)

* [cronet_http] Add DNS configuration options to CronetEngine.build

Expose Cronet DnsOptions through new CronetEngine.build parameters:
useBuiltInDnsResolver, enableStaleDns, persistHostCache and
persistHostCachePeriod.

Cronet enables QUIC by default, and with QUIC enabled it resolves hosts
through its built-in DNS resolver. On some cellular networks and in
background isolates (e.g. WorkManager) that resolver fails with
ERROR_HOSTNAME_NOT_RESOLVED while the system resolver works.
useBuiltInDnsResolver: false forces the system resolver;
enableStaleDns/persistHostCache allow a freshly created engine to serve
recently used hosts from a persisted cache.

setDnsOptions is available on the stable CronetEngine.Builder in both
cronet-api artifacts the plugin ships (play-services and embedded), and
the Java API layer transparently falls back to an experimental-options
JSON patch on implementations that do not support DnsOptions natively,
so no experimental bindings are required.

Helps with https://github.com/dart-lang/http/issues/1217

* [cronet_http] Add fine-grained stale-DNS options to CronetEngine.build

useStaleOnNameNotResolved, allowCrossNetworkUsage and maxStaleDnsExpiredDelay
let a request fall back to an expired host cache entry instead of failing
with ERROR_HOSTNAME_NOT_RESOLVED when a fresh DNS lookup fails -- independent
of which resolver (built-in vs system) performed the lookup.

* Update pkgs/cronet_http/lib/src/cronet_client.dart

Co-authored-by: Brian Quinlan <bquinlan@google.com>

* [cronet_http] Refine DnsOption documentation

Updates the description for `enableStaleDns` for improved clarity and removes internal details about Cronet's experimental options fallback for `DnsOptions`.

---------

Co-authored-by: Brian Quinlan <bquinlan@google.com>
6 files changed
tree: 781e0cce8385fe51ed3cf26d796578222ebd191e
  1. .gemini/
  2. .github/
  3. pkgs/
  4. tool/
  5. .gitattributes
  6. .gitignore
  7. analysis_options.yaml
  8. CONTRIBUTING.md
  9. LICENSE
  10. mono_repo.yaml
  11. README.md
README.md

Build Status

A composable, Future-based library for making HTTP requests.

package:http contains a set of high-level functions and classes that make it easy to consume HTTP resources. It's multi-platform, and supports mobile, desktop, and the browser.

Packages

PackageDescriptionVersion
cronet_httpAn Android Flutter plugin that provides access to the Cronet HTTP client.pub package
cupertino_httpA macOS/iOS Flutter plugin that provides access to the Foundation URL Loading System.pub package
flutter_http_exampleAn Flutter app that demonstrates how to configure and use package:http.
httpA composable, multi-platform, Future-based API for HTTP requests.pub package
http2A HTTP/2 implementation in Dart.pub package
http_client_conformance_testsA library that tests whether implementations of package:http's Client class behave as expected.
http_multi_serverA dart:io HttpServer wrapper that handles requests from multiple servers.pub package
http_parserA platform-independent package for parsing and serializing HTTP formats.pub package
http_profileA library used by HTTP client authors to integrate with the DevTools Network View.pub package
ok_httpAn Android Flutter plugin that provides access to the OkHttp HTTP client and the OkHttp WebSocket API.pub package
web_socketAny easy-to-use library for communicating with WebSockets that has multiple implementations.pub package
web_socket_channelStreamChannel wrappers for WebSockets. Provides a cross-platform WebSocketChannel API.package issues
web_socket_conformance_testsA library that tests whether implementations of package:web_socket's WebSocket class behave as expected.

Contributing

If you'd like to contribute to any of these packages, see the Contributing Guide.