Return nil instead of assert when the test certs can’t be read

pull/2754/head
Jorge Canizales 10 years ago
parent 145f865ce0
commit 8c5318a6d1
  1. 3
      src/objective-c/GRPCClient/GRPCCall.m
  2. 2
      src/objective-c/GRPCClient/private/GRPCHost.m
  3. 38
      src/objective-c/GRPCClient/private/GRPCSecureChannel.m

@ -103,6 +103,9 @@ NSString * const kGRPCStatusMetadataKey = @"io.grpc.StatusMetadataKey";
} }
if ((self = [super init])) { if ((self = [super init])) {
_wrappedCall = [[GRPCWrappedCall alloc] initWithHost:host path:path]; _wrappedCall = [[GRPCWrappedCall alloc] initWithHost:host path:path];
if (!_wrappedCall) {
return nil;
}
// Serial queue to invoke the non-reentrant methods of the grpc_call object. // Serial queue to invoke the non-reentrant methods of the grpc_call object.
_callQueue = dispatch_queue_create("org.grpc.call", NULL); _callQueue = dispatch_queue_create("org.grpc.call", NULL);

@ -100,7 +100,7 @@
} }
- (grpc_call *)unmanagedCallWithPath:(NSString *)path completionQueue:(GRPCCompletionQueue *)queue { - (grpc_call *)unmanagedCallWithPath:(NSString *)path completionQueue:(GRPCCompletionQueue *)queue {
if (!queue || !path) { if (!queue || !path || !self.channel) {
return NULL; return NULL;
} }
return grpc_channel_create_call(self.channel.unmanagedChannel, return grpc_channel_create_call(self.channel.unmanagedChannel,

@ -35,11 +35,18 @@
#include <grpc/grpc_security.h> #include <grpc/grpc_security.h>
static grpc_credentials *CertificatesAtPath(NSString *path) { // Returns NULL if the file at path couldn't be read. In that case, if errorPtr isn't NULL,
NSData *certsData = [NSData dataWithContentsOfFile:path]; // *errorPtr will be an object describing what went wrong.
NSCAssert(certsData.length, @"No data read from %@", path); static grpc_credentials *CertificatesAtPath(NSString *path, NSError **errorPtr) {
NSString *certsString = [[NSString alloc] initWithData:certsData encoding:NSUTF8StringEncoding]; NSString *certsContent = [NSString stringWithContentsOfFile:path
return grpc_ssl_credentials_create(certsString.UTF8String, NULL); encoding:NSASCIIStringEncoding
error:errorPtr];
if (!certsContent) {
// Passing NULL to grpc_ssl_credentials_create produces behavior we don't want, so return.
return NULL;
}
const char * asCString = [certsContent cStringUsingEncoding:NSASCIIStringEncoding];
return grpc_ssl_credentials_create(asCString, NULL);
} }
@implementation GRPCSecureChannel @implementation GRPCSecureChannel
@ -55,15 +62,24 @@ static grpc_credentials *CertificatesAtPath(NSString *path) {
static grpc_credentials *kDefaultCertificates; static grpc_credentials *kDefaultCertificates;
static dispatch_once_t loading; static dispatch_once_t loading;
dispatch_once(&loading, ^{ dispatch_once(&loading, ^{
NSString *defaultPath = @"gRPCCertificates.bundle/roots"; // .pem
// Do not use NSBundle.mainBundle, as it's nil for tests of library projects. // Do not use NSBundle.mainBundle, as it's nil for tests of library projects.
NSBundle *bundle = [NSBundle bundleForClass:self.class]; NSBundle *bundle = [NSBundle bundleForClass:self.class];
NSString *certsPath = [bundle pathForResource:@"gRPCCertificates.bundle/roots" ofType:@"pem"]; NSString *path = [bundle pathForResource:defaultPath ofType:@"pem"];
NSAssert(certsPath.length, NSError *error;
@"gRPCCertificates.bundle/roots.pem not found under %@. This file, with the root " kDefaultCertificates = CertificatesAtPath(path, &error);
"certificates, is needed to establish TLS (HTTPS) connections.", bundle.bundlePath); NSAssert(kDefaultCertificates, @"Could not read %@/%@.pem. This file, with the root "
kDefaultCertificates = CertificatesAtPath(certsPath); "certificates, is needed to establish secure (TLS) connections. Because the file is "
"distributed with the gRPC library, this error is usually a sign that the library "
"wasn't configured correctly for your project. Error: %@",
bundle.bundlePath, defaultPath, error);
}); });
grpc_credentials *certificates = path ? CertificatesAtPath(path) : kDefaultCertificates;
//TODO(jcanizales): Add NSError** parameter to the initializer.
grpc_credentials *certificates = path ? CertificatesAtPath(path, NULL) : kDefaultCertificates;
if (!certificates) {
return nil;
}
// Ritual to pass the SSL host name override to the C library. // Ritual to pass the SSL host name override to the C library.
grpc_channel_args channelArgs; grpc_channel_args channelArgs;

Loading…
Cancel
Save