Skip to content

Commit c67075e

Browse files
authored
feat(fdc): Added x-firebase-client header (#17015)
1 parent 6b76260 commit c67075e

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

packages/firebase_data_connect/firebase_data_connect/lib/src/common/common_library.dart

+4
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ String getGoogApiVal(CallerSDKType sdkType, String packageVersion) {
2929
return apiClientValue;
3030
}
3131

32+
String getFirebaseClientVal(String packageVersion) {
33+
return 'flutter-fire-dc/$packageVersion';
34+
}
35+
3236
/// Transport Options for connecting to a specific host.
3337
class TransportOptions {
3438
/// Constructor

packages/firebase_data_connect/firebase_data_connect/lib/src/network/grpc_transport.dart

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class GRPCTransport implements DataConnectTransport {
7777
Map<String, String> metadata = {
7878
'x-goog-request-params': 'location=${options.location}&frontend=data',
7979
'x-goog-api-client': getGoogApiVal(sdkType, packageVersion),
80+
'x-firebase-client': getFirebaseClientVal(packageVersion)
8081
};
8182

8283
if (authToken != null) {

packages/firebase_data_connect/firebase_data_connect/lib/src/network/rest_transport.dart

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class RestTransport implements DataConnectTransport {
8585
'Content-Type': 'application/json',
8686
'Accept': 'application/json',
8787
'x-goog-api-client': getGoogApiVal(sdkType, packageVersion),
88+
'x-firebase-client': getFirebaseClientVal(packageVersion)
8889
};
8990
String? appCheckToken;
9091
try {

packages/firebase_data_connect/firebase_data_connect/test/src/network/rest_transport_test.dart

+37
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'dart:convert';
1717
import 'package:firebase_app_check/firebase_app_check.dart';
1818
import 'package:firebase_auth/firebase_auth.dart';
1919
import 'package:firebase_data_connect/src/common/common_library.dart';
20+
import 'package:firebase_data_connect/src/dataconnect_version.dart';
2021
import 'package:firebase_data_connect/src/network/rest_library.dart';
2122
import 'package:flutter_test/flutter_test.dart';
2223
import 'package:http/http.dart' as http;
@@ -260,6 +261,42 @@ void main() {
260261
),
261262
).called(1);
262263
});
264+
test('invokeOperation should include x-firebase-client headers', () async {
265+
final mockResponse = http.Response('{"data": {"key": "value"}}', 200);
266+
when(
267+
mockHttpClient.post(
268+
any,
269+
headers: anyNamed('headers'),
270+
body: anyNamed('body'),
271+
),
272+
).thenAnswer((_) async => mockResponse);
273+
274+
when(mockUser.getIdToken()).thenAnswer((_) async => 'authToken123');
275+
when(mockAppCheck.getToken()).thenAnswer((_) async => 'appCheckToken123');
276+
277+
final deserializer = (String data) => 'Deserialized Data';
278+
279+
await transport.invokeOperation(
280+
'testQuery',
281+
'executeQuery',
282+
deserializer,
283+
null,
284+
null,
285+
'authToken123',
286+
);
287+
288+
verify(
289+
mockHttpClient.post(
290+
any,
291+
headers: argThat(
292+
containsPair(
293+
'x-firebase-client', getFirebaseClientVal(packageVersion)),
294+
named: 'headers',
295+
),
296+
body: anyNamed('body'),
297+
),
298+
).called(1);
299+
});
263300

264301
test(
265302
'invokeOperation should handle missing auth and appCheck tokens gracefully',

0 commit comments

Comments
 (0)