| 
					
				 | 
			
			
				@@ -58,22 +58,12 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Default initializer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 - (instancetype)initWithAddress:(NSString *)address { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Verify and normalize the address, and decide whether to use SSL. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (![address rangeOfString:@"://"].length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // No scheme provided; assume https. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    address = [@"https://" stringByAppendingString:address]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // To provide a default port, we try to interpret the address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // TODO(jcanizales): Add unit tests for the types of addresses we want to let pass through. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  NSURL *hostURL = [NSURL URLWithString:[@"https://" stringByAppendingString:address]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (hostURL && !hostURL.port) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    address = [hostURL.host stringByAppendingString:@":443"]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  NSURL *hostURL = [NSURL URLWithString:address]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!hostURL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    [NSException raise:NSInvalidArgumentException format:@"Invalid URL: %@", address]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  NSString *scheme = hostURL.scheme; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    [NSException raise:NSInvalidArgumentException format:@"URL scheme %@ isn't supported.", scheme]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // If the user didn't specify a port (hostURL.port is nil), provide a default one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  NSNumber *port = hostURL.port ?: [scheme isEqualToString:@"https"] ? @443 : @80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  address = [@[hostURL.host, port] componentsJoinedByString:@":"]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Look up the GRPCHost in the cache. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   static NSMutableDictionary *hostCache; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -84,19 +74,15 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   @synchronized(hostCache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     GRPCHost *cachedHost = hostCache[address]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (cachedHost) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // We could verify here that the cached host uses the same protocol that we're expecting. But 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // creating non-SSL channels by adding "http://" to the address is going away (to make the use 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // of insecure channels less subtle), so it's not worth it now. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return cachedHost; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ((self = [super init])) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      _address = address; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      _secure = [scheme isEqualToString:@"https"]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      hostCache[address] = self; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return self; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if ((self = [super init])) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _address = address; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _secure = YES; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    hostCache[address] = self; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return self; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 - (grpc_call *)unmanagedCallWithPath:(NSString *)path completionQueue:(GRPCCompletionQueue *)queue { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -131,4 +117,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return _hostNameOverride ?: _address; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// TODO(jcanizales): Don't let set |secure| to |NO| if |pathToCertificates| or |hostNameOverride| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// have been set. Don't let set either of the latter if |secure| has been set to |NO|. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @end 
			 |