Skip to content

Commit 6a156da

Browse files
authored
fix(api): add default user-agent header to API subscription requests (#2709)
1 parent c8a80b5 commit 6a156da

11 files changed

+61
-32
lines changed

AmplifyPlugins/API/Sources/AWSAPIPlugin/Operation/AWSGraphQLSubscriptionTaskRunner.swift

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,17 @@ public class AWSGraphQLSubscriptionTaskRunner<R: Decodable>: InternalTaskRunner,
8181
// Retrieve request plugin option and
8282
// auth type in case of a multi-auth setup
8383
let pluginOptions = request.options.pluginOptions as? AWSPluginOptions
84+
let urlRequest = generateSubscriptionURLRequest(from: endpointConfig)
8485

8586
// Retrieve the subscription connection
8687
subscriptionQueue.sync {
8788
do {
8889
subscriptionConnection = try subscriptionConnectionFactory
8990
.getOrCreateConnection(for: endpointConfig,
90-
authService: authService,
91-
authType: pluginOptions?.authType,
92-
apiAuthProviderFactory: apiAuthProviderFactory)
91+
urlRequest: urlRequest,
92+
authService: authService,
93+
authType: pluginOptions?.authType,
94+
apiAuthProviderFactory: apiAuthProviderFactory)
9395
} catch {
9496
let error = APIError.operationError("Unable to get connection for api \(endpointConfig.name)", "", error)
9597
fail(error)
@@ -105,6 +107,14 @@ public class AWSGraphQLSubscriptionTaskRunner<R: Decodable>: InternalTaskRunner,
105107
})
106108
}
107109
}
110+
111+
private func generateSubscriptionURLRequest(
112+
from endpointConfig: AWSAPICategoryPluginConfiguration.EndpointConfig
113+
) -> URLRequest {
114+
var urlRequest = URLRequest(url: endpointConfig.baseURL)
115+
urlRequest.setValue(AWSAPIPluginsCore.baseUserAgent(), forHTTPHeaderField: URLRequestConstants.Header.userAgent)
116+
return urlRequest
117+
}
108118

109119
// MARK: - Subscription callbacks
110120

@@ -269,15 +279,17 @@ final public class AWSGraphQLSubscriptionOperation<R: Decodable>: GraphQLSubscri
269279
// Retrieve request plugin option and
270280
// auth type in case of a multi-auth setup
271281
let pluginOptions = request.options.pluginOptions as? AWSPluginOptions
282+
let urlRequest = generateSubscriptionURLRequest(from: endpointConfig)
272283

273284
// Retrieve the subscription connection
274285
subscriptionQueue.sync {
275286
do {
276287
subscriptionConnection = try subscriptionConnectionFactory
277288
.getOrCreateConnection(for: endpointConfig,
278-
authService: authService,
279-
authType: pluginOptions?.authType,
280-
apiAuthProviderFactory: apiAuthProviderFactory)
289+
urlRequest: urlRequest,
290+
authService: authService,
291+
authType: pluginOptions?.authType,
292+
apiAuthProviderFactory: apiAuthProviderFactory)
281293
} catch {
282294
let error = APIError.operationError("Unable to get connection for api \(endpointConfig.name)", "", error)
283295
dispatch(result: .failure(error))
@@ -295,6 +307,14 @@ final public class AWSGraphQLSubscriptionOperation<R: Decodable>: GraphQLSubscri
295307
}
296308
}
297309

310+
private func generateSubscriptionURLRequest(
311+
from endpointConfig: AWSAPICategoryPluginConfiguration.EndpointConfig
312+
) -> URLRequest {
313+
var urlRequest = URLRequest(url: endpointConfig.baseURL)
314+
urlRequest.setValue(AWSAPIPluginsCore.baseUserAgent(), forHTTPHeaderField: URLRequestConstants.Header.userAgent)
315+
return urlRequest
316+
}
317+
298318
// MARK: - Subscription callbacks
299319

300320
private func onAsyncSubscriptionEvent(event: SubscriptionItemEvent) {

AmplifyPlugins/API/Sources/AWSAPIPlugin/SubscriptionFactory/AWSSubscriptionConnectionFactory.swift

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,25 @@ class AWSSubscriptionConnectionFactory: SubscriptionConnectionFactory {
2222

2323
private var apiToConnectionProvider: [MapperCacheKey: ConnectionProvider] = [:]
2424

25-
func getOrCreateConnection(for endpointConfig: AWSAPICategoryPluginConfiguration.EndpointConfig,
26-
authService: AWSAuthServiceBehavior,
27-
authType: AWSAuthorizationType? = nil,
28-
apiAuthProviderFactory: APIAuthProviderFactory) throws -> SubscriptionConnection {
25+
func getOrCreateConnection(
26+
for endpointConfig: AWSAPICategoryPluginConfiguration.EndpointConfig,
27+
urlRequest: URLRequest,
28+
authService: AWSAuthServiceBehavior,
29+
authType: AWSAuthorizationType? = nil,
30+
apiAuthProviderFactory: APIAuthProviderFactory
31+
) throws -> SubscriptionConnection {
2932
return try concurrencyQueue.sync {
3033
let apiName = endpointConfig.name
3134

32-
let url = endpointConfig.baseURL
33-
34-
let authInterceptor = try getInterceptor(for: getOrCreateAuthConfiguration(from: endpointConfig,
35-
authType: authType),
36-
authService: authService,
37-
apiAuthProviderFactory: apiAuthProviderFactory)
35+
let authInterceptor = try self.getInterceptor(
36+
for: self.getOrCreateAuthConfiguration(from: endpointConfig, authType: authType),
37+
authService: authService,
38+
apiAuthProviderFactory: apiAuthProviderFactory
39+
)
3840

3941
// create or retrieve the connection provider. If creating, add interceptors onto the provider.
4042
let connectionProvider = apiToConnectionProvider[MapperCacheKey(apiName: apiName, authType: authType)] ??
41-
ConnectionProviderFactory.createConnectionProviderAsync(for: url,
43+
ConnectionProviderFactory.createConnectionProviderAsync(for: urlRequest,
4244
authInterceptor: authInterceptor,
4345
connectionType: .appSyncRealtime)
4446

AmplifyPlugins/API/Sources/AWSAPIPlugin/SubscriptionFactory/SubscriptionConnectionFactory.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// SPDX-License-Identifier: Apache-2.0
66
//
77

8+
import Foundation
9+
810
import Amplify
911
import AWSPluginsCore
1012
import AppSyncRealTimeClient
@@ -14,6 +16,7 @@ protocol SubscriptionConnectionFactory {
1416

1517
/// Get connection based on the connection type
1618
func getOrCreateConnection(for endpointConfig: AWSAPICategoryPluginConfiguration.EndpointConfig,
19+
urlRequest: URLRequest,
1720
authService: AWSAuthServiceBehavior,
1821
authType: AWSAuthorizationType?,
1922
apiAuthProviderFactory: APIAuthProviderFactory) throws -> SubscriptionConnection

AmplifyPlugins/API/Tests/AWSAPIPluginTests/Mocks/MockSubscription.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// SPDX-License-Identifier: Apache-2.0
66
//
77

8+
import Foundation
9+
810
@testable import AWSAPIPlugin
911
import Amplify
1012

@@ -14,6 +16,7 @@ import AppSyncRealTimeClient
1416
struct MockSubscriptionConnectionFactory: SubscriptionConnectionFactory {
1517
typealias OnGetOrCreateConnection = (
1618
AWSAPICategoryPluginConfiguration.EndpointConfig,
19+
URLRequest,
1720
AWSAuthServiceBehavior,
1821
AWSAuthorizationType?,
1922
APIAuthProviderFactory
@@ -27,11 +30,12 @@ struct MockSubscriptionConnectionFactory: SubscriptionConnectionFactory {
2730

2831
func getOrCreateConnection(
2932
for endpointConfig: AWSAPICategoryPluginConfiguration.EndpointConfig,
33+
urlRequest: URLRequest,
3034
authService: AWSAuthServiceBehavior,
3135
authType: AWSAuthorizationType?,
3236
apiAuthProviderFactory: APIAuthProviderFactory
3337
) throws -> SubscriptionConnection {
34-
try onGetOrCreateConnection(endpointConfig, authService, authType, apiAuthProviderFactory)
38+
try onGetOrCreateConnection(endpointConfig, urlRequest, authService, authType, apiAuthProviderFactory)
3539
}
3640

3741
}

AmplifyPlugins/API/Tests/AWSAPIPluginTests/Operation/AWSGraphQLSubscriptionOperationCancelTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class AWSGraphQLSubscriptionOperationCancelTests: XCTestCase {
6868
}
6969

7070
func testCancelSendsCompletion() async {
71-
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _ in
71+
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _, _ in
7272
return MockSubscriptionConnection(onSubscribe: { (_, _, eventHandler) -> SubscriptionItem in
7373
let item = SubscriptionItem(requestString: "", variables: nil, eventHandler: { _, _ in
7474
})
@@ -149,7 +149,7 @@ class AWSGraphQLSubscriptionOperationCancelTests: XCTestCase {
149149
}
150150

151151
func testFailureOnConnection() async {
152-
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _ in
152+
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _, _ in
153153
throw APIError.invalidConfiguration("something went wrong", "", nil)
154154
})
155155

@@ -190,7 +190,7 @@ class AWSGraphQLSubscriptionOperationCancelTests: XCTestCase {
190190

191191
func testCallingCancelWhileCreatingConnectionShouldCallCompletionListener() async {
192192
let connectionCreation = expectation(description: "connection factory called")
193-
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _ in
193+
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _, _ in
194194
connectionCreation.fulfill()
195195
return MockSubscriptionConnection(onSubscribe: { (_, _, eventHandler) -> SubscriptionItem in
196196
let item = SubscriptionItem(requestString: "", variables: nil, eventHandler: { _, _ in

AmplifyPlugins/API/Tests/AWSAPIPluginTests/Operation/AWSGraphQLSubscriptionTaskRunnerCancelTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class AWSGraphQLSubscriptionTaskRunnerCancelTests: XCTestCase {
6868
}
6969

7070
func testCancelSendsCompletion() async {
71-
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _ in
71+
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _, _ in
7272
return MockSubscriptionConnection(onSubscribe: { (_, _, eventHandler) -> SubscriptionItem in
7373
let item = SubscriptionItem(requestString: "", variables: nil, eventHandler: { _, _ in
7474
})
@@ -117,7 +117,7 @@ class AWSGraphQLSubscriptionTaskRunnerCancelTests: XCTestCase {
117117
}
118118

119119
func testFailureOnConnection() async {
120-
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _ in
120+
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _, _ in
121121
throw APIError.invalidConfiguration("something went wrong", "", nil)
122122
})
123123

@@ -149,7 +149,7 @@ class AWSGraphQLSubscriptionTaskRunnerCancelTests: XCTestCase {
149149

150150
func testCallingCancelWhileCreatingConnectionShouldCallCompletionListener() async {
151151
let connectionCreation = asyncExpectation(description: "connection factory called")
152-
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _ in
152+
let mockSubscriptionConnectionFactory = MockSubscriptionConnectionFactory(onGetOrCreateConnection: { _, _, _, _, _ in
153153
Task { await connectionCreation.fulfill() }
154154
return MockSubscriptionConnection(onSubscribe: { (_, _, eventHandler) -> SubscriptionItem in
155155
let item = SubscriptionItem(requestString: "", variables: nil, eventHandler: { _, _ in

AmplifyPlugins/API/Tests/AWSAPIPluginTests/Operation/GraphQLSubscribeCombineTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ class GraphQLSubscribeCombineTests: OperationTestBase {
223223
return item
224224
}
225225

226-
let onGetOrCreateConnection: MockSubscriptionConnectionFactory.OnGetOrCreateConnection = { _, _, _, _ in
226+
let onGetOrCreateConnection: MockSubscriptionConnectionFactory.OnGetOrCreateConnection = { _, _, _, _, _ in
227227
MockSubscriptionConnection(onSubscribe: onSubscribe, onUnsubscribe: { _ in })
228228
}
229229

AmplifyPlugins/API/Tests/AWSAPIPluginTests/Operation/GraphQLSubscribeTaskTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ class GraphQLSubscribeTasksTests: OperationTestBase {
279279
return item
280280
}
281281

282-
let onGetOrCreateConnection: MockSubscriptionConnectionFactory.OnGetOrCreateConnection = { _, _, _, _ in
282+
let onGetOrCreateConnection: MockSubscriptionConnectionFactory.OnGetOrCreateConnection = { _, _, _, _, _ in
283283
MockSubscriptionConnection(onSubscribe: onSubscribe, onUnsubscribe: { _ in })
284284
}
285285

AmplifyPlugins/API/Tests/AWSAPIPluginTests/Operation/GraphQLSubscribeTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ class GraphQLSubscribeTests: OperationTestBase {
238238
return item
239239
}
240240

241-
let onGetOrCreateConnection: MockSubscriptionConnectionFactory.OnGetOrCreateConnection = { _, _, _, _ in
241+
let onGetOrCreateConnection: MockSubscriptionConnectionFactory.OnGetOrCreateConnection = { _, _, _, _, _ in
242242
MockSubscriptionConnection(onSubscribe: onSubscribe, onUnsubscribe: { _ in })
243243
}
244244

Package.resolved

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)