Retry failed browser or node service requests that may have an updated URL in the...
[pithos-macos] / pithos-macos / PithosUtilities.m
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