diff --git a/Libraries/Image/RCTImageLoader.h b/Libraries/Image/RCTImageLoader.h index 186a53cd1046b0..4d23a628e733e5 100644 --- a/Libraries/Image/RCTImageLoader.h +++ b/Libraries/Image/RCTImageLoader.h @@ -23,4 +23,6 @@ + (void)loadImageWithTag:(NSString *)tag callback:(void (^)(NSError *error, id /* UIImage or CAAnimation */ image))callback; ++ (BOOL)isSystemImageURI:(NSString *)uri; + @end diff --git a/Libraries/Image/RCTImageLoader.m b/Libraries/Image/RCTImageLoader.m index 948503ccededc6..22b535f0747b92 100644 --- a/Libraries/Image/RCTImageLoader.m +++ b/Libraries/Image/RCTImageLoader.m @@ -156,4 +156,11 @@ + (void)loadImageWithTag:(NSString *)imageTag callback:(void (^)(NSError *error, } } ++ (BOOL)isSystemImageURI:(NSString *)uri +{ + return uri != nil && ( + [uri hasPrefix:@"assets-library"] || + [uri hasPrefix:@"ph://"]); +} + @end diff --git a/Libraries/Network/RCTDataManager.m b/Libraries/Network/RCTDataManager.m index 1d0a793de8e454..f6479548235cd2 100644 --- a/Libraries/Network/RCTDataManager.m +++ b/Libraries/Network/RCTDataManager.m @@ -13,6 +13,7 @@ #import "RCTConvert.h" #import "RCTLog.h" #import "RCTUtils.h" +#import "RCTImageLoader.h" @implementation RCTDataManager @@ -34,8 +35,43 @@ @implementation RCTDataManager NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; request.HTTPMethod = [RCTConvert NSString:query[@"method"]] ?: @"GET"; request.allHTTPHeaderFields = [RCTConvert NSDictionary:query[@"headers"]]; - request.HTTPBody = [RCTConvert NSData:query[@"data"]]; + if (query[@"data"] != [NSNull null]) { + NSDictionary *data = [RCTConvert NSDictionary:query[@"data"]]; + NSData *body = [RCTConvert NSData:data[@"string"]]; + if (body != nil) { + request.HTTPBody = body; + [RCTDataManager sendRequest:request responseSender:responseSender]; + return; + } + NSString *uri = [RCTConvert NSString:data[@"uri"]]; + if (uri != nil) { + if ([RCTImageLoader isSystemImageURI:uri]) { + [RCTImageLoader loadImageWithTag:(NSString *)uri callback:^(NSError *error, UIImage *image) { + if (error) { + RCTLogError(@"Error loading image URI: %@", error); + // We should really circle back to JS here and notify an error/abort on the request. + return; + } + NSData *imageData = UIImageJPEGRepresentation(image, 1.0); + request.HTTPBody = imageData; + [RCTDataManager sendRequest:request responseSender:responseSender]; + }]; + } else { + RCTLogError(@"Cannot resolve URI: %@", uri); + } + return; + } + } + + // There was no data payload, or we couldn't understand it. + [RCTDataManager sendRequest:request responseSender:responseSender]; + } else { + RCTLogError(@"unsupported query type %@", queryType); + } +} + ++ (void)sendRequest:(NSURLRequest *)request responseSender:(RCTResponseSenderBlock)responseSender { // Build data task NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *connectionError) { @@ -71,11 +107,6 @@ @implementation RCTDataManager }]; [task resume]; - - } else { - - RCTLogError(@"unsupported query type %@", queryType); - } } @end diff --git a/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj b/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj index 1dca7fe6de27bf..28bd23c8622a20 100644 --- a/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj +++ b/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj @@ -209,6 +209,7 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/../../React/**", + "$(SRCROOT)/../Image/**", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; @@ -226,6 +227,7 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/../../React/**", + "$(SRCROOT)/../Image/**", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; diff --git a/Libraries/Network/XMLHttpRequest.ios.js b/Libraries/Network/XMLHttpRequest.ios.js index 6c7367c18db725..fca690e5955c6f 100644 --- a/Libraries/Network/XMLHttpRequest.ios.js +++ b/Libraries/Network/XMLHttpRequest.ios.js @@ -20,13 +20,16 @@ var XMLHttpRequestBase = require('XMLHttpRequestBase'); class XMLHttpRequest extends XMLHttpRequestBase { sendImpl(method: ?string, url: ?string, headers: Object, data: any): void { + if (typeof data === 'string') { + data = {string: data}; + } RCTDataManager.queryData( 'http', { - method: method, - url: url, - data: data, - headers: headers, + method, + url, + data, + headers, }, // TODO: Do we need this? is it used anywhere? 'h' + crc32(method + '|' + url + '|' + data),