From bb72aad22e9c0c0409a2df88fb56422e5289c9e5 Mon Sep 17 00:00:00 2001 From: yulin-liang Date: Tue, 9 Feb 2021 13:58:29 -0800 Subject: [PATCH] Support to add a suffix on user agents for grpc-objc. --- src/objective-c/GRPCClient/GRPCCallOptions.h | 12 ++++++++++++ src/objective-c/GRPCClient/GRPCCallOptions.m | 18 ++++++++++++++++++ .../GRPCClient/private/GRPCCore/GRPCChannel.m | 19 +++++++++++++------ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/objective-c/GRPCClient/GRPCCallOptions.h b/src/objective-c/GRPCClient/GRPCCallOptions.h index 4121aaf532b..389febab4ae 100644 --- a/src/objective-c/GRPCClient/GRPCCallOptions.h +++ b/src/objective-c/GRPCClient/GRPCCallOptions.h @@ -91,6 +91,12 @@ NS_ASSUME_NONNULL_BEGIN */ @property(copy, readonly, nullable) NSString *userAgentPrefix; +/** + * Custom string that is suffixed to a request's user-agent header field after gRPC's internal + * user-agent string. + */ +@property(copy, readonly, nullable) NSString *userAgentSuffix; + /** * The size limit for the response received from server. If it is exceeded, an error with status * code GRPCErrorCodeResourceExhausted is returned. @@ -270,6 +276,12 @@ NS_ASSUME_NONNULL_BEGIN */ @property(copy, readwrite, nullable) NSString *userAgentPrefix; +/** + * Custom string that is suffixed to a request's user-agent header field after gRPC's internal + * user-agent string. + */ +@property(copy, readwrite, nullable) NSString *userAgentSuffix; + /** * The size limit for the response received from server. If it is exceeded, an error with status * code GRPCErrorCodeResourceExhausted is returned. diff --git a/src/objective-c/GRPCClient/GRPCCallOptions.m b/src/objective-c/GRPCClient/GRPCCallOptions.m index 4945c03b59c..cb916330040 100644 --- a/src/objective-c/GRPCClient/GRPCCallOptions.m +++ b/src/objective-c/GRPCClient/GRPCCallOptions.m @@ -27,6 +27,7 @@ static const BOOL kDefaultFlowControlEnabled = NO; static NSArray> *const kDefaultInterceptorFactories = nil; static NSDictionary *const kDefaultInitialMetadata = nil; static NSString *const kDefaultUserAgentPrefix = nil; +static NSString *const kDefaultUserAgentSuffix = nil; static const NSUInteger kDefaultResponseSizeLimit = 0; static const GRPCCompressionAlgorithm kDefaultCompressionAlgorithm = GRPCCompressNone; static const BOOL kDefaultRetryEnabled = YES; @@ -69,6 +70,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { id _authTokenProvider; NSDictionary *_initialMetadata; NSString *_userAgentPrefix; + NSString *_userAgentSuffix; NSUInteger _responseSizeLimit; GRPCCompressionAlgorithm _compressionAlgorithm; BOOL _retryEnabled; @@ -97,6 +99,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { @synthesize authTokenProvider = _authTokenProvider; @synthesize initialMetadata = _initialMetadata; @synthesize userAgentPrefix = _userAgentPrefix; +@synthesize userAgentSuffix = _userAgentSuffix; @synthesize responseSizeLimit = _responseSizeLimit; @synthesize compressionAlgorithm = _compressionAlgorithm; @synthesize retryEnabled = _retryEnabled; @@ -125,6 +128,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { authTokenProvider:kDefaultAuthTokenProvider initialMetadata:kDefaultInitialMetadata userAgentPrefix:kDefaultUserAgentPrefix + userAgentSuffix:kDefaultUserAgentSuffix responseSizeLimit:kDefaultResponseSizeLimit compressionAlgorithm:kDefaultCompressionAlgorithm retryEnabled:kDefaultRetryEnabled @@ -153,6 +157,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { authTokenProvider:(id)authTokenProvider initialMetadata:(NSDictionary *)initialMetadata userAgentPrefix:(NSString *)userAgentPrefix + userAgentSuffix:(NSString *)userAgentSuffix responseSizeLimit:(NSUInteger)responseSizeLimit compressionAlgorithm:(GRPCCompressionAlgorithm)compressionAlgorithm retryEnabled:(BOOL)retryEnabled @@ -183,6 +188,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { : [[NSDictionary alloc] initWithDictionary:initialMetadata copyItems:YES]; _userAgentPrefix = [userAgentPrefix copy]; + _userAgentSuffix = [userAgentSuffix copy]; _responseSizeLimit = responseSizeLimit; _compressionAlgorithm = compressionAlgorithm; _retryEnabled = retryEnabled; @@ -218,6 +224,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { authTokenProvider:_authTokenProvider initialMetadata:_initialMetadata userAgentPrefix:_userAgentPrefix + userAgentSuffix:_userAgentSuffix responseSizeLimit:_responseSizeLimit compressionAlgorithm:_compressionAlgorithm retryEnabled:_retryEnabled @@ -250,6 +257,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { initialMetadata:[[NSDictionary alloc] initWithDictionary:_initialMetadata copyItems:YES] userAgentPrefix:[_userAgentPrefix copy] + userAgentSuffix:[_userAgentSuffix copy] responseSizeLimit:_responseSizeLimit compressionAlgorithm:_compressionAlgorithm retryEnabled:_retryEnabled @@ -275,6 +283,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { - (BOOL)hasChannelOptionsEqualTo:(GRPCCallOptions *)callOptions { if (callOptions == nil) return NO; if (!areObjectsEqual(callOptions.userAgentPrefix, _userAgentPrefix)) return NO; + if (!areObjectsEqual(callOptions.userAgentSuffix, _userAgentSuffix)) return NO; if (!(callOptions.responseSizeLimit == _responseSizeLimit)) return NO; if (!(callOptions.compressionAlgorithm == _compressionAlgorithm)) return NO; if (!(callOptions.retryEnabled == _retryEnabled)) return NO; @@ -300,6 +309,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { - (NSUInteger)channelOptionsHash { NSUInteger result = 0; result ^= _userAgentPrefix.hash; + result ^= _userAgentSuffix.hash; result ^= _responseSizeLimit; result ^= _compressionAlgorithm; result ^= _retryEnabled; @@ -334,6 +344,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { @dynamic authTokenProvider; @dynamic initialMetadata; @dynamic userAgentPrefix; +@dynamic userAgentSuffix; @dynamic responseSizeLimit; @dynamic compressionAlgorithm; @dynamic retryEnabled; @@ -362,6 +373,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { authTokenProvider:kDefaultAuthTokenProvider initialMetadata:kDefaultInitialMetadata userAgentPrefix:kDefaultUserAgentPrefix + userAgentSuffix:kDefaultUserAgentSuffix responseSizeLimit:kDefaultResponseSizeLimit compressionAlgorithm:kDefaultCompressionAlgorithm retryEnabled:kDefaultRetryEnabled @@ -392,6 +404,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { authTokenProvider:_authTokenProvider initialMetadata:_initialMetadata userAgentPrefix:_userAgentPrefix + userAgentSuffix:_userAgentSuffix responseSizeLimit:_responseSizeLimit compressionAlgorithm:_compressionAlgorithm retryEnabled:_retryEnabled @@ -423,6 +436,7 @@ static BOOL areObjectsEqual(id obj1, id obj2) { authTokenProvider:_authTokenProvider initialMetadata:_initialMetadata userAgentPrefix:_userAgentPrefix + userAgentSuffix:_userAgentSuffix responseSizeLimit:_responseSizeLimit compressionAlgorithm:_compressionAlgorithm retryEnabled:_retryEnabled @@ -480,6 +494,10 @@ static BOOL areObjectsEqual(id obj1, id obj2) { _userAgentPrefix = [userAgentPrefix copy]; } +- (void)setUserAgentSuffix:(NSString *)userAgentSuffix { + _userAgentSuffix = [userAgentSuffix copy]; +} + - (void)setResponseSizeLimit:(NSUInteger)responseSizeLimit { _responseSizeLimit = responseSizeLimit; } diff --git a/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m b/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m index 5483aac07f1..b6043d3d51c 100644 --- a/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m +++ b/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m @@ -100,16 +100,23 @@ - (NSDictionary *)channelArgs { NSMutableDictionary *args = [NSMutableDictionary new]; - NSString *userAgent = [NSString - stringWithFormat:@"grpc-objc-%@/%@", [self getTransportTypeString], GRPC_OBJC_VERSION_STRING]; + NSMutableString *userAgent = [[NSMutableString alloc] init]; NSString *userAgentPrefix = _callOptions.userAgentPrefix; if (userAgentPrefix.length != 0) { - args[@GRPC_ARG_PRIMARY_USER_AGENT_STRING] = - [_callOptions.userAgentPrefix stringByAppendingFormat:@" %@", userAgent]; - } else { - args[@GRPC_ARG_PRIMARY_USER_AGENT_STRING] = userAgent; + [userAgent appendFormat:@"%@ ", userAgentPrefix]; } + NSString *gRPCUserAgent = [NSString + stringWithFormat:@"grpc-objc-%@/%@", [self getTransportTypeString], GRPC_OBJC_VERSION_STRING]; + [userAgent appendString:gRPCUserAgent]; + + NSString *userAgentSuffix = _callOptions.userAgentSuffix; + if (userAgentSuffix.length != 0) { + [userAgent appendFormat:@" %@", userAgentSuffix]; + } + + args[@GRPC_ARG_PRIMARY_USER_AGENT_STRING] = [userAgent copy]; + NSString *hostNameOverride = _callOptions.hostNameOverride; if (hostNameOverride) { args[@GRPC_SSL_TARGET_NAME_OVERRIDE_ARG] = hostNameOverride;