Fabric: Fixed image URLs parsing

Summary:
@public
It's a basically reimplementation of `+[RCTConvert NSURL:]`.

Reviewed By: mdvacca

Differential Revision: D9146850

fbshipit-source-id: 57ecac1eb35b57b0d417b599371bd0c4a3988116
This commit is contained in:
Valentin Shergin 2018-08-03 07:50:29 -07:00 коммит произвёл Facebook Github Bot
Родитель a9792ac4c8
Коммит 50b80a9ef8
1 изменённых файлов: 51 добавлений и 8 удалений

Просмотреть файл

@ -32,8 +32,9 @@ inline std::string toString(const ImageResizeMode &value) {
}
}
inline static NSURLRequest *NSURLRequestFromImageSource(const ImageSource &imageSource) {
inline static NSURL *NSURLFromImageSource(const ImageSource &imageSource) {
// `NSURL` has a history of crashing with bad input, so let's be safe.
@try {
NSString *urlString = [NSString stringWithCString:imageSource.uri.c_str()
encoding:NSASCIIStringEncoding];
@ -45,6 +46,48 @@ inline static NSURLRequest *NSURLRequestFromImageSource(const ImageSource &image
NSURL *url = [[NSURL alloc] initWithString:urlString];
if (url.scheme) {
// Well-formed absolute URL.
return url;
}
if ([urlString rangeOfString:@":"].location != NSNotFound) {
// The URL has a scheme.
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
url = [NSURL URLWithString:urlString];
return url;
}
// Assume that it's a local path.
urlString = [urlString stringByRemovingPercentEncoding];
if ([urlString hasPrefix:@"~"]) {
// Path is inside user directory.
urlString = [urlString stringByExpandingTildeInPath];
} else {
if (![urlString isAbsolutePath]) {
// Assume it's a resource path.
urlString = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:urlString];
}
}
url = [NSURL fileURLWithPath:urlString];
return url;
}
@catch (__unused NSException *exception) {
return nil;
}
}
inline static NSURLRequest *NSURLRequestFromImageSource(const ImageSource &imageSource) {
NSURL *url = NSURLFromImageSource(imageSource);
if (!url) {
RCTLogError(@"URI parsing error.");
return nil;
}
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
/*