|
@@ -1,18 +1,29 @@
|
|
|
import 'dart:io';
|
|
|
|
|
|
import 'package:dio/dio.dart';
|
|
|
+import 'package:ente_auth/core/configuration.dart';
|
|
|
+import 'package:ente_auth/core/constants.dart';
|
|
|
import 'package:fk_user_agent/fk_user_agent.dart';
|
|
|
+import 'package:flutter/foundation.dart';
|
|
|
import 'package:package_info_plus/package_info_plus.dart';
|
|
|
+import 'package:shared_preferences/shared_preferences.dart';
|
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
|
|
int kConnectTimeout = 15000;
|
|
|
|
|
|
class Network {
|
|
|
+ // apiEndpoint points to the Ente server's API endpoint
|
|
|
+ static const apiEndpoint = String.fromEnvironment(
|
|
|
+ "endpoint",
|
|
|
+ defaultValue: kDefaultProductionEndpoint,
|
|
|
+ );
|
|
|
late Dio _dio;
|
|
|
+ late Dio _enteDio;
|
|
|
|
|
|
Future<void> init() async {
|
|
|
await FkUserAgent.init();
|
|
|
final packageInfo = await PackageInfo.fromPlatform();
|
|
|
+ final preferences = await SharedPreferences.getInstance();
|
|
|
_dio = Dio(
|
|
|
BaseOptions(
|
|
|
connectTimeout: kConnectTimeout,
|
|
@@ -24,6 +35,18 @@ class Network {
|
|
|
),
|
|
|
);
|
|
|
_dio.interceptors.add(RequestIdInterceptor());
|
|
|
+ _enteDio = Dio(
|
|
|
+ BaseOptions(
|
|
|
+ baseUrl: apiEndpoint,
|
|
|
+ connectTimeout: kConnectTimeout,
|
|
|
+ headers: {
|
|
|
+ HttpHeaders.userAgentHeader: FkUserAgent.userAgent,
|
|
|
+ 'X-Client-Version': packageInfo.version,
|
|
|
+ 'X-Client-Package': packageInfo.packageName,
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ _enteDio.interceptors.add(EnteRequestInterceptor(preferences, apiEndpoint));
|
|
|
}
|
|
|
|
|
|
Network._privateConstructor();
|
|
@@ -31,6 +54,7 @@ class Network {
|
|
|
static Network instance = Network._privateConstructor();
|
|
|
|
|
|
Dio getDio() => _dio;
|
|
|
+ Dio get enteDio => _enteDio;
|
|
|
}
|
|
|
|
|
|
class RequestIdInterceptor extends Interceptor {
|
|
@@ -41,3 +65,27 @@ class RequestIdInterceptor extends Interceptor {
|
|
|
return super.onRequest(options, handler);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+class EnteRequestInterceptor extends Interceptor {
|
|
|
+ final SharedPreferences _preferences;
|
|
|
+ final String enteEndpoint;
|
|
|
+
|
|
|
+ EnteRequestInterceptor(this._preferences, this.enteEndpoint);
|
|
|
+
|
|
|
+ @override
|
|
|
+ void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
|
|
+ if (kDebugMode) {
|
|
|
+ assert(
|
|
|
+ options.baseUrl == enteEndpoint,
|
|
|
+ "interceptor should only be used for API endpoint",
|
|
|
+ );
|
|
|
+ }
|
|
|
+ // ignore: prefer_const_constructors
|
|
|
+ options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString());
|
|
|
+ final String? tokenValue = _preferences.getString(Configuration.tokenKey);
|
|
|
+ if (tokenValue != null) {
|
|
|
+ options.headers.putIfAbsent("X-Auth-Token", () => tokenValue);
|
|
|
+ }
|
|
|
+ return super.onRequest(options, handler);
|
|
|
+ }
|
|
|
+}
|