diff --git a/Libraries/Image/RCTImageLoader.m b/Libraries/Image/RCTImageLoader.m index fe83fdbb5db1d4..8349a2e2b1a162 100644 --- a/Libraries/Image/RCTImageLoader.m +++ b/Libraries/Image/RCTImageLoader.m @@ -371,7 +371,24 @@ - (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag // Check for cached response before reloading // TODO: move URL cache out of RCTImageLoader into its own module NSCachedURLResponse *cachedResponse = [_URLCache cachedResponseForRequest:request]; - if (cachedResponse) { + + while (cachedResponse) { + if ([cachedResponse.response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)cachedResponse.response; + if (httpResponse.statusCode == 301 || httpResponse.statusCode == 302) { + NSString *location = httpResponse.allHeaderFields[@"Location"]; + if (location == nil) { + completionHandler(RCTErrorWithMessage(@"Image redirect without location"), nil); + return; + } + + NSURL *redirectURL = [NSURL URLWithString: location]; + request = [NSURLRequest requestWithURL: redirectURL]; + cachedResponse = [_URLCache cachedResponseForRequest:request]; + continue; + } + } + processResponse(cachedResponse.response, cachedResponse.data, nil); return; }