use a static map for additional headers
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+17
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+37
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user