Retry failed browser or node service requests that may have an updated URL in the...
authorMiltiadis Vasilakis <mvasilak@gmail.com>
Sun, 7 Jul 2013 11:58:17 +0000 (14:58 +0300)
committerMiltiadis Vasilakis <mvasilak@gmail.com>
Sun, 7 Jul 2013 13:53:15 +0000 (16:53 +0300)
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
pithos-macos/PithosAccount.m
pithos-macos/PithosAccountNode.m
pithos-macos/PithosBrowserController.m
pithos-macos/PithosContainerNode.m
pithos-macos/PithosObjectNode.m
pithos-macos/PithosSharingAccountsNode.m
pithos-macos/PithosSubdirNode.m
pithos-macos/PithosUtilities.h
pithos-macos/PithosUtilities.m

index 8fb25a1..2f6bc43 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 8fb25a1bf3c5e88def03d59bbae18dfbbc967567
+Subproject commit 2f6bc433e2b453f5f9e56d07115497809416eb13
index 7d1b97a..2a0941b 100644 (file)
@@ -488,7 +488,7 @@ static NSString *defaultManualURLString = @"https://pithos.okeanos.grnet.gr";
                             authToken:authToken
                              authUser:authUser
                       ignoreSSLErrors:ignoreSSLErrors
-                           resetNodes:NO];
+                           resetNodes:YES];
     }
 }
 
index a9d3a18..4b2116d 100644 (file)
@@ -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) {
index a2e8798..54ec9bb 100644 (file)
@@ -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]]];
index 0ed3a48..bb80e64 100644 (file)
@@ -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) {
index a49c6bb..ffe8fd1 100644 (file)
     @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) {
index 68a1f5f..221c19d 100644 (file)
         });
         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];
index 7af6a23..6181da7 100644 (file)
@@ -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) {
index 70e41ac..96bf289 100644 (file)
@@ -40,6 +40,7 @@
 @class ASIPithosContainerRequest;
 @class ASIPithosObjectRequest;
 @class ASIPithosObject;
+@class PithosAccount;
 
 @interface PithosUtilities : NSObject
 
 + (ASIPithosRequest *)prepareRequest:(ASIPithosRequest *)request;
 + (ASIPithosRequest *)copyRequest:(ASIPithosRequest *)request;
 + (void)startAndWaitForRequest:(ASIPithosRequest *)request;
++ (ASIPithosRequest *)retryWithUpdatedURLRequest:(ASIPithosRequest *)request andPithosAccountManager:(PithosAccount *)pithosAccountManager;
 
 @end
index 8b42206..6e2aebf 100644 (file)
@@ -41,6 +41,7 @@
 #import "ASIPithosContainerRequest.h"
 #import "ASIPithosObjectRequest.h"
 #import "ASIPithosObject.h"
+#import "PithosAccount.h"
 #import "HashMapHash.h"
 
 @implementation PithosUtilities
     [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