From 6d9d5dce6b6df63e7e44314f25ee2a39b953397d Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Sun, 7 Jul 2013 14:58:17 +0300 Subject: [PATCH] Retry failed browser or node service requests that may have an updated URL in the service catalog For requests that use a URL from the service catalog, if they return status code 401 or 404 or unknown, retry after you update the service catalog and the request URL. --- pithos-apple-common | 2 +- pithos-macos/PithosAccount.m | 2 +- pithos-macos/PithosAccountNode.m | 7 +++++-- pithos-macos/PithosBrowserController.m | 3 ++- pithos-macos/PithosContainerNode.m | 6 ++++-- pithos-macos/PithosObjectNode.m | 3 ++- pithos-macos/PithosSharingAccountsNode.m | 3 ++- pithos-macos/PithosSubdirNode.m | 3 ++- pithos-macos/PithosUtilities.h | 2 ++ pithos-macos/PithosUtilities.m | 23 +++++++++++++++++++++++ 10 files changed, 44 insertions(+), 10 deletions(-) diff --git a/pithos-apple-common b/pithos-apple-common index 8fb25a1..2f6bc43 160000 --- a/pithos-apple-common +++ b/pithos-apple-common @@ -1 +1 @@ -Subproject commit 8fb25a1bf3c5e88def03d59bbae18dfbbc967567 +Subproject commit 2f6bc433e2b453f5f9e56d07115497809416eb13 diff --git a/pithos-macos/PithosAccount.m b/pithos-macos/PithosAccount.m index 7d1b97a..2a0941b 100644 --- a/pithos-macos/PithosAccount.m +++ b/pithos-macos/PithosAccount.m @@ -488,7 +488,7 @@ static NSString *defaultManualURLString = @"https://pithos.okeanos.grnet.gr"; authToken:authToken authUser:authUser ignoreSSLErrors:ignoreSSLErrors - resetNodes:NO]; + resetNodes:YES]; } } diff --git a/pithos-macos/PithosAccountNode.m b/pithos-macos/PithosAccountNode.m index a9d3a18..4b2116d 100644 --- a/pithos-macos/PithosAccountNode.m +++ b/pithos-macos/PithosAccountNode.m @@ -209,8 +209,10 @@ static NSImage *sharedIcon = nil; }); NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest]; + ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities retryWithUpdatedURLRequest:accountRequest + andPithosAccountManager:pithosAccountManager]; [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; + self.accountRequest = newAccountRequest; [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous]; } else { @@ -337,7 +339,8 @@ static NSImage *sharedIcon = nil; @autoreleasepool { NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:request]; + ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[PithosUtilities retryWithUpdatedURLRequest:request + andPithosAccountManager:pithosAccountManager];; [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; if ([request isEqualTo:applyMetadataAccountRequest]) { @synchronized(self) { diff --git a/pithos-macos/PithosBrowserController.m b/pithos-macos/PithosBrowserController.m index a2e8798..54ec9bb 100644 --- a/pithos-macos/PithosBrowserController.m +++ b/pithos-macos/PithosBrowserController.m @@ -1632,7 +1632,8 @@ forDraggedRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column { } NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosRequest *newRequest = (ASIPithosRequest *)[PithosUtilities copyRequest:request]; + ASIPithosRequest *newRequest = (ASIPithosRequest *)[PithosUtilities retryWithUpdatedURLRequest:request + andPithosAccountManager:pithosAccountManager];; [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithBool:NO] forKey:@"unexpectedResponseStatus"]; [[newRequest.userInfo objectForKey:@"networkQueue"] addOperation:[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]]]; diff --git a/pithos-macos/PithosContainerNode.m b/pithos-macos/PithosContainerNode.m index 0ed3a48..bb80e64 100644 --- a/pithos-macos/PithosContainerNode.m +++ b/pithos-macos/PithosContainerNode.m @@ -210,7 +210,8 @@ static NSImage *sharedIcon = nil; }); NSUInteger retries = [[containerRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosContainerRequest *newContainerRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:containerRequest]; + ASIPithosContainerRequest *newContainerRequest = (ASIPithosContainerRequest *)[PithosUtilities retryWithUpdatedURLRequest:containerRequest + andPithosAccountManager:pithosAccountManager]; [(NSMutableDictionary *)(newContainerRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; self.containerRequest = newContainerRequest; [[PithosUtilities prepareRequest:containerRequest priority:[[containerRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous]; @@ -404,7 +405,8 @@ static NSImage *sharedIcon = nil; @autoreleasepool { NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosContainerRequest *newRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:request]; + ASIPithosContainerRequest *newRequest = (ASIPithosContainerRequest *)[PithosUtilities retryWithUpdatedURLRequest:request + andPithosAccountManager:pithosAccountManager]; [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; if ([request isEqualTo:applyMetadataContainerRequest]) { @synchronized(self) { diff --git a/pithos-macos/PithosObjectNode.m b/pithos-macos/PithosObjectNode.m index a49c6bb..ffe8fd1 100644 --- a/pithos-macos/PithosObjectNode.m +++ b/pithos-macos/PithosObjectNode.m @@ -224,7 +224,8 @@ @autoreleasepool { NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:request]; + ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities retryWithUpdatedURLRequest:request + andPithosAccountManager:pithosAccountManager]; [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; if ([request isEqualTo:applyMetadataObjectRequest]) { @synchronized(self) { diff --git a/pithos-macos/PithosSharingAccountsNode.m b/pithos-macos/PithosSharingAccountsNode.m index 68a1f5f..221c19d 100644 --- a/pithos-macos/PithosSharingAccountsNode.m +++ b/pithos-macos/PithosSharingAccountsNode.m @@ -143,7 +143,8 @@ }); NSUInteger retries = [[sharingAccountsRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosRequest *newSharingAccountsRequest = (ASIPithosRequest *)[PithosUtilities copyRequest:sharingAccountsRequest]; + ASIPithosRequest *newSharingAccountsRequest = (ASIPithosRequest *)[PithosUtilities retryWithUpdatedURLRequest:sharingAccountsRequest + andPithosAccountManager:pithosAccountManager];; [(NSMutableDictionary *)(newSharingAccountsRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; self.sharingAccountsRequest = newSharingAccountsRequest; [[PithosUtilities prepareRequest:sharingAccountsRequest priority:[[sharingAccountsRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous]; diff --git a/pithos-macos/PithosSubdirNode.m b/pithos-macos/PithosSubdirNode.m index 7af6a23..6181da7 100644 --- a/pithos-macos/PithosSubdirNode.m +++ b/pithos-macos/PithosSubdirNode.m @@ -241,7 +241,8 @@ static NSImage *sharedIcon = nil; @autoreleasepool { NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { - ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:request]; + ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities retryWithUpdatedURLRequest:request + andPithosAccountManager:pithosAccountManager]; [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; if ([request isEqualTo:applyMetadataObjectRequest]) { @synchronized(self) { diff --git a/pithos-macos/PithosUtilities.h b/pithos-macos/PithosUtilities.h index 70e41ac..96bf289 100644 --- a/pithos-macos/PithosUtilities.h +++ b/pithos-macos/PithosUtilities.h @@ -40,6 +40,7 @@ @class ASIPithosContainerRequest; @class ASIPithosObjectRequest; @class ASIPithosObject; +@class PithosAccount; @interface PithosUtilities : NSObject @@ -164,5 +165,6 @@ + (ASIPithosRequest *)prepareRequest:(ASIPithosRequest *)request; + (ASIPithosRequest *)copyRequest:(ASIPithosRequest *)request; + (void)startAndWaitForRequest:(ASIPithosRequest *)request; ++ (ASIPithosRequest *)retryWithUpdatedURLRequest:(ASIPithosRequest *)request andPithosAccountManager:(PithosAccount *)pithosAccountManager; @end diff --git a/pithos-macos/PithosUtilities.m b/pithos-macos/PithosUtilities.m index 8b42206..6e2aebf 100644 --- a/pithos-macos/PithosUtilities.m +++ b/pithos-macos/PithosUtilities.m @@ -41,6 +41,7 @@ #import "ASIPithosContainerRequest.h" #import "ASIPithosObjectRequest.h" #import "ASIPithosObject.h" +#import "PithosAccount.h" #import "HashMapHash.h" @implementation PithosUtilities @@ -1305,4 +1306,26 @@ [networkQueue addOperations:[NSArray arrayWithObject:[self prepareRequest:request]] waitUntilFinished:YES]; } ++ (ASIPithosRequest *)retryWithUpdatedURLRequest:(ASIPithosRequest *)request andPithosAccountManager:(PithosAccount *)pithosAccountManager { + ASIPithosRequest *newRequest = [PithosUtilities copyRequest:request]; + if (((request.responseStatusCode == 401) || (request.responseStatusCode == 404) || (request.responseStatusCode == 0)) && + request.retryBaseURLString) { + ASIPithosRequest *serviceCatalogRequest = [ASIPithosRequest serviceCatalogRequestWithPithos:pithosAccountManager.pithos]; + [PithosUtilities startAndWaitForRequest:serviceCatalogRequest]; + [pithosAccountManager updateServicesFromServiceCatalogRequest:serviceCatalogRequest]; + + if (newRequest.retryType == ASIPithosRequestTypeStorage) { + NSString *URLPrefix = pithosAccountManager.pithos.storageURLPrefix; + NSString *URLSuffix = [[newRequest.url description] substringFromIndex:[newRequest.retryBaseURLString length]]; + newRequest.url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", URLPrefix, URLSuffix]]; + } else if (newRequest.retryType == ASIPithosRequestTypeUserCatalog) { + NSString *URLPrefix = pithosAccountManager.pithos.userCatalogURL; + NSString *URLSuffix = [[newRequest.url description] substringFromIndex:[newRequest.retryBaseURLString length]]; + newRequest.url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", URLPrefix, URLSuffix]]; + } + } + + return newRequest; +} + @end -- 1.7.10.4