|
@@ -415,6 +415,36 @@ static NSString * const kBearerPrefix = @"Bearer ";
|
|
|
|
|
|
#pragma mark GRXWriter implementation
|
|
|
|
|
|
+- (void)startCallWithWriteable:(id<GRXWriteable>)writeable {
|
|
|
+ _responseWriteable = [[GRXConcurrentWriteable alloc] initWithWriteable:writeable
|
|
|
+ dispatchQueue:_responseQueue];
|
|
|
+
|
|
|
+ _wrappedCall = [[GRPCWrappedCall alloc] initWithHost:_host
|
|
|
+ serverName:_serverName
|
|
|
+ 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;
|
|
|
+ if (!host) {
|
|
|
+ // TODO(jcanizales): Check this on init.
|
|
|
+ [NSException raise:NSInvalidArgumentException format:@"host of %@ is nil", _host];
|
|
|
+ }
|
|
|
+ _connectivityMonitor = [GRPCConnectivityMonitor monitorWithHost:host];
|
|
|
+ __weak typeof(self) weakSelf = self;
|
|
|
+ void (^handler)() = ^{
|
|
|
+ typeof(self) strongSelf = weakSelf;
|
|
|
+ [strongSelf finishWithError:[NSError errorWithDomain:kGRPCErrorDomain
|
|
|
+ code:GRPCErrorCodeUnavailable
|
|
|
+ userInfo:@{ NSLocalizedDescriptionKey : @"Connectivity lost." }]];
|
|
|
+ };
|
|
|
+ [_connectivityMonitor handleLossWithHandler:handler
|
|
|
+ wifiStatusChangeHandler:nil];
|
|
|
+}
|
|
|
+
|
|
|
- (void)startWithWriteable:(id<GRXWriteable>)writeable {
|
|
|
@synchronized(self) {
|
|
|
_state = GRXWriterStateStarted;
|
|
@@ -427,41 +457,9 @@ static NSString * const kBearerPrefix = @"Bearer ";
|
|
|
// that the life of the instance is determined by this retain cycle.
|
|
|
_retainSelf = self;
|
|
|
|
|
|
- __weak typeof(self) weakSelf = self;
|
|
|
- void (^performCall)() = ^{
|
|
|
- typeof(self) strongSelf = weakSelf;
|
|
|
- if (strongSelf) {
|
|
|
- strongSelf->_responseWriteable = [[GRXConcurrentWriteable alloc] initWithWriteable:writeable
|
|
|
- dispatchQueue:strongSelf->_responseQueue];
|
|
|
-
|
|
|
- strongSelf->_wrappedCall = [[GRPCWrappedCall alloc] initWithHost:strongSelf->_host
|
|
|
- serverName:strongSelf->_serverName
|
|
|
- path:strongSelf->_path];
|
|
|
- NSAssert(_wrappedCall, @"Error allocating RPC objects. Low memory?");
|
|
|
-
|
|
|
- [strongSelf sendHeaders:_requestHeaders];
|
|
|
- [strongSelf invokeCall];
|
|
|
-
|
|
|
- // TODO(jcanizales): Extract this logic somewhere common.
|
|
|
- NSString *host = [NSURL URLWithString:[@"https://" stringByAppendingString:strongSelf->_host]].host;
|
|
|
- if (!host) {
|
|
|
- // TODO(jcanizales): Check this on init.
|
|
|
- [NSException raise:NSInvalidArgumentException format:@"host of %@ is nil", strongSelf->_host];
|
|
|
- }
|
|
|
- strongSelf->_connectivityMonitor = [GRPCConnectivityMonitor monitorWithHost:host];
|
|
|
- void (^handler)() = ^{
|
|
|
- typeof(self) strongSelf = weakSelf;
|
|
|
- [strongSelf finishWithError:[NSError errorWithDomain:kGRPCErrorDomain
|
|
|
- code:GRPCErrorCodeUnavailable
|
|
|
- userInfo:@{ NSLocalizedDescriptionKey : @"Connectivity lost." }]];
|
|
|
- };
|
|
|
- [_connectivityMonitor handleLossWithHandler:handler
|
|
|
- wifiStatusChangeHandler:nil];
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
if (self.oauthToken != nil) {
|
|
|
self.isWaitingForToken = YES;
|
|
|
+ __weak typeof(self) weakSelf = self;
|
|
|
[self.oauthToken getTokenWithHandler:^(NSString *token){
|
|
|
typeof(self) strongSelf = weakSelf;
|
|
|
if (strongSelf && strongSelf.isWaitingForToken) {
|
|
@@ -469,12 +467,12 @@ static NSString * const kBearerPrefix = @"Bearer ";
|
|
|
NSString *t = [kBearerPrefix stringByAppendingString:token];
|
|
|
strongSelf.requestHeaders[kAuthorizationHeader] = t;
|
|
|
}
|
|
|
- performCall();
|
|
|
+ [strongSelf startCallWithWriteable:writeable];
|
|
|
strongSelf.isWaitingForToken = NO;
|
|
|
}
|
|
|
}];
|
|
|
} else {
|
|
|
- performCall();
|
|
|
+ [self startCallWithWriteable:writeable];
|
|
|
}
|
|
|
}
|
|
|
|