GRPCCallOptions.m 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. /*
  2. *
  3. * Copyright 2018 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #import "GRPCCallOptions.h"
  19. #import "GRPCTransport.h"
  20. #import "internal/GRPCCallOptions+Internal.h"
  21. // The default values for the call options.
  22. static NSString *const kDefaultServerAuthority = nil;
  23. static const NSTimeInterval kDefaultTimeout = 0;
  24. static const BOOL kDefaultFlowControlEnabled = NO;
  25. static NSArray<id<GRPCInterceptorFactory>> *const kDefaultInterceptorFactories = nil;
  26. static NSDictionary *const kDefaultInitialMetadata = nil;
  27. static NSString *const kDefaultUserAgentPrefix = nil;
  28. static const NSUInteger kDefaultResponseSizeLimit = 0;
  29. static const GRPCCompressionAlgorithm kDefaultCompressionAlgorithm = GRPCCompressNone;
  30. static const BOOL kDefaultRetryEnabled = YES;
  31. static const NSTimeInterval kDefaultKeepaliveInterval = 0;
  32. static const NSTimeInterval kDefaultKeepaliveTimeout = 0;
  33. static const NSTimeInterval kDefaultConnectMinTimeout = 0;
  34. static const NSTimeInterval kDefaultConnectInitialBackoff = 0;
  35. static const NSTimeInterval kDefaultConnectMaxBackoff = 0;
  36. static NSDictionary *const kDefaultAdditionalChannelArgs = nil;
  37. static NSString *const kDefaultPEMRootCertificates = nil;
  38. static NSString *const kDefaultPEMPrivateKey = nil;
  39. static NSString *const kDefaultPEMCertificateChain = nil;
  40. static NSString *const kDefaultOauth2AccessToken = nil;
  41. static const id<GRPCAuthorizationProtocol> kDefaultAuthTokenProvider = nil;
  42. static const GRPCTransportType kDefaultTransportType = GRPCTransportTypeChttp2BoringSSL;
  43. static const GRPCTransportID kDefaultTransport = NULL;
  44. static NSString *const kDefaultHostNameOverride = nil;
  45. static const id kDefaultLogContext = nil;
  46. static NSString *const kDefaultChannelPoolDomain = nil;
  47. static const NSUInteger kDefaultChannelID = 0;
  48. // Check if two objects are equal. Returns YES if both are nil;
  49. static BOOL areObjectsEqual(id obj1, id obj2) {
  50. if (obj1 == obj2) {
  51. return YES;
  52. }
  53. if (obj1 == nil || obj2 == nil) {
  54. return NO;
  55. }
  56. return [obj1 isEqual:obj2];
  57. }
  58. @implementation GRPCCallOptions {
  59. @protected
  60. NSString *_serverAuthority;
  61. NSTimeInterval _timeout;
  62. BOOL _flowControlEnabled;
  63. NSArray<id<GRPCInterceptorFactory>> *_interceptorFactories;
  64. NSString *_oauth2AccessToken;
  65. id<GRPCAuthorizationProtocol> _authTokenProvider;
  66. NSDictionary *_initialMetadata;
  67. NSString *_userAgentPrefix;
  68. NSUInteger _responseSizeLimit;
  69. GRPCCompressionAlgorithm _compressionAlgorithm;
  70. BOOL _retryEnabled;
  71. NSTimeInterval _keepaliveInterval;
  72. NSTimeInterval _keepaliveTimeout;
  73. NSTimeInterval _connectMinTimeout;
  74. NSTimeInterval _connectInitialBackoff;
  75. NSTimeInterval _connectMaxBackoff;
  76. NSDictionary *_additionalChannelArgs;
  77. NSString *_PEMRootCertificates;
  78. NSString *_PEMPrivateKey;
  79. NSString *_PEMCertificateChain;
  80. GRPCTransportType _transportType;
  81. GRPCTransportID _transport;
  82. NSString *_hostNameOverride;
  83. id<NSObject> _logContext;
  84. NSString *_channelPoolDomain;
  85. NSUInteger _channelID;
  86. }
  87. @synthesize serverAuthority = _serverAuthority;
  88. @synthesize timeout = _timeout;
  89. @synthesize flowControlEnabled = _flowControlEnabled;
  90. @synthesize interceptorFactories = _interceptorFactories;
  91. @synthesize oauth2AccessToken = _oauth2AccessToken;
  92. @synthesize authTokenProvider = _authTokenProvider;
  93. @synthesize initialMetadata = _initialMetadata;
  94. @synthesize userAgentPrefix = _userAgentPrefix;
  95. @synthesize responseSizeLimit = _responseSizeLimit;
  96. @synthesize compressionAlgorithm = _compressionAlgorithm;
  97. @synthesize retryEnabled = _retryEnabled;
  98. @synthesize keepaliveInterval = _keepaliveInterval;
  99. @synthesize keepaliveTimeout = _keepaliveTimeout;
  100. @synthesize connectMinTimeout = _connectMinTimeout;
  101. @synthesize connectInitialBackoff = _connectInitialBackoff;
  102. @synthesize connectMaxBackoff = _connectMaxBackoff;
  103. @synthesize additionalChannelArgs = _additionalChannelArgs;
  104. @synthesize PEMRootCertificates = _PEMRootCertificates;
  105. @synthesize PEMPrivateKey = _PEMPrivateKey;
  106. @synthesize PEMCertificateChain = _PEMCertificateChain;
  107. @synthesize transportType = _transportType;
  108. @synthesize transport = _transport;
  109. @synthesize hostNameOverride = _hostNameOverride;
  110. @synthesize logContext = _logContext;
  111. @synthesize channelPoolDomain = _channelPoolDomain;
  112. @synthesize channelID = _channelID;
  113. - (instancetype)init {
  114. return [self initWithServerAuthority:kDefaultServerAuthority
  115. timeout:kDefaultTimeout
  116. flowControlEnabled:kDefaultFlowControlEnabled
  117. interceptorFactories:kDefaultInterceptorFactories
  118. oauth2AccessToken:kDefaultOauth2AccessToken
  119. authTokenProvider:kDefaultAuthTokenProvider
  120. initialMetadata:kDefaultInitialMetadata
  121. userAgentPrefix:kDefaultUserAgentPrefix
  122. responseSizeLimit:kDefaultResponseSizeLimit
  123. compressionAlgorithm:kDefaultCompressionAlgorithm
  124. retryEnabled:kDefaultRetryEnabled
  125. keepaliveInterval:kDefaultKeepaliveInterval
  126. keepaliveTimeout:kDefaultKeepaliveTimeout
  127. connectMinTimeout:kDefaultConnectMinTimeout
  128. connectInitialBackoff:kDefaultConnectInitialBackoff
  129. connectMaxBackoff:kDefaultConnectMaxBackoff
  130. additionalChannelArgs:kDefaultAdditionalChannelArgs
  131. PEMRootCertificates:kDefaultPEMRootCertificates
  132. PEMPrivateKey:kDefaultPEMPrivateKey
  133. PEMCertificateChain:kDefaultPEMCertificateChain
  134. transportType:kDefaultTransportType
  135. transport:kDefaultTransport
  136. hostNameOverride:kDefaultHostNameOverride
  137. logContext:kDefaultLogContext
  138. channelPoolDomain:kDefaultChannelPoolDomain
  139. channelID:kDefaultChannelID];
  140. }
  141. - (instancetype)initWithServerAuthority:(NSString *)serverAuthority
  142. timeout:(NSTimeInterval)timeout
  143. flowControlEnabled:(BOOL)flowControlEnabled
  144. interceptorFactories:(NSArray<id<GRPCInterceptorFactory>> *)interceptorFactories
  145. oauth2AccessToken:(NSString *)oauth2AccessToken
  146. authTokenProvider:(id<GRPCAuthorizationProtocol>)authTokenProvider
  147. initialMetadata:(NSDictionary *)initialMetadata
  148. userAgentPrefix:(NSString *)userAgentPrefix
  149. responseSizeLimit:(NSUInteger)responseSizeLimit
  150. compressionAlgorithm:(GRPCCompressionAlgorithm)compressionAlgorithm
  151. retryEnabled:(BOOL)retryEnabled
  152. keepaliveInterval:(NSTimeInterval)keepaliveInterval
  153. keepaliveTimeout:(NSTimeInterval)keepaliveTimeout
  154. connectMinTimeout:(NSTimeInterval)connectMinTimeout
  155. connectInitialBackoff:(NSTimeInterval)connectInitialBackoff
  156. connectMaxBackoff:(NSTimeInterval)connectMaxBackoff
  157. additionalChannelArgs:(NSDictionary *)additionalChannelArgs
  158. PEMRootCertificates:(NSString *)PEMRootCertificates
  159. PEMPrivateKey:(NSString *)PEMPrivateKey
  160. PEMCertificateChain:(NSString *)PEMCertificateChain
  161. transportType:(GRPCTransportType)transportType
  162. transport:(GRPCTransportID)transport
  163. hostNameOverride:(NSString *)hostNameOverride
  164. logContext:(id)logContext
  165. channelPoolDomain:(NSString *)channelPoolDomain
  166. channelID:(NSUInteger)channelID {
  167. if ((self = [super init])) {
  168. _serverAuthority = [serverAuthority copy];
  169. _timeout = timeout < 0 ? 0 : timeout;
  170. _flowControlEnabled = flowControlEnabled;
  171. _interceptorFactories = interceptorFactories;
  172. _oauth2AccessToken = [oauth2AccessToken copy];
  173. _authTokenProvider = authTokenProvider;
  174. _initialMetadata =
  175. initialMetadata == nil
  176. ? nil
  177. : [[NSDictionary alloc] initWithDictionary:initialMetadata copyItems:YES];
  178. _userAgentPrefix = [userAgentPrefix copy];
  179. _responseSizeLimit = responseSizeLimit;
  180. _compressionAlgorithm = compressionAlgorithm;
  181. _retryEnabled = retryEnabled;
  182. _keepaliveInterval = keepaliveInterval < 0 ? 0 : keepaliveInterval;
  183. _keepaliveTimeout = keepaliveTimeout < 0 ? 0 : keepaliveTimeout;
  184. _connectMinTimeout = connectMinTimeout < 0 ? 0 : connectMinTimeout;
  185. _connectInitialBackoff = connectInitialBackoff < 0 ? 0 : connectInitialBackoff;
  186. _connectMaxBackoff = connectMaxBackoff < 0 ? 0 : connectMaxBackoff;
  187. _additionalChannelArgs =
  188. additionalChannelArgs == nil
  189. ? nil
  190. : [[NSDictionary alloc] initWithDictionary:additionalChannelArgs copyItems:YES];
  191. _PEMRootCertificates = [PEMRootCertificates copy];
  192. _PEMPrivateKey = [PEMPrivateKey copy];
  193. _PEMCertificateChain = [PEMCertificateChain copy];
  194. _transportType = transportType;
  195. _transport = transport;
  196. _hostNameOverride = [hostNameOverride copy];
  197. _logContext = logContext;
  198. _channelPoolDomain = [channelPoolDomain copy];
  199. _channelID = channelID;
  200. }
  201. return self;
  202. }
  203. - (nonnull id)copyWithZone:(NSZone *)zone {
  204. GRPCCallOptions *newOptions =
  205. [[GRPCCallOptions allocWithZone:zone] initWithServerAuthority:_serverAuthority
  206. timeout:_timeout
  207. flowControlEnabled:_flowControlEnabled
  208. interceptorFactories:_interceptorFactories
  209. oauth2AccessToken:_oauth2AccessToken
  210. authTokenProvider:_authTokenProvider
  211. initialMetadata:_initialMetadata
  212. userAgentPrefix:_userAgentPrefix
  213. responseSizeLimit:_responseSizeLimit
  214. compressionAlgorithm:_compressionAlgorithm
  215. retryEnabled:_retryEnabled
  216. keepaliveInterval:_keepaliveInterval
  217. keepaliveTimeout:_keepaliveTimeout
  218. connectMinTimeout:_connectMinTimeout
  219. connectInitialBackoff:_connectInitialBackoff
  220. connectMaxBackoff:_connectMaxBackoff
  221. additionalChannelArgs:_additionalChannelArgs
  222. PEMRootCertificates:_PEMRootCertificates
  223. PEMPrivateKey:_PEMPrivateKey
  224. PEMCertificateChain:_PEMCertificateChain
  225. transportType:_transportType
  226. transport:_transport
  227. hostNameOverride:_hostNameOverride
  228. logContext:_logContext
  229. channelPoolDomain:_channelPoolDomain
  230. channelID:_channelID];
  231. return newOptions;
  232. }
  233. - (nonnull id)mutableCopyWithZone:(NSZone *)zone {
  234. GRPCMutableCallOptions *newOptions = [[GRPCMutableCallOptions allocWithZone:zone]
  235. initWithServerAuthority:[_serverAuthority copy]
  236. timeout:_timeout
  237. flowControlEnabled:_flowControlEnabled
  238. interceptorFactories:_interceptorFactories
  239. oauth2AccessToken:[_oauth2AccessToken copy]
  240. authTokenProvider:_authTokenProvider
  241. initialMetadata:[[NSDictionary alloc] initWithDictionary:_initialMetadata
  242. copyItems:YES]
  243. userAgentPrefix:[_userAgentPrefix copy]
  244. responseSizeLimit:_responseSizeLimit
  245. compressionAlgorithm:_compressionAlgorithm
  246. retryEnabled:_retryEnabled
  247. keepaliveInterval:_keepaliveInterval
  248. keepaliveTimeout:_keepaliveTimeout
  249. connectMinTimeout:_connectMinTimeout
  250. connectInitialBackoff:_connectInitialBackoff
  251. connectMaxBackoff:_connectMaxBackoff
  252. additionalChannelArgs:[[NSDictionary alloc] initWithDictionary:_additionalChannelArgs
  253. copyItems:YES]
  254. PEMRootCertificates:[_PEMRootCertificates copy]
  255. PEMPrivateKey:[_PEMPrivateKey copy]
  256. PEMCertificateChain:[_PEMCertificateChain copy]
  257. transportType:_transportType
  258. transport:_transport
  259. hostNameOverride:[_hostNameOverride copy]
  260. logContext:_logContext
  261. channelPoolDomain:[_channelPoolDomain copy]
  262. channelID:_channelID];
  263. return newOptions;
  264. }
  265. - (BOOL)hasChannelOptionsEqualTo:(GRPCCallOptions *)callOptions {
  266. if (callOptions == nil) return NO;
  267. if (!areObjectsEqual(callOptions.userAgentPrefix, _userAgentPrefix)) return NO;
  268. if (!(callOptions.responseSizeLimit == _responseSizeLimit)) return NO;
  269. if (!(callOptions.compressionAlgorithm == _compressionAlgorithm)) return NO;
  270. if (!(callOptions.retryEnabled == _retryEnabled)) return NO;
  271. if (!(callOptions.keepaliveInterval == _keepaliveInterval)) return NO;
  272. if (!(callOptions.keepaliveTimeout == _keepaliveTimeout)) return NO;
  273. if (!(callOptions.connectMinTimeout == _connectMinTimeout)) return NO;
  274. if (!(callOptions.connectInitialBackoff == _connectInitialBackoff)) return NO;
  275. if (!(callOptions.connectMaxBackoff == _connectMaxBackoff)) return NO;
  276. if (!areObjectsEqual(callOptions.additionalChannelArgs, _additionalChannelArgs)) return NO;
  277. if (!areObjectsEqual(callOptions.PEMRootCertificates, _PEMRootCertificates)) return NO;
  278. if (!areObjectsEqual(callOptions.PEMPrivateKey, _PEMPrivateKey)) return NO;
  279. if (!areObjectsEqual(callOptions.PEMCertificateChain, _PEMCertificateChain)) return NO;
  280. if (!areObjectsEqual(callOptions.hostNameOverride, _hostNameOverride)) return NO;
  281. if (!(callOptions.transportType == _transportType)) return NO;
  282. if (!(TransportIDIsEqual(callOptions.transport, _transport))) return NO;
  283. if (!areObjectsEqual(callOptions.logContext, _logContext)) return NO;
  284. if (!areObjectsEqual(callOptions.channelPoolDomain, _channelPoolDomain)) return NO;
  285. if (!(callOptions.channelID == _channelID)) return NO;
  286. return YES;
  287. }
  288. - (NSUInteger)channelOptionsHash {
  289. NSUInteger result = 0;
  290. result ^= _userAgentPrefix.hash;
  291. result ^= _responseSizeLimit;
  292. result ^= _compressionAlgorithm;
  293. result ^= _retryEnabled;
  294. result ^= (unsigned int)(_keepaliveInterval * 1000);
  295. result ^= (unsigned int)(_keepaliveTimeout * 1000);
  296. result ^= (unsigned int)(_connectMinTimeout * 1000);
  297. result ^= (unsigned int)(_connectInitialBackoff * 1000);
  298. result ^= (unsigned int)(_connectMaxBackoff * 1000);
  299. result ^= _additionalChannelArgs.hash;
  300. result ^= _PEMRootCertificates.hash;
  301. result ^= _PEMPrivateKey.hash;
  302. result ^= _PEMCertificateChain.hash;
  303. result ^= _hostNameOverride.hash;
  304. result ^= _transportType;
  305. result ^= TransportIDHash(_transport);
  306. result ^= _logContext.hash;
  307. result ^= _channelPoolDomain.hash;
  308. result ^= _channelID;
  309. return result;
  310. }
  311. @end
  312. @implementation GRPCMutableCallOptions
  313. @dynamic serverAuthority;
  314. @dynamic timeout;
  315. @dynamic flowControlEnabled;
  316. @dynamic interceptorFactories;
  317. @dynamic oauth2AccessToken;
  318. @dynamic authTokenProvider;
  319. @dynamic initialMetadata;
  320. @dynamic userAgentPrefix;
  321. @dynamic responseSizeLimit;
  322. @dynamic compressionAlgorithm;
  323. @dynamic retryEnabled;
  324. @dynamic keepaliveInterval;
  325. @dynamic keepaliveTimeout;
  326. @dynamic connectMinTimeout;
  327. @dynamic connectInitialBackoff;
  328. @dynamic connectMaxBackoff;
  329. @dynamic additionalChannelArgs;
  330. @dynamic PEMRootCertificates;
  331. @dynamic PEMPrivateKey;
  332. @dynamic PEMCertificateChain;
  333. @dynamic transportType;
  334. @dynamic transport;
  335. @dynamic hostNameOverride;
  336. @dynamic logContext;
  337. @dynamic channelPoolDomain;
  338. @dynamic channelID;
  339. - (instancetype)init {
  340. return [self initWithServerAuthority:kDefaultServerAuthority
  341. timeout:kDefaultTimeout
  342. flowControlEnabled:kDefaultFlowControlEnabled
  343. interceptorFactories:kDefaultInterceptorFactories
  344. oauth2AccessToken:kDefaultOauth2AccessToken
  345. authTokenProvider:kDefaultAuthTokenProvider
  346. initialMetadata:kDefaultInitialMetadata
  347. userAgentPrefix:kDefaultUserAgentPrefix
  348. responseSizeLimit:kDefaultResponseSizeLimit
  349. compressionAlgorithm:kDefaultCompressionAlgorithm
  350. retryEnabled:kDefaultRetryEnabled
  351. keepaliveInterval:kDefaultKeepaliveInterval
  352. keepaliveTimeout:kDefaultKeepaliveTimeout
  353. connectMinTimeout:kDefaultConnectMinTimeout
  354. connectInitialBackoff:kDefaultConnectInitialBackoff
  355. connectMaxBackoff:kDefaultConnectMaxBackoff
  356. additionalChannelArgs:kDefaultAdditionalChannelArgs
  357. PEMRootCertificates:kDefaultPEMRootCertificates
  358. PEMPrivateKey:kDefaultPEMPrivateKey
  359. PEMCertificateChain:kDefaultPEMCertificateChain
  360. transportType:kDefaultTransportType
  361. transport:kDefaultTransport
  362. hostNameOverride:kDefaultHostNameOverride
  363. logContext:kDefaultLogContext
  364. channelPoolDomain:kDefaultChannelPoolDomain
  365. channelID:kDefaultChannelID];
  366. }
  367. - (nonnull id)copyWithZone:(NSZone *)zone {
  368. GRPCCallOptions *newOptions =
  369. [[GRPCCallOptions allocWithZone:zone] initWithServerAuthority:_serverAuthority
  370. timeout:_timeout
  371. flowControlEnabled:_flowControlEnabled
  372. interceptorFactories:_interceptorFactories
  373. oauth2AccessToken:_oauth2AccessToken
  374. authTokenProvider:_authTokenProvider
  375. initialMetadata:_initialMetadata
  376. userAgentPrefix:_userAgentPrefix
  377. responseSizeLimit:_responseSizeLimit
  378. compressionAlgorithm:_compressionAlgorithm
  379. retryEnabled:_retryEnabled
  380. keepaliveInterval:_keepaliveInterval
  381. keepaliveTimeout:_keepaliveTimeout
  382. connectMinTimeout:_connectMinTimeout
  383. connectInitialBackoff:_connectInitialBackoff
  384. connectMaxBackoff:_connectMaxBackoff
  385. additionalChannelArgs:_additionalChannelArgs
  386. PEMRootCertificates:_PEMRootCertificates
  387. PEMPrivateKey:_PEMPrivateKey
  388. PEMCertificateChain:_PEMCertificateChain
  389. transportType:_transportType
  390. transport:_transport
  391. hostNameOverride:_hostNameOverride
  392. logContext:_logContext
  393. channelPoolDomain:_channelPoolDomain
  394. channelID:_channelID];
  395. return newOptions;
  396. }
  397. - (nonnull id)mutableCopyWithZone:(NSZone *)zone {
  398. GRPCMutableCallOptions *newOptions = [[GRPCMutableCallOptions allocWithZone:zone]
  399. initWithServerAuthority:_serverAuthority
  400. timeout:_timeout
  401. flowControlEnabled:_flowControlEnabled
  402. interceptorFactories:_interceptorFactories
  403. oauth2AccessToken:_oauth2AccessToken
  404. authTokenProvider:_authTokenProvider
  405. initialMetadata:_initialMetadata
  406. userAgentPrefix:_userAgentPrefix
  407. responseSizeLimit:_responseSizeLimit
  408. compressionAlgorithm:_compressionAlgorithm
  409. retryEnabled:_retryEnabled
  410. keepaliveInterval:_keepaliveInterval
  411. keepaliveTimeout:_keepaliveTimeout
  412. connectMinTimeout:_connectMinTimeout
  413. connectInitialBackoff:_connectInitialBackoff
  414. connectMaxBackoff:_connectMaxBackoff
  415. additionalChannelArgs:[_additionalChannelArgs copy]
  416. PEMRootCertificates:_PEMRootCertificates
  417. PEMPrivateKey:_PEMPrivateKey
  418. PEMCertificateChain:_PEMCertificateChain
  419. transportType:_transportType
  420. transport:_transport
  421. hostNameOverride:_hostNameOverride
  422. logContext:_logContext
  423. channelPoolDomain:_channelPoolDomain
  424. channelID:_channelID];
  425. return newOptions;
  426. }
  427. - (void)setServerAuthority:(NSString *)serverAuthority {
  428. _serverAuthority = [serverAuthority copy];
  429. }
  430. - (void)setTimeout:(NSTimeInterval)timeout {
  431. if (timeout < 0) {
  432. _timeout = 0;
  433. } else {
  434. _timeout = timeout;
  435. }
  436. }
  437. - (void)setFlowControlEnabled:(BOOL)flowControlEnabled {
  438. _flowControlEnabled = flowControlEnabled;
  439. }
  440. - (void)setInterceptorFactories:(NSArray<id<GRPCInterceptorFactory>> *)interceptorFactories {
  441. _interceptorFactories = interceptorFactories;
  442. }
  443. - (void)setOauth2AccessToken:(NSString *)oauth2AccessToken {
  444. _oauth2AccessToken = [oauth2AccessToken copy];
  445. }
  446. - (void)setAuthTokenProvider:(id<GRPCAuthorizationProtocol>)authTokenProvider {
  447. _authTokenProvider = authTokenProvider;
  448. }
  449. - (void)setInitialMetadata:(NSDictionary *)initialMetadata {
  450. _initialMetadata = [[NSDictionary alloc] initWithDictionary:initialMetadata copyItems:YES];
  451. }
  452. - (void)setUserAgentPrefix:(NSString *)userAgentPrefix {
  453. _userAgentPrefix = [userAgentPrefix copy];
  454. }
  455. - (void)setResponseSizeLimit:(NSUInteger)responseSizeLimit {
  456. _responseSizeLimit = responseSizeLimit;
  457. }
  458. - (void)setCompressionAlgorithm:(GRPCCompressionAlgorithm)compressionAlgorithm {
  459. _compressionAlgorithm = compressionAlgorithm;
  460. }
  461. - (void)setRetryEnabled:(BOOL)retryEnabled {
  462. _retryEnabled = retryEnabled;
  463. }
  464. - (void)setKeepaliveInterval:(NSTimeInterval)keepaliveInterval {
  465. if (keepaliveInterval < 0) {
  466. _keepaliveInterval = 0;
  467. } else {
  468. _keepaliveInterval = keepaliveInterval;
  469. }
  470. }
  471. - (void)setKeepaliveTimeout:(NSTimeInterval)keepaliveTimeout {
  472. if (keepaliveTimeout < 0) {
  473. _keepaliveTimeout = 0;
  474. } else {
  475. _keepaliveTimeout = keepaliveTimeout;
  476. }
  477. }
  478. - (void)setConnectMinTimeout:(NSTimeInterval)connectMinTimeout {
  479. if (connectMinTimeout < 0) {
  480. _connectMinTimeout = 0;
  481. } else {
  482. _connectMinTimeout = connectMinTimeout;
  483. }
  484. }
  485. - (void)setConnectInitialBackoff:(NSTimeInterval)connectInitialBackoff {
  486. if (connectInitialBackoff < 0) {
  487. _connectInitialBackoff = 0;
  488. } else {
  489. _connectInitialBackoff = connectInitialBackoff;
  490. }
  491. }
  492. - (void)setConnectMaxBackoff:(NSTimeInterval)connectMaxBackoff {
  493. if (connectMaxBackoff < 0) {
  494. _connectMaxBackoff = 0;
  495. } else {
  496. _connectMaxBackoff = connectMaxBackoff;
  497. }
  498. }
  499. - (void)setAdditionalChannelArgs:(NSDictionary *)additionalChannelArgs {
  500. _additionalChannelArgs =
  501. [[NSDictionary alloc] initWithDictionary:additionalChannelArgs copyItems:YES];
  502. }
  503. - (void)setPEMRootCertificates:(NSString *)PEMRootCertificates {
  504. _PEMRootCertificates = [PEMRootCertificates copy];
  505. }
  506. - (void)setPEMPrivateKey:(NSString *)PEMPrivateKey {
  507. _PEMPrivateKey = [PEMPrivateKey copy];
  508. }
  509. - (void)setPEMCertificateChain:(NSString *)PEMCertificateChain {
  510. _PEMCertificateChain = [PEMCertificateChain copy];
  511. }
  512. - (void)setTransportType:(GRPCTransportType)transportType {
  513. _transportType = transportType;
  514. }
  515. - (void)setTransport:(GRPCTransportID)transport {
  516. _transport = transport;
  517. }
  518. - (void)setHostNameOverride:(NSString *)hostNameOverride {
  519. _hostNameOverride = [hostNameOverride copy];
  520. }
  521. - (void)setLogContext:(id)logContext {
  522. _logContext = logContext;
  523. }
  524. - (void)setChannelPoolDomain:(NSString *)channelPoolDomain {
  525. _channelPoolDomain = [channelPoolDomain copy];
  526. }
  527. - (void)setChannelID:(NSUInteger)channelID {
  528. _channelID = channelID;
  529. }
  530. @end