conventional error structure for connectivity error

pull/1/head
Michael Kirk 7 years ago
parent 54b184bc97
commit e7170dc6e8

@ -64,7 +64,7 @@ public class OWS106EnsureProfileComplete: OWSDatabaseMigration {
self.completionHandler(true) self.completionHandler(true)
}.catch { error in }.catch { error in
let nserror = error as NSError let nserror = error as NSError
if nserror.domain == TSNetworkManagerDomain { if nserror.domain == TSNetworkManagerErrorDomain {
// Don't retry if we had an unrecoverable error. // Don't retry if we had an unrecoverable error.
// In particular, 401 (invalid auth) is unrecoverable. // In particular, 401 (invalid auth) is unrecoverable.
let isUnrecoverableError = nserror.code == 401 let isUnrecoverableError = nserror.code == 401

@ -386,7 +386,7 @@ NSString *const TSAccountManager_ServerSignalingKey = @"TSStorageServerSignaling
if (!IsNSErrorNetworkFailure(error)) { if (!IsNSErrorNetworkFailure(error)) {
OWSProdError([OWSAnalyticsEvents accountsErrorVerifyAccountRequestFailed]); OWSProdError([OWSAnalyticsEvents accountsErrorVerifyAccountRequestFailed]);
} }
OWSAssertDebug([error.domain isEqualToString:TSNetworkManagerDomain]); OWSAssertDebug([error.domain isEqualToString:TSNetworkManagerErrorDomain]);
OWSLogWarn(@"Error verifying code: %@", error.debugDescription); OWSLogWarn(@"Error verifying code: %@", error.debugDescription);

@ -6,7 +6,15 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
extern NSString *const TSNetworkManagerDomain; extern NSErrorDomain const TSNetworkManagerErrorDomain;
typedef NS_ERROR_ENUM(TSNetworkManagerErrorDomain, TSNetworkManagerError){
// It's a shame to use 0 as an enum value for anything other than something like default or unknown, because it's
// indistinguishable from "not set" in Objc.
// However this value was existing behavior for connectivity errors, and since we might be using this in other
// places I didn't want to change it out of hand
TSNetworkManagerErrorFailedConnection = 0,
// Other TSNetworkManagerError's use HTTP status codes (e.g. 404, etc)
};
BOOL IsNSErrorNetworkFailure(NSError *_Nullable error); BOOL IsNSErrorNetworkFailure(NSError *_Nullable error);

@ -7,6 +7,7 @@
#import "NSData+OWS.h" #import "NSData+OWS.h"
#import "NSError+messageSending.h" #import "NSError+messageSending.h"
#import "NSURLSessionDataTask+StatusCode.h" #import "NSURLSessionDataTask+StatusCode.h"
#import "OWSError.h"
#import "OWSSignalService.h" #import "OWSSignalService.h"
#import "SSKEnvironment.h" #import "SSKEnvironment.h"
#import "TSAccountManager.h" #import "TSAccountManager.h"
@ -14,11 +15,12 @@
#import <AFNetworking/AFNetworking.h> #import <AFNetworking/AFNetworking.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h> #import <SignalServiceKit/SignalServiceKit-Swift.h>
NSString *const TSNetworkManagerDomain = @"org.whispersystems.signal.networkManager"; NSErrorDomain const TSNetworkManagerErrorDomain = @"SignalServiceKit.TSNetworkManager";
BOOL IsNSErrorNetworkFailure(NSError *_Nullable error) BOOL IsNSErrorNetworkFailure(NSError *_Nullable error)
{ {
return ([error.domain isEqualToString:TSNetworkManagerDomain] && error.code == 0); return ([error.domain isEqualToString:TSNetworkManagerErrorDomain]
&& error.code == TSNetworkManagerErrorFailedConnection);
} }
@interface TSNetworkManager () @interface TSNetworkManager ()
@ -218,16 +220,17 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
switch (statusCode) { switch (statusCode) {
case 0: { case 0: {
error.isRetryable = YES; NSError *connectivityError =
[self errorWithHTTPCode:TSNetworkManagerErrorFailedConnection
OWSLogWarn(@"The network request failed because of a connectivity error: %@", request);
failureBlock(task,
[self errorWithHTTPCode:statusCode
description:NSLocalizedString(@"ERROR_DESCRIPTION_NO_INTERNET", description:NSLocalizedString(@"ERROR_DESCRIPTION_NO_INTERNET",
@"Generic error used whenever Signal can't contact the server") @"Generic error used whenever Signal can't contact the server")
failureReason:networkError.localizedFailureReason failureReason:networkError.localizedFailureReason
recoverySuggestion:NSLocalizedString(@"NETWORK_ERROR_RECOVERY", nil) recoverySuggestion:NSLocalizedString(@"NETWORK_ERROR_RECOVERY", nil)
fallbackError:networkError]); fallbackError:networkError];
connectivityError.isRetryable = YES;
OWSLogWarn(@"The network request failed because of a connectivity error: %@", request);
failureBlock(task, connectivityError);
break; break;
} }
case 400: { case 400: {
@ -356,7 +359,7 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
[dict setObject:failureData forKey:AFNetworkingOperationFailingURLResponseDataErrorKey]; [dict setObject:failureData forKey:AFNetworkingOperationFailingURLResponseDataErrorKey];
} }
return [NSError errorWithDomain:TSNetworkManagerDomain code:code userInfo:dict]; return [NSError errorWithDomain:TSNetworkManagerErrorDomain code:code userInfo:dict];
} }
@end @end

Loading…
Cancel
Save