diff --git a/src/objective-c/GRPCClient/GRPCCall.h b/src/objective-c/GRPCClient/GRPCCall.h index 5e9324c445627b2f36658cf3980d8e5590ae9e82..9a5a2a44d2bd32bf71b1e561f75b9109c5533c32 100644 --- a/src/objective-c/GRPCClient/GRPCCall.h +++ b/src/objective-c/GRPCClient/GRPCCall.h @@ -178,6 +178,12 @@ extern id const kGRPCTrailersKey; /** Represents a single gRPC remote call. */ @interface GRPCCall : GRXWriter +/** + * The authority for the RPC. If nil, the default authority will be used. This property must be nil + * when Cronet transport is enabled. + */ +@property (atomic, readwrite) NSString *serverName; + /** * The container of the request headers of an RPC conforms to this protocol, which is a subset of * NSMutableDictionary's interface. It will become a NSMutableDictionary later on. diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m index f9d13fea578b7a5124e0ec27d280b9bfc088c182..cb505bd82df0ef918dba36517b6f8f3c1c0751b8 100644 --- a/src/objective-c/GRPCClient/GRPCCall.m +++ b/src/objective-c/GRPCClient/GRPCCall.m @@ -440,7 +440,7 @@ static NSMutableDictionary *callFlags; _responseWriteable = [[GRXConcurrentWriteable alloc] initWithWriteable:writeable dispatchQueue:_responseQueue]; - _wrappedCall = [[GRPCWrappedCall alloc] initWithHost:_host path:_path]; + _wrappedCall = [[GRPCWrappedCall alloc] initWithHost:_host serverName:_serverName path:_path]; NSAssert(_wrappedCall, @"Error allocating RPC objects. Low memory?"); [self sendHeaders:_requestHeaders]; diff --git a/src/objective-c/GRPCClient/private/GRPCChannel.h b/src/objective-c/GRPCClient/private/GRPCChannel.h index 5bada2dd50c55c48cd25b422ca8817c9521a32c5..a7db8664736ed6a76f9039e7078c66187d1f6acf 100644 --- a/src/objective-c/GRPCClient/private/GRPCChannel.h +++ b/src/objective-c/GRPCClient/private/GRPCChannel.h @@ -77,5 +77,6 @@ struct grpc_channel_credentials; channelArgs:(nullable NSDictionary *)channelArgs; - (nullable grpc_call *)unmanagedCallWithPath:(nonnull NSString *)path + serverName:(nonnull NSString *)serverName completionQueue:(nonnull GRPCCompletionQueue *)queue; @end diff --git a/src/objective-c/GRPCClient/private/GRPCChannel.m b/src/objective-c/GRPCClient/private/GRPCChannel.m index fcfaa4a134d5bd700a6dec4593d0664ab50ec423..d37c2b2a4e3e921968977e962558fe79136585f1 100644 --- a/src/objective-c/GRPCClient/private/GRPCChannel.m +++ b/src/objective-c/GRPCClient/private/GRPCChannel.m @@ -196,14 +196,22 @@ static grpc_channel_args *BuildChannelArgs(NSDictionary *dictionary) { } - (grpc_call *)unmanagedCallWithPath:(NSString *)path + serverName:(NSString *)serverName completionQueue:(GRPCCompletionQueue *)queue { + grpc_slice host_slice; + if (serverName) { + host_slice = grpc_slice_from_copied_string(serverName.UTF8String); + } grpc_slice path_slice = grpc_slice_from_copied_string(path.UTF8String); grpc_call *call = grpc_channel_create_call(_unmanagedChannel, NULL, GRPC_PROPAGATE_DEFAULTS, queue.unmanagedQueue, path_slice, - NULL, // Passing NULL for host + serverName ? &host_slice : NULL, gpr_inf_future(GPR_CLOCK_REALTIME), NULL); + if (serverName) { + grpc_slice_unref(host_slice); + } grpc_slice_unref(path_slice); return call; } diff --git a/src/objective-c/GRPCClient/private/GRPCHost.h b/src/objective-c/GRPCClient/private/GRPCHost.h index c8b5dd315b0b331fa5055a06d50e75c13e064a61..1f74d5551ff7bd95b710d7cae53d17721f28d084 100644 --- a/src/objective-c/GRPCClient/private/GRPCHost.h +++ b/src/objective-c/GRPCClient/private/GRPCHost.h @@ -69,6 +69,7 @@ struct grpc_channel_credentials; /** Create a grpc_call object to the provided path on this host. */ - (nullable struct grpc_call *)unmanagedCallWithPath:(NSString *)path + serverName:(NSString *)serverName completionQueue:(GRPCCompletionQueue *)queue; // TODO: There's a race when a new RPC is coming through just as an existing one is getting diff --git a/src/objective-c/GRPCClient/private/GRPCHost.m b/src/objective-c/GRPCClient/private/GRPCHost.m index 246af560cdbdfc04d55d8b458f640ae348645002..13a9af9af5b694766bdb241f2f9b74ca228f5196 100644 --- a/src/objective-c/GRPCClient/private/GRPCHost.m +++ b/src/objective-c/GRPCClient/private/GRPCHost.m @@ -135,6 +135,7 @@ static GRPCConnectivityMonitor *connectivityMonitor = nil; } - (nullable grpc_call *)unmanagedCallWithPath:(NSString *)path + serverName:(NSString *)serverName completionQueue:(GRPCCompletionQueue *)queue { GRPCChannel *channel; // This is racing -[GRPCHost disconnect]. @@ -144,7 +145,7 @@ static GRPCConnectivityMonitor *connectivityMonitor = nil; } channel = _channel; } - return [channel unmanagedCallWithPath:path completionQueue:queue]; + return [channel unmanagedCallWithPath:path serverName:serverName completionQueue:queue]; } - (BOOL)setTLSPEMRootCerts:(nullable NSString *)pemRootCerts diff --git a/src/objective-c/GRPCClient/private/GRPCWrappedCall.h b/src/objective-c/GRPCClient/private/GRPCWrappedCall.h index 52233c82420e8d91d75a87f308841f28dfb3a645..171d2ec61276a36c623ad5256c16690b009d6db8 100644 --- a/src/objective-c/GRPCClient/private/GRPCWrappedCall.h +++ b/src/objective-c/GRPCClient/private/GRPCWrappedCall.h @@ -90,6 +90,7 @@ @interface GRPCWrappedCall : NSObject - (instancetype)initWithHost:(NSString *)host + serverName:(NSString *)serverName path:(NSString *)path NS_DESIGNATED_INITIALIZER; - (void)startBatchWithOperations:(NSArray *)ops errorHandler:(void(^)())errorHandler; diff --git a/src/objective-c/GRPCClient/private/GRPCWrappedCall.m b/src/objective-c/GRPCClient/private/GRPCWrappedCall.m index 06570c5ea22db8ad233522863789b76e75334fd2..dcdc5c55b13cf7d41a2fc403ad446796f3d0f6a8 100644 --- a/src/objective-c/GRPCClient/private/GRPCWrappedCall.m +++ b/src/objective-c/GRPCClient/private/GRPCWrappedCall.m @@ -251,10 +251,11 @@ } - (instancetype)init { - return [self initWithHost:nil path:nil]; + return [self initWithHost:nil serverName:nil path:nil]; } - (instancetype)initWithHost:(NSString *)host + serverName:(NSString *)serverName path:(NSString *)path { if (!path || !host) { [NSException raise:NSInvalidArgumentException @@ -267,7 +268,7 @@ // queue. Currently we use a singleton queue. _queue = [GRPCCompletionQueue completionQueue]; - _call = [[GRPCHost hostWithAddress:host] unmanagedCallWithPath:path completionQueue:_queue]; + _call = [[GRPCHost hostWithAddress:host] unmanagedCallWithPath:path serverName:serverName completionQueue:_queue]; if (_call == NULL) { return nil; }