mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 16:30:41 +00:00
Remove explicit reference to _url. Always regenerate when needed.
This commit is contained in:
commit
d5c163397f
1 changed files with 114 additions and 107 deletions
221
Source/NSURL.m
221
Source/NSURL.m
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue