diff --git a/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift b/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift index 0029c1e50..cc27c5bdd 100644 --- a/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift +++ b/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift @@ -64,7 +64,7 @@ public class OWS106EnsureProfileComplete: OWSDatabaseMigration { self.completionHandler(true) }.catch { error in let nserror = error as NSError - if nserror.domain == TSNetworkManagerDomain { + if nserror.domain == TSNetworkManagerErrorDomain { // Don't retry if we had an unrecoverable error. // In particular, 401 (invalid auth) is unrecoverable. let isUnrecoverableError = nserror.code == 401 diff --git a/SignalServiceKit/src/Account/TSAccountManager.m b/SignalServiceKit/src/Account/TSAccountManager.m index d5dbca936..087445efd 100644 --- a/SignalServiceKit/src/Account/TSAccountManager.m +++ b/SignalServiceKit/src/Account/TSAccountManager.m @@ -386,7 +386,7 @@ NSString *const TSAccountManager_ServerSignalingKey = @"TSStorageServerSignaling if (!IsNSErrorNetworkFailure(error)) { OWSProdError([OWSAnalyticsEvents accountsErrorVerifyAccountRequestFailed]); } - OWSAssertDebug([error.domain isEqualToString:TSNetworkManagerDomain]); + OWSAssertDebug([error.domain isEqualToString:TSNetworkManagerErrorDomain]); OWSLogWarn(@"Error verifying code: %@", error.debugDescription); diff --git a/SignalServiceKit/src/Network/API/TSNetworkManager.h b/SignalServiceKit/src/Network/API/TSNetworkManager.h index e91bacae5..0dda2495a 100644 --- a/SignalServiceKit/src/Network/API/TSNetworkManager.h +++ b/SignalServiceKit/src/Network/API/TSNetworkManager.h @@ -6,7 +6,15 @@ 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); diff --git a/SignalServiceKit/src/Network/API/TSNetworkManager.m b/SignalServiceKit/src/Network/API/TSNetworkManager.m index 2c57838fd..af3bec64a 100644 --- a/SignalServiceKit/src/Network/API/TSNetworkManager.m +++ b/SignalServiceKit/src/Network/API/TSNetworkManager.m @@ -7,6 +7,7 @@ #import "NSData+OWS.h" #import "NSError+messageSending.h" #import "NSURLSessionDataTask+StatusCode.h" +#import "OWSError.h" #import "OWSSignalService.h" #import "SSKEnvironment.h" #import "TSAccountManager.h" @@ -14,11 +15,12 @@ #import #import -NSString *const TSNetworkManagerDomain = @"org.whispersystems.signal.networkManager"; +NSErrorDomain const TSNetworkManagerErrorDomain = @"SignalServiceKit.TSNetworkManager"; BOOL IsNSErrorNetworkFailure(NSError *_Nullable error) { - return ([error.domain isEqualToString:TSNetworkManagerDomain] && error.code == 0); + return ([error.domain isEqualToString:TSNetworkManagerErrorDomain] + && error.code == TSNetworkManagerErrorFailedConnection); } @interface TSNetworkManager () @@ -218,16 +220,17 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error); switch (statusCode) { case 0: { - error.isRetryable = YES; - - OWSLogWarn(@"The network request failed because of a connectivity error: %@", request); - failureBlock(task, - [self errorWithHTTPCode:statusCode + NSError *connectivityError = + [self errorWithHTTPCode:TSNetworkManagerErrorFailedConnection description:NSLocalizedString(@"ERROR_DESCRIPTION_NO_INTERNET", @"Generic error used whenever Signal can't contact the server") failureReason:networkError.localizedFailureReason 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; } case 400: { @@ -356,7 +359,7 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error); [dict setObject:failureData forKey:AFNetworkingOperationFailingURLResponseDataErrorKey]; } - return [NSError errorWithDomain:TSNetworkManagerDomain code:code userInfo:dict]; + return [NSError errorWithDomain:TSNetworkManagerErrorDomain code:code userInfo:dict]; } @end