From 55e4c1ebd574122b70cd0bcb8d645a5a9f6bbb17 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 3 Nov 2021 12:53:36 +0100 Subject: [PATCH] use a static map for additional headers --- .../stream_chat/lib/src/client/client.dart | 7 ++++ .../additional_headers_interceptor.dart | 17 +++++++++ .../interceptor/user_agent_interceptor.dart | 20 ---------- .../lib/src/core/http/stream_http_client.dart | 4 +- packages/stream_chat/lib/version.dart | 12 ------ .../additional_headers_interceptor_test.dart | 37 +++++++++++++++++++ .../core/http/stream_http_client_test.dart | 6 ++- .../lib/src/stream_chat.dart | 5 ++- .../lib/src/stream_chat_core.dart | 4 +- 9 files changed, 74 insertions(+), 38 deletions(-) create mode 100644 packages/stream_chat/lib/src/core/http/interceptor/additional_headers_interceptor.dart delete mode 100644 packages/stream_chat/lib/src/core/http/interceptor/user_agent_interceptor.dart create mode 100644 packages/stream_chat/test/src/core/http/interceptor/additional_headers_interceptor_test.dart diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index b9f2136d..b88c8d35 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -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/own_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/db/chat_persistence_client.dart'; import 'package:stream_chat/src/event_type.dart'; @@ -126,6 +127,12 @@ class StreamChatClient { _originalChatPersistenceClient = value; } + static String defaultUserAgent = 'stream-chat-dart-client-' + '${CurrentPlatform.name}-' + '${PACKAGE_VERSION.split('+')[0]}'; + + static Map additionalHeaders = {}; + ChatPersistenceClient? _originalChatPersistenceClient; /// Chat persistence client diff --git a/packages/stream_chat/lib/src/core/http/interceptor/additional_headers_interceptor.dart b/packages/stream_chat/lib/src/core/http/interceptor/additional_headers_interceptor.dart new file mode 100644 index 00000000..466db58f --- /dev/null +++ b/packages/stream_chat/lib/src/core/http/interceptor/additional_headers_interceptor.dart @@ -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 onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) async { + options.headers = { + ...options.headers, + ...StreamChatClient.additionalHeaders, + }; + return handler.next(options); + } +} diff --git a/packages/stream_chat/lib/src/core/http/interceptor/user_agent_interceptor.dart b/packages/stream_chat/lib/src/core/http/interceptor/user_agent_interceptor.dart deleted file mode 100644 index 3f18dae2..00000000 --- a/packages/stream_chat/lib/src/core/http/interceptor/user_agent_interceptor.dart +++ /dev/null @@ -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 onRequest( - RequestOptions options, - RequestInterceptorHandler handler, - ) async { - options.headers['X-Stream-Client'] = - '$_defaultUserAgent-${usedPackage.name}'; - return handler.next(options); - } -} diff --git a/packages/stream_chat/lib/src/core/http/stream_http_client.dart b/packages/stream_chat/lib/src/core/http/stream_http_client.dart index 3008d40a..ddd8b52d 100644 --- a/packages/stream_chat/lib/src/core/http/stream_http_client.dart +++ b/packages/stream_chat/lib/src/core/http/stream_http_client.dart @@ -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/connection_id_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/token_manager.dart'; import 'package:stream_chat/src/location.dart'; @@ -42,7 +42,7 @@ class StreamHttpClient { ..._options.headers, } ..interceptors.addAll([ - UserAgentInterceptor(), + AdditionalHeadersInterceptor(), if (tokenManager != null) AuthInterceptor(this, tokenManager), if (connectionIdManager != null) ConnectionIdInterceptor(connectionIdManager), diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index 6eafab42..f0ea7c92 100644 --- a/packages/stream_chat/lib/version.dart +++ b/packages/stream_chat/lib/version.dart @@ -1,22 +1,10 @@ import 'package:stream_chat/src/client/client.dart'; -import 'package:stream_chat/src/core/platform_detector/platform_detector.dart'; /// Current package version /// Used in [StreamChatClient] to build the `x-stream-client` header // ignore: constant_identifier_names 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 enum Package { /// The Low Level Client diff --git a/packages/stream_chat/test/src/core/http/interceptor/additional_headers_interceptor_test.dart b/packages/stream_chat/test/src/core/http/interceptor/additional_headers_interceptor_test.dart new file mode 100644 index 00000000..b0f009e1 --- /dev/null +++ b/packages/stream_chat/test/src/core/http/interceptor/additional_headers_interceptor_test.dart @@ -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'); + }, + ); +} diff --git a/packages/stream_chat/test/src/core/http/stream_http_client_test.dart b/packages/stream_chat/test/src/core/http/stream_http_client_test.dart index b45f9e60..01b54b63 100644 --- a/packages/stream_chat/test/src/core/http/stream_http_client_test.dart +++ b/packages/stream_chat/test/src/core/http/stream_http_client_test.dart @@ -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/connection_id_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_http_client.dart'; import 'package:stream_chat/src/core/http/token_manager.dart'; @@ -54,7 +54,9 @@ void main() { final client = StreamHttpClient(apiKey); expect( - client.httpClient.interceptors.whereType().length, + client.httpClient.interceptors + .whereType() + .length, 1); }); diff --git a/packages/stream_chat_flutter/lib/src/stream_chat.dart b/packages/stream_chat_flutter/lib/src/stream_chat.dart index a2a40d0d..db645943 100644 --- a/packages/stream_chat_flutter/lib/src/stream_chat.dart +++ b/packages/stream_chat_flutter/lib/src/stream_chat.dart @@ -113,7 +113,10 @@ class StreamChatState extends State { connectivityStream: widget.connectivityStream, child: Builder( builder: (context) { - usedPackage = Package.ui; + StreamChatClient.additionalHeaders = { + 'X-Stream-Client': + '${StreamChatClient.defaultUserAgent}-${Package.ui}', + }; return widget.child ?? const Offstage(); }, ), diff --git a/packages/stream_chat_flutter_core/lib/src/stream_chat_core.dart b/packages/stream_chat_flutter_core/lib/src/stream_chat_core.dart index ce781c71..d43f3f51 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_chat_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_chat_core.dart @@ -92,7 +92,9 @@ class StreamChatCoreState extends State with WidgetsBindingObserver { /// Constructor used for creating a new instance of [StreamChatCoreState]. StreamChatCoreState() { - usedPackage = Package.core; + StreamChatClient.additionalHeaders = { + 'X-Stream-Client': '${StreamChatClient.defaultUserAgent}-${Package.ui}', + }; } /// Initialized client used throughout the application.