use a static map for additional headers

This commit is contained in:
Salvatore Giordano
2021-11-03 12:53:36 +01:00
parent dbe9e38ab0
commit 55e4c1ebd5
9 changed files with 74 additions and 38 deletions
@@ -25,6 +25,7 @@ import 'package:stream_chat/src/core/models/member.dart';
import 'package:stream_chat/src/core/models/message.dart'; import 'package:stream_chat/src/core/models/message.dart';
import 'package:stream_chat/src/core/models/own_user.dart'; import 'package:stream_chat/src/core/models/own_user.dart';
import 'package:stream_chat/src/core/models/user.dart'; import 'package:stream_chat/src/core/models/user.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
import 'package:stream_chat/src/core/util/utils.dart'; import 'package:stream_chat/src/core/util/utils.dart';
import 'package:stream_chat/src/db/chat_persistence_client.dart'; import 'package:stream_chat/src/db/chat_persistence_client.dart';
import 'package:stream_chat/src/event_type.dart'; import 'package:stream_chat/src/event_type.dart';
@@ -126,6 +127,12 @@ class StreamChatClient {
_originalChatPersistenceClient = value; _originalChatPersistenceClient = value;
} }
static String defaultUserAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
static Map<String, Object?> additionalHeaders = {};
ChatPersistenceClient? _originalChatPersistenceClient; ChatPersistenceClient? _originalChatPersistenceClient;
/// Chat persistence client /// Chat persistence client
@@ -0,0 +1,17 @@
import 'package:dio/dio.dart';
import 'package:stream_chat/stream_chat.dart';
/// Interceptor that sets additional headers for all requests.
class AdditionalHeadersInterceptor extends Interceptor {
@override
Future<void> onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) async {
options.headers = {
...options.headers,
...StreamChatClient.additionalHeaders,
};
return handler.next(options);
}
}
@@ -1,20 +0,0 @@
import 'package:dio/dio.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
import 'package:stream_chat/version.dart';
/// User agent interceptor that sets the user agent header
class UserAgentInterceptor extends Interceptor {
final _defaultUserAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
@override
Future<void> onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) async {
options.headers['X-Stream-Client'] =
'$_defaultUserAgent-${usedPackage.name}';
return handler.next(options);
}
}
@@ -8,7 +8,7 @@ import 'package:stream_chat/src/core/http/connection_id_manager.dart';
import 'package:stream_chat/src/core/http/interceptor/auth_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/auth_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/connection_id_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/connection_id_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/logging_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/logging_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/user_agent_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/additional_headers_interceptor.dart';
import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart'; import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart';
import 'package:stream_chat/src/core/http/token_manager.dart'; import 'package:stream_chat/src/core/http/token_manager.dart';
import 'package:stream_chat/src/location.dart'; import 'package:stream_chat/src/location.dart';
@@ -42,7 +42,7 @@ class StreamHttpClient {
..._options.headers, ..._options.headers,
} }
..interceptors.addAll([ ..interceptors.addAll([
UserAgentInterceptor(), AdditionalHeadersInterceptor(),
if (tokenManager != null) AuthInterceptor(this, tokenManager), if (tokenManager != null) AuthInterceptor(this, tokenManager),
if (connectionIdManager != null) if (connectionIdManager != null)
ConnectionIdInterceptor(connectionIdManager), ConnectionIdInterceptor(connectionIdManager),
-12
View File
@@ -1,22 +1,10 @@
import 'package:stream_chat/src/client/client.dart'; import 'package:stream_chat/src/client/client.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
/// Current package version /// Current package version
/// Used in [StreamChatClient] to build the `x-stream-client` header /// Used in [StreamChatClient] to build the `x-stream-client` header
// ignore: constant_identifier_names // ignore: constant_identifier_names
const PACKAGE_VERSION = '3.2.0'; const PACKAGE_VERSION = '3.2.0';
/// Default user agent used for the 'x-stream-client' header
final defaultUserAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
/// Current used package
/// This is used to set the `x-stream-client` header using info about
/// the package in use
/// For example: llc/core/ui
Package usedPackage = Package.llc;
/// Possible packages /// Possible packages
enum Package { enum Package {
/// The Low Level Client /// The Low Level Client
@@ -0,0 +1,37 @@
import 'package:dio/dio.dart';
import 'package:mocktail/mocktail.dart';
import 'package:stream_chat/src/core/http/interceptor/additional_headers_interceptor.dart';
import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart';
import 'package:stream_chat/src/core/http/stream_http_client.dart';
import 'package:stream_chat/src/core/http/token.dart';
import 'package:stream_chat/stream_chat.dart';
import 'package:test/test.dart';
import '../../../mocks.dart';
void main() {
late StreamHttpClient client;
late AdditionalHeadersInterceptor additionalHeadersInterceptor;
setUp(() {
client = MockHttpClient();
additionalHeadersInterceptor = AdditionalHeadersInterceptor();
});
test(
'`onRequest` should add additional headers in the request',
() async {
final options = RequestOptions(path: 'test-path');
final handler = RequestInterceptorHandler();
StreamChatClient.additionalHeaders = {'test-header': 'test-value'};
additionalHeadersInterceptor.onRequest(options, handler);
final updatedOptions = (await handler.future).data as RequestOptions;
final updateHeaders = updatedOptions.headers;
expect(updateHeaders.containsKey('test-header'), isTrue);
expect(updateHeaders['test-header'], 'test-value');
},
);
}
@@ -7,7 +7,7 @@ import 'package:stream_chat/src/core/http/connection_id_manager.dart';
import 'package:stream_chat/src/core/http/interceptor/auth_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/auth_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/connection_id_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/connection_id_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/logging_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/logging_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/user_agent_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/additional_headers_interceptor.dart';
import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart'; import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart';
import 'package:stream_chat/src/core/http/stream_http_client.dart'; import 'package:stream_chat/src/core/http/stream_http_client.dart';
import 'package:stream_chat/src/core/http/token_manager.dart'; import 'package:stream_chat/src/core/http/token_manager.dart';
@@ -54,7 +54,9 @@ void main() {
final client = StreamHttpClient(apiKey); final client = StreamHttpClient(apiKey);
expect( expect(
client.httpClient.interceptors.whereType<UserAgentInterceptor>().length, client.httpClient.interceptors
.whereType<AdditionalHeadersInterceptor>()
.length,
1); 1);
}); });
@@ -113,7 +113,10 @@ class StreamChatState extends State<StreamChat> {
connectivityStream: widget.connectivityStream, connectivityStream: widget.connectivityStream,
child: Builder( child: Builder(
builder: (context) { builder: (context) {
usedPackage = Package.ui; StreamChatClient.additionalHeaders = {
'X-Stream-Client':
'${StreamChatClient.defaultUserAgent}-${Package.ui}',
};
return widget.child ?? const Offstage(); return widget.child ?? const Offstage();
}, },
), ),
@@ -92,7 +92,9 @@ class StreamChatCoreState extends State<StreamChatCore>
with WidgetsBindingObserver { with WidgetsBindingObserver {
/// Constructor used for creating a new instance of [StreamChatCoreState]. /// Constructor used for creating a new instance of [StreamChatCoreState].
StreamChatCoreState() { StreamChatCoreState() {
usedPackage = Package.core; StreamChatClient.additionalHeaders = {
'X-Stream-Client': '${StreamChatClient.defaultUserAgent}-${Package.ui}',
};
} }
/// Initialized client used throughout the application. /// Initialized client used throughout the application.