diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h index 050c508e3141..0a76824f588b 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h @@ -89,6 +89,29 @@ inline void fromRawValue( result.headers.push_back(header); } } + + if (items.find("body") != items.end() && + items.at("body").hasType()) { + result.body = (std::string)items.at("body"); + } + + if (items.find("method") != items.end() && + items.at("method").hasType()) { + result.method = (std::string)items.at("method"); + } + + if (items.find("cache") != items.end() && + items.at("cache").hasType()) { + auto cache = (std::string)items.at("cache"); + if (cache == "reload") { + result.cache = ImageSource::CacheStategy::Reload; + } else if (cache == "force-cache") { + result.cache = ImageSource::CacheStategy::ForceCache; + } else if (cache == "only-if-cached") { + result.cache = ImageSource::CacheStategy::OnlyIfCached; + } + } + return; } diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h index 21abbc547033..88487f94d48c 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h @@ -7,6 +7,7 @@ #import +#import #import #import @@ -44,6 +45,25 @@ inline std::string toString(const facebook::react::ImageResizeMode &value) } } +inline static NSURLRequestCachePolicy NSURLRequestCachePolicyFromImageSource( + const facebook::react::ImageSource &imageSource) +{ + switch (imageSource.cache) { + case facebook::react::ImageSource::CacheStategy::Reload: + return NSURLRequestReloadIgnoringLocalCacheData; + break; + case facebook::react::ImageSource::CacheStategy::ForceCache: + return NSURLRequestReturnCacheDataElseLoad; + break; + case facebook::react::ImageSource::CacheStategy::OnlyIfCached: + return NSURLRequestReturnCacheDataDontLoad; + break; + default: + return NSURLRequestUseProtocolCachePolicy; + break; + } +} + inline static NSURL *NSURLFromImageSource(const facebook::react::ImageSource &imageSource) { // `NSURL` has a history of crashing with bad input, so let's be safe. @@ -102,13 +122,21 @@ inline static NSURLRequest *NSURLRequestFromImageSource(const facebook::react::I NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; - /* - // TODO(shergin): To be implemented. - request.HTTPBody = ...; - request.HTTPMethod = ...; - request.cachePolicy = ...; - request.allHTTPHeaderFields = ...; - */ + NSString *method = @"GET"; + if (!imageSource.method.empty()) { + method = [[NSString alloc] initWithUTF8String:imageSource.method.c_str()].uppercaseString; + } + NSData *body = nil; + if (!imageSource.body.empty()) { + body = [NSData dataWithBytes:imageSource.body.c_str() length:imageSource.body.size()]; + } + NSURLRequestCachePolicy cachePolicy = NSURLRequestCachePolicyFromImageSource(imageSource); + + if ([method isEqualToString:@"GET"] && imageSource.headers.empty() && body == nil && + cachePolicy == NSURLRequestUseProtocolCachePolicy) { + return request; + } + for (const auto &header : imageSource.headers) { NSString *key = [NSString stringWithUTF8String:header.first.c_str()]; NSString *value = [NSString stringWithUTF8String:header.second.c_str()]; @@ -117,5 +145,9 @@ inline static NSURLRequest *NSURLRequestFromImageSource(const facebook::react::I } } - return [request copy]; + request.HTTPBody = body; + request.HTTPMethod = method; + request.cachePolicy = cachePolicy; + + return request; } diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h index 282320fb2c58..18aba9e10b53 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h @@ -18,12 +18,16 @@ namespace facebook::react { class ImageSource { public: enum class Type { Invalid, Remote, Local }; + enum class CacheStategy { Default, Reload, ForceCache, OnlyIfCached }; Type type{}; std::string uri{}; std::string bundle{}; Float scale{3}; Size size{0}; + std::string body{}; + std::string method{}; + CacheStategy cache = CacheStategy::Default; std::vector> headers{}; bool operator==(const ImageSource& rhs) const {