Skip to content

Commit

Permalink
Merge pull request #1482 from urbanairship/MOBILE-194
Browse files Browse the repository at this point in the history
[MOBILE-194] HTTP 429 retries, minor refactoring
  • Loading branch information
marc-scig committed May 23, 2018
2 parents ce3a679 + ef1b637 commit 56b85ff
Show file tree
Hide file tree
Showing 13 changed files with 72 additions and 74 deletions.
18 changes: 17 additions & 1 deletion AirshipKit/AirshipKit.xcodeproj/project.pbxproj
Expand Up @@ -7,6 +7,12 @@
objects = {

/* Begin PBXBuildFile section */
3C54A7D620B4C8D50026887C /* NSURLResponse+UAAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C54A7D420B4C8D50026887C /* NSURLResponse+UAAdditions.m */; };
3C54A7D720B4C8D50026887C /* NSURLResponse+UAAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C54A7D420B4C8D50026887C /* NSURLResponse+UAAdditions.m */; };
3C54A7D820B4C8D50026887C /* NSURLResponse+UAAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C54A7D420B4C8D50026887C /* NSURLResponse+UAAdditions.m */; };
3C54A7D920B4C8D50026887C /* NSURLResponse+UAAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C54A7D520B4C8D50026887C /* NSURLResponse+UAAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
3C54A7DA20B4C8D50026887C /* NSURLResponse+UAAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C54A7D520B4C8D50026887C /* NSURLResponse+UAAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
3C54A7DB20B4C8D50026887C /* NSURLResponse+UAAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C54A7D520B4C8D50026887C /* NSURLResponse+UAAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
3C5A250E20115BE600F25829 /* UAInAppMessageHTMLView+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C5A250C20115BE600F25829 /* UAInAppMessageHTMLView+Internal.h */; };
3C5A250F20115BE600F25829 /* UAInAppMessageHTMLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C5A250D20115BE600F25829 /* UAInAppMessageHTMLView.m */; };
3C5A25182012BFB900F25829 /* UAInAppMessageHTMLView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3C5A25162012BFB900F25829 /* UAInAppMessageHTMLView.xib */; };
Expand Down Expand Up @@ -1505,6 +1511,8 @@

/* Begin PBXFileReference section */
07A9F5B3D35A6078949E4EAA /* Pods-AirshipKitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AirshipKitTests.release.xcconfig"; path = "../Pods/Target Support Files/Pods-AirshipKitTests/Pods-AirshipKitTests.release.xcconfig"; sourceTree = "<group>"; };
3C54A7D420B4C8D50026887C /* NSURLResponse+UAAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSURLResponse+UAAdditions.m"; path = "common/NSURLResponse+UAAdditions.m"; sourceTree = "<group>"; };
3C54A7D520B4C8D50026887C /* NSURLResponse+UAAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSURLResponse+UAAdditions.h"; path = "common/NSURLResponse+UAAdditions.h"; sourceTree = "<group>"; };
3C5A250C20115BE600F25829 /* UAInAppMessageHTMLView+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UAInAppMessageHTMLView+Internal.h"; path = "ios/UAInAppMessageHTMLView+Internal.h"; sourceTree = "<group>"; };
3C5A250D20115BE600F25829 /* UAInAppMessageHTMLView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = UAInAppMessageHTMLView.m; path = ios/UAInAppMessageHTMLView.m; sourceTree = "<group>"; };
3C5A25162012BFB900F25829 /* UAInAppMessageHTMLView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UAInAppMessageHTMLView.xib; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3245,6 +3253,8 @@
CC40DDE71D91D8E600BABD4F /* Utils */ = {
isa = PBXGroup;
children = (
3C54A7D520B4C8D50026887C /* NSURLResponse+UAAdditions.h */,
3C54A7D420B4C8D50026887C /* NSURLResponse+UAAdditions.m */,
CC40DBF21D8C996A00BABD4F /* UAURLProtocol.h */,
CC40DBF31D8C996A00BABD4F /* UAURLProtocol.m */,
3CE58FD3207427CE00076854 /* UAUtils.h */,
Expand Down Expand Up @@ -3757,6 +3767,7 @@
3CE58FD4207427CF00076854 /* UAUtils.h in Headers */,
CC40DC051D8C996A00BABD4F /* AirshipKit.h in Headers */,
CCEAF3F11DD3D8C1005C080F /* UAPreferenceDataStore+InternalTagGroupsMutation.h in Headers */,
3C54A7D920B4C8D50026887C /* NSURLResponse+UAAdditions.h in Headers */,
45DCD8332086AAB200BCF10F /* UAInAppMessageButtonStyle.h in Headers */,
DF7E21E91ED624D000C79C46 /* UAMessageCenterMessageViewProtocol.h in Headers */,
3C805B1C200ED87D0079F56E /* UAInAppMessageHTMLDisplayContent.h in Headers */,
Expand Down Expand Up @@ -4036,9 +4047,10 @@
99666E751EDF2CC500BAE46B /* AirshipKit.h in Headers */,
3CE58FD520742A8100076854 /* UAUtils.h in Headers */,
DF7E7A1F1EE2163A00D4EF02 /* AirshipLib.h in Headers */,
99666E5E1EDF2C9500BAE46B /* NSJSONSerialization+UAAdditions.h in Headers */,
6E598D371FFC4FB4005B234B /* UAActionScheduleEdits.h in Headers */,
457F47AC20ADDF7500DEEAD9 /* UAViewUtils+Internal.h in Headers */,
3C54A7DA20B4C8D50026887C /* NSURLResponse+UAAdditions.h in Headers */,
99666E5E1EDF2C9500BAE46B /* NSJSONSerialization+UAAdditions.h in Headers */,
99666E6A1EDF2C9A00BAE46B /* NSManagedObjectContext+UAAdditions.h in Headers */,
99666E6E1EDF2C9A00BAE46B /* NSOperationQueue+UAAdditions.h in Headers */,
99666E601EDF2C9500BAE46B /* NSString+UALocalizationAdditions.h in Headers */,
Expand Down Expand Up @@ -4210,6 +4222,7 @@
3C77BF8F2016AA3C00AD37F3 /* UAInAppMessageHTMLAdapter.h in Headers */,
99E2DA2E1FB62D2400C9F2CC /* UAInAppMessageManager+Internal.h in Headers */,
6EADE7071FA8FA160007F924 /* UAAutomationEngine+Internal.h in Headers */,
3C54A7DB20B4C8D50026887C /* NSURLResponse+UAAdditions.h in Headers */,
45DCD8342086AAB200BCF10F /* UAInAppMessageButtonStyle.h in Headers */,
DF7E22A41ED62E0900C79C46 /* AirshipKit.h in Headers */,
99E2DA311FB62E6C00C9F2CC /* UARemoteDataManager+Internal.h in Headers */,
Expand Down Expand Up @@ -4931,6 +4944,7 @@
CC40DC331D8C996A00BABD4F /* UAAddCustomEventAction.m in Sources */,
DF18CCED1FEC74D200652445 /* UAInAppMessageModalViewController.m in Sources */,
CC40DC711D8C996A00BABD4F /* UAConfig.m in Sources */,
3C54A7D620B4C8D50026887C /* NSURLResponse+UAAdditions.m in Sources */,
CC40DCB61D8C996A00BABD4F /* UAInboxMessageList.m in Sources */,
CC40DC151D8C996A00BABD4F /* UAAction+Operators.m in Sources */,
998B22681FD89D4400C535AE /* UAInAppMessageBannerContentView.m in Sources */,
Expand Down Expand Up @@ -5303,6 +5317,7 @@
99E2DA771FBB76E000C9F2CC /* UAInAppMessageTextInfo.m in Sources */,
DF18CCEE1FEC74D200652445 /* UAInAppMessageModalViewController.m in Sources */,
6E3673E11E8C8178005B5DFF /* UATextInputNotificationAction.m in Sources */,
3C54A7D820B4C8D50026887C /* NSURLResponse+UAAdditions.m in Sources */,
CC04F19B1DBFF0CB00B4842D /* NSManagedContext+UAAdditions.m in Sources */,
CC40DD501D8C9A1C00BABD4F /* UAAssociateIdentifiersEvent.m in Sources */,
CC40DD511D8C9A1C00BABD4F /* UAAutoIntegration.m in Sources */,
Expand Down Expand Up @@ -5566,6 +5581,7 @@
99666D821EDF2B7300BAE46B /* UAAPIClient.m in Sources */,
99666D8A1EDF2BA000BAE46B /* UAScheduleAction.m in Sources */,
99666D841EDF2B7300BAE46B /* UARequest.m in Sources */,
3C54A7D720B4C8D50026887C /* NSURLResponse+UAAdditions.m in Sources */,
99666DA01EDF2BB400BAE46B /* UAAutomation.m in Sources */,
DF5ED8DD1F743E7E002DDA24 /* UARemoteDataPayload.m in Sources */,
99666D941EDF2BAE00BAE46B /* UAAutomationStore.m in Sources */,
Expand Down
12 changes: 12 additions & 0 deletions AirshipKit/AirshipKit/common/NSURLResponse+UAAdditions.h
@@ -0,0 +1,12 @@

#import <Foundation/Foundation.h>

@interface NSURLResponse (UAAdditions)

/**
* Whether the response indicates that a retry is necessary or feasible.
* @return `YES` if the operation should be retried, otherwise `NO`.
*/
- (BOOL)hasRetriableStatus;

@end
20 changes: 20 additions & 0 deletions AirshipKit/AirshipKit/common/NSURLResponse+UAAdditions.m
@@ -0,0 +1,20 @@

#import "NSURLResponse+UAAdditions.h"

@implementation NSURLResponse (UAAdditions)

- (BOOL)hasRetriableStatus {
if ([self isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)self;
BOOL serverError = response.statusCode >= 500 && response.statusCode <= 599;
BOOL tooManyRequests = response.statusCode == 429;

if (serverError || tooManyRequests) {
return YES;
}
}

return NO;
}

@end
23 changes: 3 additions & 20 deletions AirshipKit/AirshipKit/common/UAChannelAPIClient.m
Expand Up @@ -7,6 +7,7 @@
#import "UAirship.h"
#import "UAAnalytics+Internal.h"
#import "NSJSONSerialization+UAAdditions.h"
#import "NSURLResponse+UAAdditions.h"

#define kUAChannelCreateLocation @"/api/channels/"

Expand Down Expand Up @@ -38,16 +39,7 @@ - (void)createChannelWithPayload:(UAChannelRegistrationPayload *)payload
}];

[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData *data, NSURLResponse *response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}

if (httpResponse.statusCode >= 500 && httpResponse.statusCode <= 599) {
return YES;
}

return NO;
return [response hasRetriableStatus];
} completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down Expand Up @@ -93,16 +85,7 @@ - (void)updateChannelWithLocation:(NSString *)channelLocation
}];

[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData *data, NSURLResponse *response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}

if (httpResponse.statusCode >= 500 && httpResponse.statusCode <= 599) {
return YES;
}

return NO;
return [response hasRetriableStatus];
} completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down
18 changes: 3 additions & 15 deletions AirshipKit/AirshipKit/common/UANamedUserAPIClient.m
Expand Up @@ -4,6 +4,7 @@
#import "UAConfig.h"
#import "UAUtils+Internal.h"
#import "NSJSONSerialization+UAAdditions.h"
#import "NSURLResponse+UAAdditions.h"

#define kUANamedUserPath @"/api/named_users"
#define kUANamedUserChannelIDKey @"channel_id"
Expand Down Expand Up @@ -53,13 +54,7 @@ - (void)associate:(NSString *)identifier
urlString:[NSString stringWithFormat:@"%@%@", urlString, @"/associate"]];

[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData * _Nullable data, NSURLResponse * _Nullable response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}

NSInteger status = httpResponse.statusCode;
return (BOOL)(status >= 500 && status <= 599);
return [response hasRetriableStatus];
} completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down Expand Up @@ -105,14 +100,7 @@ - (void)disassociate:(NSString *)channelID
urlString:[NSString stringWithFormat:@"%@%@", urlString, @"/disassociate"]];

[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData * _Nullable data, NSURLResponse * _Nullable response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}
NSInteger status = httpResponse.statusCode;
return (BOOL)(status >= 500 && status <= 599);


return [response hasRetriableStatus];
} completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down
10 changes: 2 additions & 8 deletions AirshipKit/AirshipKit/common/UARemoteDataAPIClient.m
Expand Up @@ -4,6 +4,7 @@
#import "UAPreferenceDataStore+Internal.h"
#import "UAUtils+Internal.h"
#import "UAConfig+Internal.h"
#import "NSURLResponse+UAAdditions.h"

@interface UARemoteDataAPIClient()

Expand Down Expand Up @@ -44,14 +45,7 @@ - (UADisposable *)fetchRemoteData:(UARemoteDataRefreshSuccessBlock)successBlock


[self.session dataTaskWithRequest:refreshRequest retryWhere:^BOOL(NSData * _Nullable data, NSURLResponse * _Nullable response) {
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
if (httpResponse.statusCode >= 500 && httpResponse.statusCode <= 599) {
return YES;
}
}

return NO;
return [response hasRetriableStatus];
} completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (![response isKindOfClass:[NSHTTPURLResponse class]]) {
if (refreshRemoteDataFailureBlock) {
Expand Down
9 changes: 2 additions & 7 deletions AirshipKit/AirshipKit/common/UATagGroupsAPIClient.m
Expand Up @@ -4,6 +4,7 @@
#import "UATagGroupsMutation+Internal.h"
#import "UAConfig.h"
#import "NSJSONSerialization+UAAdditions.h"
#import "NSURLResponse+UAAdditions.h"

#define kUAChannelTagGroupsPath @"/api/channels/tags/"
#define kUANamedUserTagsPath @"/api/named_users/tags/"
Expand Down Expand Up @@ -81,13 +82,7 @@ - (void)performTagGroupsMutation:(UATagGroupsMutation *)mutation
UA_LTRACE(@"Updating tag groups with payload: %@", payload);

[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData * _Nullable data, NSURLResponse * _Nullable response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}

NSInteger status = httpResponse.statusCode;
return (BOOL)((status >= 500 && status <= 599));
return [response hasRetriableStatus];
} completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down
23 changes: 3 additions & 20 deletions AirshipKit/AirshipKit/common/UAUserAPIClient.m
Expand Up @@ -6,6 +6,7 @@
#import "NSJSONSerialization+UAAdditions.h"
#import "UAUser.h"
#import "UAUserData+Internal.h"
#import "NSURLResponse+UAAdditions.h"

@implementation UAUserAPIClient

Expand All @@ -31,16 +32,7 @@ - (void)createUserWithChannelID:(NSString *)channelID


[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData * _Nullable data, NSURLResponse * _Nullable response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}

if (httpResponse.statusCode >= 500 && httpResponse.statusCode <= 599) {
return YES;
}

return NO;
return [response hasRetriableStatus];
} completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down Expand Up @@ -85,16 +77,7 @@ - (void)updateUser:(UAUser *)user
UARequest *request = [self requestToUpdateUser:user payload:payload];

[self.session dataTaskWithRequest:request retryWhere:^BOOL(NSData * _Nullable data, NSURLResponse * _Nullable response) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
httpResponse = (NSHTTPURLResponse *) response;
}

if (httpResponse.statusCode >= 500 && httpResponse.statusCode <= 599) {
return YES;
}

return NO;
return [response hasRetriableStatus];
} completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSHTTPURLResponse *httpResponse = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
Expand Down
1 change: 1 addition & 0 deletions AirshipKit/AirshipKit/ios/AirshipLib.h
Expand Up @@ -3,6 +3,7 @@
#import "NSOperationQueue+UAAdditions.h"
#import "NSString+UALocalizationAdditions.h"
#import "NSString+UAURLEncoding.h"
#import "NSURLResponse+UAAdditions.h"
#import "UAAccountEventTemplate.h"
#import "UAAction+Operators.h"
#import "UAAction.h"
Expand Down
1 change: 1 addition & 0 deletions AirshipKit/AirshipKit/tvos/AirshipLib.h
Expand Up @@ -3,6 +3,7 @@
#import "NSOperationQueue+UAAdditions.h"
#import "NSString+UALocalizationAdditions.h"
#import "NSString+UAURLEncoding.h"
#import "NSURLResponse+UAAdditions.h"
#import "UAAccountEventTemplate.h"
#import "UAAction+Operators.h"
#import "UAAction.h"
Expand Down
1 change: 1 addition & 0 deletions AirshipKit/AirshipKitTests/UAChannelRegistrarTest.m
Expand Up @@ -112,6 +112,7 @@ - (void)tearDown {
[self.mockedRegistrarDelegate stopMocking];
[self.mockedUAConfig stopMocking];
[self.mockedUAPush stopMocking];
[self.mockedDataStore stopMocking];
[self.mockedUAirship stopMocking];

[super tearDown];
Expand Down
6 changes: 5 additions & 1 deletion AirshipKit/AirshipKitTests/UATagGroupsRegistrarTest.m
Expand Up @@ -45,6 +45,10 @@ - (void)setUp {

- (void)tearDown {
[super tearDown];
[self.mockApplication stopMocking];
[self.mockChannelTagGroupsAPIClient stopMocking];
[self.mockNamedUserTagGroupsAPIClient stopMocking];
[self.mockOperationQueue stopMocking];
[self.dataStore removeAll];
}

Expand Down Expand Up @@ -101,7 +105,7 @@ - (void)testUpdateTagGroupsForAnID {
[endBackgroundTaskExpecation fulfill];
}] endBackgroundTask:0];

[self waitForExpectationsWithTimeout:1 handler:nil];
[self waitForExpectationsWithTimeout:2 handler:nil];

[self.mockChannelTagGroupsAPIClient verify];
[self.mockNamedUserTagGroupsAPIClient verify];
Expand Down
4 changes: 2 additions & 2 deletions Podfile.lock
Expand Up @@ -11,7 +11,7 @@ DEPENDENCIES:
- XcodeEdit (~> 2.1)

SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
https://github.com/cocoapods/specs.git:
- KIF
- OCMock
- XcodeEdit
Expand All @@ -23,4 +23,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 47a6023bea81a52ac91c2a6fb7ce53a511daad03

COCOAPODS: 1.5.0
COCOAPODS: 1.5.2

0 comments on commit 56b85ff

Please sign in to comment.