Merge branch 'fix-nsurlcomponents' of github.com:gnustep/libs-base into fix-nsurlcomponents

This commit is contained in:
Gregory John Casamento 2020-04-04 12:15:24 -04:00
commit cf13a7c21b

View file

@ -2648,35 +2648,68 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
return query; return query;
} }
- (void) setQuery: (NSString *)query - (void) _setQuery: (NSString *)query fromPercentEncodedString: (BOOL)encoded
{ {
if (query != nil) /* Parse according to https://developer.apple.com/documentation/foundation/nsurlcomponents/1407752-queryitems?language=objc
*/
if (nil == query)
{ {
NSMutableArray *result = [NSMutableArray arrayWithCapacity: 5]; [self setQueryItems: nil];
NSArray *items = [query componentsSeparatedByString: @"&"]; }
NSEnumerator *en = [items objectEnumerator]; else
id item = nil; {
NSMutableArray *result = [NSMutableArray arrayWithCapacity: 5];
NSArray *items = [query componentsSeparatedByString: @"&"];
NSEnumerator *en = [items objectEnumerator];
id item = nil;
while ((item = [en nextObject]) != nil) while ((item = [en nextObject]) != nil)
{ {
NSArray *query = [item componentsSeparatedByString: @"="]; NSURLQueryItem *qitem;
NSString *name = [query objectAtIndex: 0]; NSString *name;
NSString *value = [query objectAtIndex: 1]; NSString *value;
NSURLQueryItem *qitem = [NSURLQueryItem queryItemWithName: name
value: value]; if ([item length] == 0)
{
name = @"";
value = nil;
}
else
{
NSRange r = [item rangeOfString: @"="];
if (0 == r.length)
{
/* No '=' found in query item. */
name = item;
value = nil;
}
else
{
name = [item substringToIndex: r.location];
value = [item substringFromIndex: NSMaxRange(r)];
}
}
if (encoded)
{
name = [name stringByRemovingPercentEncoding];
value = [value stringByRemovingPercentEncoding];
}
qitem = [NSURLQueryItem queryItemWithName: name value: value];
[result addObject: qitem]; [result addObject: qitem];
} }
[self setQueryItems: result]; [self setQueryItems: result];
} }
else }
{
[self setQueryItems: nil]; - (void) setQuery: (NSString *)query
} {
[self _setQuery: query fromPercentEncodedString: NO];
} }
- (NSArray *) queryItems - (NSArray *) queryItems
{ {
return internal->_queryItems; return AUTORELEASE(RETAIN(internal->_queryItems));
} }
- (void) setQueryItems: (NSArray *)queryItems - (void) setQueryItems: (NSArray *)queryItems
@ -2754,56 +2787,97 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
- (NSString *) percentEncodedQuery - (NSString *) percentEncodedQuery
{ {
NSString *query = @""; NSString *result = nil;
NSEnumerator *en = [[self percentEncodedQueryItems] objectEnumerator];
NSURLQueryItem *item = nil;
while ((item = (NSURLQueryItem *)[en nextObject]) != nil) if (internal->_queryItems != nil)
{ {
NSString *name = [item name]; NSMutableString *query = nil;
NSString *value = [item value]; NSURLQueryItem *item = nil;
NSString *itemString = [NSString stringWithFormat: @"%@=%@",name,value]; NSEnumerator *en;
if ([query length] > 0)
{ en = [[self percentEncodedQueryItems] objectEnumerator];
query = [query stringByAppendingString: @"&"]; while ((item = (NSURLQueryItem *)[en nextObject]) != nil)
} {
query = [query stringByAppendingString: itemString]; NSString *name = [item name];
NSString *value = [item value];
if (nil == query)
{
query = [[NSMutableString alloc] initWithCapacity: 1000];
}
else
{
[query appendString: @"&"];
}
[query appendString: name];
if (value != nil)
{
[query appendString: @"="];
[query appendString: value];
}
}
result = AUTORELEASE([query copy]);
RELEASE(query);
} }
return query; return result;
} }
- (void) setPercentEncodedQuery: (NSString *)query - (void) setPercentEncodedQuery: (NSString *)query
{ {
[self setQuery: [query stringByRemovingPercentEncoding]]; [self _setQuery: query fromPercentEncodedString: YES];
} }
- (NSArray *) percentEncodedQueryItems - (NSArray *) percentEncodedQueryItems
{ {
NSMutableArray *items = [NSMutableArray arrayWithCapacity: [internal->_queryItems count]]; NSArray *result = nil;
NSEnumerator *en = [internal->_queryItems objectEnumerator];
NSURLQueryItem *i = nil;
while((i = [en nextObject]) != nil) if (internal->_queryItems != nil)
{ {
NSURLQueryItem *ni = [NSURLQueryItem queryItemWithName: [[i name] _stringByAddingPercentEscapesForQuery] NSMutableArray *items;
value: [[i value] _stringByAddingPercentEscapesForQuery]]; NSEnumerator *en = [internal->_queryItems objectEnumerator];
[items addObject: ni]; NSURLQueryItem *i = nil;
}
return items; items = [[NSMutableArray alloc]
initWithCapacity: [internal->_queryItems count]];
while ((i = [en nextObject]) != nil)
{
NSURLQueryItem *ni;
NSString *name = [i name];
NSString *value = [i value];
name = [name _stringByAddingPercentEscapesForQuery];
value = [value _stringByAddingPercentEscapesForQuery];
ni = [NSURLQueryItem queryItemWithName: name
value: name];
[items addObject: ni];
}
result = AUTORELEASE([items copy]);
RELEASE(items);
}
return result;
} }
- (void) setPercentEncodedQueryItems: (NSArray *)queryItems - (void) setPercentEncodedQueryItems: (NSArray *)queryItems
{ {
NSMutableArray *items = [NSMutableArray arrayWithCapacity: [queryItems count]]; NSMutableArray *items = nil;
NSEnumerator *en = [queryItems objectEnumerator];
NSURLQueryItem *i = nil;
while((i = [en nextObject]) != nil) if (queryItems != nil)
{ {
NSURLQueryItem *ni = [NSURLQueryItem queryItemWithName: [[i name] stringByRemovingPercentEncoding] NSEnumerator *en = [queryItems objectEnumerator];
value: [[i value] stringByRemovingPercentEncoding]]; NSURLQueryItem *i = nil;
[items addObject: ni];
items = [NSMutableArray arrayWithCapacity: [queryItems count]];
while ((i = [en nextObject]) != nil)
{
NSString *name;
NSString *value;
NSURLQueryItem *ni;
name = [[i name] stringByRemovingPercentEncoding];
value = [[i value] stringByRemovingPercentEncoding];
ni = [NSURLQueryItem queryItemWithName: name value: value];
[items addObject: ni];
}
} }
[self setQueryItems: items]; [self setQueryItems: items];