|
|
|
@ -409,9 +409,26 @@ static NSMutableDictionary *callFlags; |
|
|
|
|
_state = GRXWriterStateStarted; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Create a retain cycle so that this instance lives until the RPC finishes |
|
|
|
|
// (or is cancelled). This makes RPCs in which the call isn't externally |
|
|
|
|
// retained possible (as long as it is started before being autoreleased). |
|
|
|
|
// Care is taken not to retain self strongly in any of the blocks used in this |
|
|
|
|
// implementation, so that the life of the instance is determined by this |
|
|
|
|
// retain cycle. |
|
|
|
|
_retainSelf = self; |
|
|
|
|
|
|
|
|
|
_responseWriteable = |
|
|
|
|
[[GRXConcurrentWriteable alloc] initWithWriteable:writeable]; |
|
|
|
|
|
|
|
|
|
_wrappedCall = [[GRPCWrappedCall alloc] initWithHost:_host path:_path]; |
|
|
|
|
NSAssert(_wrappedCall, @"Error allocating RPC objects. Low memory?"); |
|
|
|
|
|
|
|
|
|
[self sendHeaders:_requestHeaders]; |
|
|
|
|
[self invokeCall]; |
|
|
|
|
|
|
|
|
|
// TODO(jcanizales): Extract this logic somewhere common. |
|
|
|
|
NSString *host = |
|
|
|
|
[NSURL URLWithString:[@"https://" stringByAppendingString:_host]].host; |
|
|
|
|
[NSURL URLWithString:[@"https://" stringByAppendingString:_host]].host; |
|
|
|
|
if (!host) { |
|
|
|
|
// TODO(jcanizales): Check this on init. |
|
|
|
|
[NSException raise:NSInvalidArgumentException |
|
|
|
@ -423,34 +440,17 @@ static NSMutableDictionary *callFlags; |
|
|
|
|
typeof(self) strongSelf = weakSelf; |
|
|
|
|
if (strongSelf) { |
|
|
|
|
[strongSelf |
|
|
|
|
finishWithError:[NSError errorWithDomain:kGRPCErrorDomain |
|
|
|
|
code:GRPCErrorCodeUnavailable |
|
|
|
|
userInfo:@{ |
|
|
|
|
NSLocalizedDescriptionKey : |
|
|
|
|
@"Connectivity lost." |
|
|
|
|
}]]; |
|
|
|
|
finishWithError:[NSError errorWithDomain:kGRPCErrorDomain |
|
|
|
|
code:GRPCErrorCodeUnavailable |
|
|
|
|
userInfo:@{ |
|
|
|
|
NSLocalizedDescriptionKey : |
|
|
|
|
@"Connectivity lost." |
|
|
|
|
}]]; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
[_connectivityMonitor handleLossWithHandler:handler |
|
|
|
|
wifiStatusChangeHandler:^{ |
|
|
|
|
}]; |
|
|
|
|
|
|
|
|
|
// Create a retain cycle so that this instance lives until the RPC finishes |
|
|
|
|
// (or is cancelled). This makes RPCs in which the call isn't externally |
|
|
|
|
// retained possible (as long as it is started before being autoreleased). |
|
|
|
|
// Care is taken not to retain self strongly in any of the blocks used in this |
|
|
|
|
// implementation, so that the life of the instance is determined by this |
|
|
|
|
// retain cycle. |
|
|
|
|
_retainSelf = self; |
|
|
|
|
|
|
|
|
|
_responseWriteable = |
|
|
|
|
[[GRXConcurrentWriteable alloc] initWithWriteable:writeable]; |
|
|
|
|
|
|
|
|
|
_wrappedCall = [[GRPCWrappedCall alloc] initWithHost:_host path:_path]; |
|
|
|
|
NSAssert(_wrappedCall, @"Error allocating RPC objects. Low memory?"); |
|
|
|
|
|
|
|
|
|
[self sendHeaders:_requestHeaders]; |
|
|
|
|
[self invokeCall]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
- (void)setState:(GRXWriterState)newState { |
|
|
|
|