Remove explicit reference to _url. Always regenerate when needed.

This commit is contained in:
Gregory John Casamento 2020-04-03 17:39:35 -04:00
commit d5c163397f

View file

@ -50,7 +50,6 @@ function may be incorrect
NSString *_password; \ NSString *_password; \
NSString *_path; \ NSString *_path; \
NSNumber *_port; \ NSNumber *_port; \
NSString *_query; \
NSArray *_queryItems; \ NSArray *_queryItems; \
NSString *_scheme; \ NSString *_scheme; \
NSString *_user; \ NSString *_user; \
@ -2326,13 +2325,13 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
@implementation NSURLComponents @implementation NSURLComponents
// Creating URL components... // Creating URL components...
+ (instancetype) componentsWithString:(NSString *)urlString + (instancetype) componentsWithString: (NSString *)urlString
{ {
return [[NSURLComponents alloc] initWithString: urlString]; return [[NSURLComponents alloc] initWithString: urlString];
} }
+ (instancetype) componentsWithURL:(NSURL *)url + (instancetype) componentsWithURL: (NSURL *)url
resolvingAgainstBaseURL:(BOOL)resolve resolvingAgainstBaseURL: (BOOL)resolve
{ {
return [[NSURLComponents alloc] initWithURL: url return [[NSURLComponents alloc] initWithURL: url
resolvingAgainstBaseURL: resolve]; resolvingAgainstBaseURL: resolve];
@ -2357,7 +2356,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
return self; return self;
} }
- (instancetype)initWithString:(NSString *)URLString - (instancetype) initWithString: (NSString *)URLString
{ {
self = [self init]; self = [self init];
if (self != nil) if (self != nil)
@ -2367,13 +2366,14 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
return self; return self;
} }
- (instancetype)initWithURL:(NSURL *)url - (instancetype) initWithURL: (NSURL *)url
resolvingAgainstBaseURL:(BOOL)resolve resolvingAgainstBaseURL: (BOOL)resolve
{ {
NSURL *tempURL = url;
self = [self init]; self = [self init];
if (self != nil) if (self != nil)
{ {
NSURL *tempURL = url;
if (resolve) if (resolve)
{ {
tempURL = [url absoluteURL]; tempURL = [url absoluteURL];
@ -2385,7 +2385,6 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) dealloc - (void) dealloc
{ {
RELEASE(internal->_url);
RELEASE(internal->_fragment); RELEASE(internal->_fragment);
RELEASE(internal->_host); RELEASE(internal->_host);
RELEASE(internal->_password); RELEASE(internal->_password);
@ -2404,16 +2403,55 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
resolvingAgainstBaseURL: NO]; resolvingAgainstBaseURL: NO];
} }
// Regenerate URL when components are changed...
- (NSURL *) _regenerateURL
{
NSURL *u = nil;
if (internal->_dirty == NO)
{
return nil;
}
u = [[NSURL alloc] initWithScheme: internal->_scheme
user: internal->_user
password: internal->_password
host: internal->_host
port: internal->_port
fullPath: internal->_path
parameterString: nil
query: [self query]
fragment: internal->_fragment];
{
// Find ranges
NSString *urlString = [u absoluteString];
#define URL_COMPONENT_RANGE(part) \
(part ? [urlString rangeOfString:part] : NSMakeRange(NSNotFound, 0))
internal->_rangeOfFragment = URL_COMPONENT_RANGE(internal->_fragment);
internal->_rangeOfHost = URL_COMPONENT_RANGE(internal->_host);
internal->_rangeOfPassword = URL_COMPONENT_RANGE(internal->_password);
internal->_rangeOfPath = URL_COMPONENT_RANGE(internal->_path);
internal->_rangeOfPort = URL_COMPONENT_RANGE([internal->_port stringValue]);
internal->_rangeOfQuery = URL_COMPONENT_RANGE([self query]);
internal->_rangeOfScheme = URL_COMPONENT_RANGE(internal->_scheme);
internal->_rangeOfUser = URL_COMPONENT_RANGE(internal->_user);
#undef URL_COMPONENT_RANGE
}
internal->_dirty = NO;
return u;
}
// Getting the URL // Getting the URL
- (NSString *) string - (NSString *) string
{ {
return [[self _regenerateURL] absoluteString]; return [[self URL] absoluteString];
} }
- (void) setString: (NSString *)urlString - (void) setString: (NSString *)urlString
{ {
NSURL *url = [NSURL URLWithString: urlString]; NSURL *url = [NSURL URLWithString: urlString];
[self setURL : url]; [self setURL: url];
} }
- (NSURL *) URL - (NSURL *) URL
@ -2423,65 +2461,22 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setURL: (NSURL *)url - (void) setURL: (NSURL *)url
{ {
// components... // Set all the components...
ASSIGNCOPY(internal->_fragment, [url fragment]); [self setScheme: [url scheme]];
ASSIGNCOPY(internal->_host, [url host]); [self setHost: [url host]];
ASSIGNCOPY(internal->_password, [url password]); [self setPort: [url port]];
ASSIGNCOPY(internal->_path, [url path]); [self setUser: [url user]];
ASSIGNCOPY(internal->_port, [url port]); [self setPassword: [url password]];
ASSIGNCOPY(internal->_query, [url query]); [self setPath: [url path]];
ASSIGNCOPY(internal->_scheme, [url scheme]); [self setQuery: [url query]];
ASSIGNCOPY(internal->_user, [url user]); [self setFragment: [url fragment]];
_dirty = YES;
} }
- (NSURL *)URLRelativeToURL: (NSURL *)baseURL - (NSURL *) URLRelativeToURL: (NSURL *)baseURL
{ {
return nil; return nil;
} }
// Regenerate URL when components are changed...
- (NSURL *) _regenerateURL
{
if (_dirty == NO)
{
return nil;
}
else
{
NSURL *u;
u = [[NSURL alloc] initWithScheme: internal->_scheme
user: internal->_user
password: internal->_password
host: internal->_host
port: internal->_port
fullPath: internal->_path
parameterString: nil
query: [self query]
fragment: internal->_fragment];
{
// Find ranges
NSString *urlString = [u absoluteString];
#define URL_COMPONENT_RANGE(part) \
(part ? [urlString rangeOfString:part] : NSMakeRange(NSNotFound, 0))
internal->_rangeOfFragment = URL_COMPONENT_RANGE(internal->_fragment);
internal->_rangeOfHost = URL_COMPONENT_RANGE(internal->_host);
internal->_rangeOfPassword = URL_COMPONENT_RANGE(internal->_password);
internal->_rangeOfPath = URL_COMPONENT_RANGE(internal->_path);
internal->_rangeOfPort = URL_COMPONENT_RANGE([internal->_port stringValue]);
internal->_rangeOfQuery = URL_COMPONENT_RANGE(internal->_query);
internal->_rangeOfScheme = URL_COMPONENT_RANGE(internal->_scheme);
internal->_rangeOfUser = URL_COMPONENT_RANGE(internal->_user);
#undef URL_COMPONENT_RANGE
}
_dirty = NO;
return u;
}
}
// Accessing Components in Native Format // Accessing Components in Native Format
- (NSString *) fragment - (NSString *) fragment
{ {
@ -2491,7 +2486,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setFragment: (NSString *)fragment - (void) setFragment: (NSString *)fragment
{ {
ASSIGNCOPY(internal->_fragment, fragment); ASSIGNCOPY(internal->_fragment, fragment);
_dirty = YES; internal->_dirty = YES;
} }
- (NSString *) host - (NSString *) host
@ -2502,7 +2497,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setHost: (NSString *)host - (void) setHost: (NSString *)host
{ {
ASSIGNCOPY(internal->_host, host); ASSIGNCOPY(internal->_host, host);
_dirty = YES; internal->_dirty = YES;
} }
- (NSString *) password - (NSString *) password
@ -2513,7 +2508,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPassword: (NSString *)password - (void) setPassword: (NSString *)password
{ {
ASSIGNCOPY(internal->_password, password); ASSIGNCOPY(internal->_password, password);
_dirty = YES; internal->_dirty = YES;
} }
- (NSString *) path - (NSString *) path
@ -2524,7 +2519,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPath: (NSString *)path - (void) setPath: (NSString *)path
{ {
ASSIGNCOPY(internal->_path, path); ASSIGNCOPY(internal->_path, path);
_dirty = YES; internal->_dirty = YES;
} }
- (NSNumber *) port - (NSNumber *) port
@ -2535,17 +2530,31 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPort: (NSNumber *)port - (void) setPort: (NSNumber *)port
{ {
ASSIGNCOPY(internal->_port, port); ASSIGNCOPY(internal->_port, port);
_dirty = YES; internal->_dirty = YES;
} }
- (NSString *) query - (NSString *) query
{ {
return internal->_query; NSString *query = @"";
NSEnumerator *en = [internal->_queryItems objectEnumerator];
NSURLQueryItem *item = nil;
while ((item = (NSURLQueryItem *)[en nextObject]) != nil)
{
NSString *name = [item name];
NSString *value = [item value];
NSString *itemString = [NSString stringWithFormat: @"%@=%@",name,value];
if ([query length] > 0)
{
query = [query stringByAppendingString: @"&"];
}
query = [query stringByAppendingString: itemString];
}
return query;
} }
- (void) setQuery: (NSString *)query - (void) setQuery: (NSString *)query
{ {
ASSIGNCOPY(internal->_query, query);
if (query != nil) if (query != nil)
{ {
NSMutableArray *result = [NSMutableArray arrayWithCapacity: 5]; NSMutableArray *result = [NSMutableArray arrayWithCapacity: 5];
@ -2564,6 +2573,10 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
} }
[self setQueryItems: result]; [self setQueryItems: result];
} }
else
{
[self setQueryItems: nil];
}
} }
- (NSArray *) queryItems - (NSArray *) queryItems
@ -2573,25 +2586,9 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setQueryItems: (NSArray *)queryItems - (void) setQueryItems: (NSArray *)queryItems
{ {
NSString *query = @"";
NSEnumerator *en = [queryItems objectEnumerator];
NSURLQueryItem *item = nil;
while ((item = (NSURLQueryItem *)[en nextObject]) != nil)
{
NSString *name = [item name];
NSString *value = [[item value] _stringByAddingPercentEscapesForQuery];
NSString *itemString = [NSString stringWithFormat: @"%@=%@",name,value];
query = [query stringByAppendingString: itemString];
if (item != [queryItems lastObject])
{
query = [query stringByAppendingString: @"&"];
}
}
ASSIGNCOPY(internal->_query, query); // add query string...
ASSIGNCOPY(internal->_queryItems, queryItems); ASSIGNCOPY(internal->_queryItems, queryItems);
_dirty = YES; internal->_dirty = YES;
} }
- (NSString *) scheme - (NSString *) scheme
@ -2602,7 +2599,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setScheme: (NSString *)scheme - (void) setScheme: (NSString *)scheme
{ {
ASSIGNCOPY(internal->_scheme, scheme); ASSIGNCOPY(internal->_scheme, scheme);
_dirty = YES; internal->_dirty = YES;
} }
- (NSString *) user - (NSString *) user
@ -2613,7 +2610,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setUser: (NSString *)user - (void) setUser: (NSString *)user
{ {
ASSIGNCOPY(internal->_user, user); ASSIGNCOPY(internal->_user, user);
_dirty = YES; internal->_dirty = YES;
} }
// Accessing Components in PercentEncoded Format // Accessing Components in PercentEncoded Format
@ -2625,8 +2622,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPercentEncodedFragment: (NSString *)fragment - (void) setPercentEncodedFragment: (NSString *)fragment
{ {
ASSIGNCOPY(internal->_fragment, [fragment stringByRemovingPercentEncoding]); [self setFragment: [fragment stringByRemovingPercentEncoding]];
_dirty = YES;
} }
- (NSString *) percentEncodedHost - (NSString *) percentEncodedHost
@ -2637,8 +2633,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPercentEncodedHost: (NSString *)host - (void) setPercentEncodedHost: (NSString *)host
{ {
ASSIGNCOPY(internal->_host, [host stringByRemovingPercentEncoding]); [self setHost: [host stringByRemovingPercentEncoding]];
_dirty = YES;
} }
- (NSString *) percentEncodedPassword - (NSString *) percentEncodedPassword
@ -2649,8 +2644,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPercentEncodedPassword: (NSString *)password - (void) setPercentEncodedPassword: (NSString *)password
{ {
ASSIGNCOPY(internal->_password, [password stringByRemovingPercentEncoding]); [self setPassword: [password stringByRemovingPercentEncoding]];
_dirty = YES;
} }
- (NSString *) percentEncodedPath - (NSString *) percentEncodedPath
@ -2661,41 +2655,55 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPercentEncodedPath: (NSString *)path - (void) setPercentEncodedPath: (NSString *)path
{ {
ASSIGNCOPY(internal->_path, [path stringByRemovingPercentEncoding]); [self setPath: [path stringByRemovingPercentEncoding]];
_dirty = YES;
} }
- (NSString *) percentEncodedQuery - (NSString *) percentEncodedQuery
{ {
return internal->_query; NSString *query = @"";
NSEnumerator *en = [internal->_queryItems objectEnumerator];
NSURLQueryItem *item = nil;
while ((item = (NSURLQueryItem *)[en nextObject]) != nil)
{
NSString *name = [[item name] _stringByAddingPercentEscapesForQuery];
NSString *value = [[item value] _stringByAddingPercentEscapesForQuery];
NSString *itemString = [NSString stringWithFormat: @"%@=%@",name,value];
if ([query length] > 0)
{
query = [query stringByAppendingString: @"&"];
}
query = [query stringByAppendingString: itemString];
}
return query;
} }
- (void) setPercentEncodedQuery: (NSString *)query - (void) setPercentEncodedQuery: (NSString *)query
{ {
ASSIGNCOPY(internal->_query, [query stringByRemovingPercentEncoding]); [self setQuery: [query stringByRemovingPercentEncoding]];
_dirty = YES;
} }
- (NSArray *) percentEncodedQueryItems - (NSArray *) percentEncodedQueryItems
{ {
// FIXME
return internal->_queryItems; return internal->_queryItems;
} }
- (void) setPercentEncodedQueryItems: (NSArray *)queryItems - (void) setPercentEncodedQueryItems: (NSArray *)queryItems
{ {
// FIXME
[self setQueryItems: queryItems]; [self setQueryItems: queryItems];
} }
- (NSString *) percentEncodedScheme - (NSString *) percentEncodedScheme
{ {
return [internal->_path stringByAddingPercentEncodingWithAllowedCharacters: return [internal->_scheme stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLPathAllowedCharacterSet]]; [NSCharacterSet URLPathAllowedCharacterSet]];
} }
- (void) setPercentEncodedScheme: (NSString *)scheme - (void) setPercentEncodedScheme: (NSString *)scheme
{ {
ASSIGNCOPY(internal->_scheme, scheme); [self setScheme: [scheme stringByRemovingPercentEncoding]];
_dirty = YES;
} }
- (NSString *) percentEncodedUser - (NSString *) percentEncodedUser
@ -2706,8 +2714,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (void) setPercentEncodedUser: (NSString *)user - (void) setPercentEncodedUser: (NSString *)user
{ {
ASSIGNCOPY(internal->_user, [user stringByRemovingPercentEncoding]); [self setUser: [user stringByRemovingPercentEncoding]];
_dirty = YES;
} }
// Locating components of the URL string representation // Locating components of the URL string representation