createDio function
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;
}