diff --git a/Libraries/Image/RCTImageLoader.mm b/Libraries/Image/RCTImageLoader.mm index 39e33ecdd285..85a1fbae64c4 100644 --- a/Libraries/Image/RCTImageLoader.mm +++ b/Libraries/Image/RCTImageLoader.mm @@ -56,6 +56,15 @@ static uint64_t monotonicTimeGetCurrentNanoseconds(void) return (mach_absolute_time() * tb_info.numer) / tb_info.denom; } +static NSError* addResponseHeadersToError(NSError* originalError, NSHTTPURLResponse* response) { + NSMutableDictionary* _userInfo = (NSMutableDictionary*)originalError.userInfo.mutableCopy; + _userInfo[@"httpStatusCode"] = [NSNumber numberWithInt:response.statusCode]; + _userInfo[@"httpResponseHeaders"] = response.allHeaderFields; + NSError *error = [NSError errorWithDomain:originalError.domain code:originalError.code userInfo:_userInfo]; + + return error; +} + @interface RCTImageLoader() @end @@ -523,6 +532,10 @@ - (RCTImageURLLoaderRequest *)_loadImageOrDataWithURLRequest:(NSURLRequest *)req } }); } else if (!std::atomic_load(cancelled.get())) { + if (response && error && [response isKindOfClass: [NSHTTPURLResponse class]]) { + NSHTTPURLResponse* _httpResp = (NSHTTPURLResponse*)response; + error = addResponseHeadersToError(error, _httpResp); + } completionBlock(error, imageOrData, imageMetadata, cacheResult, response); } }; diff --git a/Libraries/Image/RCTImageView.mm b/Libraries/Image/RCTImageView.mm index c807372d1938..410f21b73aa7 100644 --- a/Libraries/Image/RCTImageView.mm +++ b/Libraries/Image/RCTImageView.mm @@ -378,7 +378,7 @@ - (void)imageLoaderLoadedImage:(UIImage *)loadedImage error:(NSError *)error for }); if (_onError) { - _onError(@{ @"error": error.localizedDescription }); + _onError(@{ @"error": error.localizedDescription, @"responseCode": (error.userInfo[@"httpStatusCode"]?: [NSNull null]), @"httpResponseHeaders": (error.userInfo[@"httpResponseHeaders"] ?: [NSNull null]) }); } if (_onLoadEnd) { _onLoadEnd(nil);