createDio function

Dio createDio()

Creates a new Dio instance with configured interceptors.

On Android and iOS, HTTPS requests ride on the platform's native TLS stack via NativeAdapter (Cronet on Android, URLSession on iOS). Campus Wi-Fi has a TLS DPI that RSTs connections whose ClientHello fingerprint isn't on its allowlist; dart:io's BoringSSL fails, but Cronet and URLSession pass.

Cookies are shared across all clients via the global cookieJar.

Implementation

Dio createDio() {
  final dio = Dio()
    ..options = BaseOptions(
      validateStatus: (status) => status != null && status < 400,
      followRedirects: false,
    );

  if (Platform.isAndroid || Platform.isIOS) {
    dio.httpClientAdapter = NativeAdapter(
      createCupertinoConfiguration: () =>
          URLSessionConfiguration.defaultSessionConfiguration()
            ..httpShouldSetCookies = false,
    );
  }

  dio.interceptors.addAll([
    CookieManager(cookieJar), // Store cookies
    NullHeaderInterceptor(), // Strip Cookie: null from dio_cookie_manager
    ClientIdentifierInterceptor(), // Identify app on campus Wi-Fi
    HttpsInterceptor(), // Enforce HTTPS
    RedirectInterceptor(() => dio), // Handle redirects within this Dio instance
    LogInterceptor(), // Log requests and responses
  ]);

  return dio;
}