Skip to content

Commit 1ccfee9

Browse files
Include firebase app id header
1 parent 52e39a8 commit 1ccfee9

File tree

3 files changed

+68
-9
lines changed

3 files changed

+68
-9
lines changed

Sources/DataConnect.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class DataConnect {
2424
private var app: FirebaseApp
2525
private var settings: DataConnectSettings
2626

27-
private var grpcClient: GrpcClient
27+
internal var grpcClient: GrpcClient
2828
private var operationsManager: OperationsManager
2929

3030
private static var instanceStore = InstanceStore()
@@ -62,7 +62,7 @@ public class DataConnect {
6262
}
6363

6464
grpcClient = GrpcClient(
65-
projectId: projectID,
65+
app: self.app,
6666
settings: settings,
6767
connectorConfig: connectorConfig,
6868
auth: Auth.auth(app: app),
@@ -79,12 +79,12 @@ public class DataConnect {
7979
self.settings = settings
8080
self.connectorConfig = connectorConfig
8181

82-
guard let projectID = app.options.projectID else {
82+
guard app.options.projectID != nil else {
8383
fatalError("Firebase DataConnect requires the projectID to be set in the app options")
8484
}
8585

8686
grpcClient = GrpcClient(
87-
projectId: projectID,
87+
app: self.app,
8888
settings: settings,
8989
connectorConfig: connectorConfig,
9090
auth: Auth.auth(app: app),

Sources/Internal/GrpcClient.swift

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Foundation
1616

1717
import FirebaseAppCheck
1818
import FirebaseAuth
19-
import FirebaseCoreInternal
19+
import FirebaseCore
2020
import GRPC
2121
import NIOCore
2222
import NIOHPACK
@@ -28,6 +28,8 @@ import SwiftProtobuf
2828
actor GrpcClient: CustomStringConvertible {
2929
nonisolated let description: String
3030

31+
private let app: FirebaseApp
32+
3133
private let projectId: String
3234

3335
private let threadPoolSize = 1
@@ -42,10 +44,11 @@ actor GrpcClient: CustomStringConvertible {
4244

4345
private let appCheck: AppCheck?
4446

45-
private enum RequestHeaders {
47+
internal enum RequestHeaders {
4648
static let googRequestParamsHeader = "x-goog-request-params"
4749
static let authorizationHeader = "x-firebase-auth-token"
4850
static let appCheckHeader = "X-Firebase-AppCheck"
51+
static let firebaseAppId = "x-firebase-gmpid"
4952
}
5053

5154
private let googRequestHeaderValue: String
@@ -69,11 +72,18 @@ actor GrpcClient: CustomStringConvertible {
6972
}
7073
}()
7174

72-
init(projectId: String, settings: DataConnectSettings, connectorConfig: ConnectorConfig,
75+
init(app: FirebaseApp, settings: DataConnectSettings, connectorConfig: ConnectorConfig,
7376
auth: Auth,
7477
appCheck: AppCheck?) {
78+
79+
self.app = app
80+
81+
guard let projectId = app.options.projectID else {
82+
fatalError("Data Connect requires a Firebase project ID to be specified.")
83+
}
7584
self.projectId = projectId
76-
serverSettings = settings
85+
86+
self.serverSettings = settings
7787
self.connectorConfig = connectorConfig
7888
self.auth = auth
7989
self.appCheck = appCheck
@@ -173,10 +183,11 @@ actor GrpcClient: CustomStringConvertible {
173183
}
174184
}
175185

176-
private func createCallOptions() async -> CallOptions {
186+
internal func createCallOptions() async -> CallOptions {
177187
var headers = HPACKHeaders()
178188

179189
headers.add(name: RequestHeaders.googRequestParamsHeader, value: googRequestHeaderValue)
190+
headers.add(name: RequestHeaders.firebaseAppId, value: self.app.options.googleAppID)
180191

181192
// Add Auth token if available
182193
do {

Tests/Unit/HeaderTests.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// HeaderTests.swift
3+
// FirebaseDataConnect
4+
//
5+
// Created by Aashish Patil on 9/18/24.
6+
//
7+
8+
import FirebaseCore
9+
@testable import FirebaseDataConnect
10+
import Foundation
11+
import GRPC
12+
13+
import XCTest
14+
15+
final class HeaderTests: XCTestCase {
16+
17+
static var defaultApp: FirebaseApp?
18+
19+
static var options: FirebaseOptions = {
20+
let options = FirebaseOptions(googleAppID: "0:0000000000000:ios:testAppId",
21+
gcmSenderID: "00000000000000000-00000000000-000000000")
22+
options.projectID = "fdc-test"
23+
options.apiKey = "testDummyApiKey"
24+
return options
25+
}()
26+
27+
var fakeConnectorConfigOne = ConnectorConfig(
28+
serviceId: "dataconnect",
29+
location: "us-central1",
30+
connector: "kitchensink"
31+
)
32+
33+
override class func setUp() {
34+
FirebaseApp.configure(options: options)
35+
defaultApp = FirebaseApp.app()
36+
}
37+
38+
func testGmpAppIdHeader() async throws {
39+
let dcOne = DataConnect.dataConnect(connectorConfig: fakeConnectorConfigOne)
40+
let callOptions = await dcOne.grpcClient.createCallOptions()
41+
let values = callOptions.customMetadata.values(
42+
forHeader: GrpcClient.RequestHeaders.firebaseAppId, canonicalForm: false
43+
)
44+
let contains = values.contains { $0 == HeaderTests.defaultApp!.options.googleAppID}
45+
XCTAssertTrue(contains)
46+
}
47+
48+
}

0 commit comments

Comments
 (0)