mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 16:30:41 +00:00
Remove custom code for percent escaping and replace it with standard code using
custom charactersets.
This commit is contained in:
parent
225de7f9b3
commit
47ce8d3da7
1 changed files with 47 additions and 144 deletions
191
Source/NSURL.m
191
Source/NSURL.m
|
@ -68,6 +68,7 @@ function may be incorrect
|
||||||
#import "common.h"
|
#import "common.h"
|
||||||
#define EXPOSE_NSURL_IVARS 1
|
#define EXPOSE_NSURL_IVARS 1
|
||||||
#import "Foundation/NSArray.h"
|
#import "Foundation/NSArray.h"
|
||||||
|
#import "Foundation/NSAutoreleasePool.h"
|
||||||
#import "Foundation/NSCoder.h"
|
#import "Foundation/NSCoder.h"
|
||||||
#import "Foundation/NSData.h"
|
#import "Foundation/NSData.h"
|
||||||
#import "Foundation/NSDictionary.h"
|
#import "Foundation/NSDictionary.h"
|
||||||
|
@ -89,138 +90,6 @@ function may be incorrect
|
||||||
NSString * const NSURLErrorDomain = @"NSURLErrorDomain";
|
NSString * const NSURLErrorDomain = @"NSURLErrorDomain";
|
||||||
NSString * const NSErrorFailingURLStringKey = @"NSErrorFailingURLStringKey";
|
NSString * const NSErrorFailingURLStringKey = @"NSErrorFailingURLStringKey";
|
||||||
|
|
||||||
@interface NSString (NSURLPrivate)
|
|
||||||
- (NSString*) _stringByAddingPercentEscapes;
|
|
||||||
- (NSString*) _stringByAddingPercentEscapesForQuery;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation NSString (NSURLPrivate)
|
|
||||||
|
|
||||||
/* Like the normal percent escape method, but with additional characters
|
|
||||||
* escaped (for use by file scheme URLs).
|
|
||||||
*/
|
|
||||||
- (NSString*) _stringByAddingPercentEscapes
|
|
||||||
{
|
|
||||||
NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding];
|
|
||||||
NSString *s = nil;
|
|
||||||
|
|
||||||
if (data != nil)
|
|
||||||
{
|
|
||||||
unsigned char *src = (unsigned char*)[data bytes];
|
|
||||||
unsigned int slen = [data length];
|
|
||||||
unsigned char *dst;
|
|
||||||
unsigned int spos = 0;
|
|
||||||
unsigned int dpos = 0;
|
|
||||||
|
|
||||||
dst = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), slen * 3);
|
|
||||||
while (spos < slen)
|
|
||||||
{
|
|
||||||
unsigned char c = src[spos++];
|
|
||||||
unsigned int hi;
|
|
||||||
unsigned int lo;
|
|
||||||
|
|
||||||
if (c <= 32
|
|
||||||
|| c > 126
|
|
||||||
|| c == 34
|
|
||||||
|| c == 35
|
|
||||||
|| c == 37
|
|
||||||
|| c == 59
|
|
||||||
|| c == 60
|
|
||||||
|| c == 62
|
|
||||||
|| c == 63
|
|
||||||
|| c == 91
|
|
||||||
|| c == 92
|
|
||||||
|| c == 93
|
|
||||||
|| c == 94
|
|
||||||
|| c == 96
|
|
||||||
|| c == 123
|
|
||||||
|| c == 124
|
|
||||||
|| c == 125)
|
|
||||||
{
|
|
||||||
dst[dpos++] = '%';
|
|
||||||
hi = (c & 0xf0) >> 4;
|
|
||||||
dst[dpos++] = (hi > 9) ? 'A' + hi - 10 : '0' + hi;
|
|
||||||
lo = (c & 0x0f);
|
|
||||||
dst[dpos++] = (lo > 9) ? 'A' + lo - 10 : '0' + lo;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dst[dpos++] = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s = [[NSString alloc] initWithBytes: dst
|
|
||||||
length: dpos
|
|
||||||
encoding: NSASCIIStringEncoding];
|
|
||||||
NSZoneFree(NSDefaultMallocZone(), dst);
|
|
||||||
IF_NO_GC([s autorelease];)
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode query
|
|
||||||
*/
|
|
||||||
- (NSString*) _stringByAddingPercentEscapesForQuery
|
|
||||||
{
|
|
||||||
NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding];
|
|
||||||
NSString *s = nil;
|
|
||||||
|
|
||||||
if (data != nil)
|
|
||||||
{
|
|
||||||
unsigned char *src = (unsigned char*)[data bytes];
|
|
||||||
unsigned int slen = [data length];
|
|
||||||
unsigned char *dst;
|
|
||||||
unsigned int spos = 0;
|
|
||||||
unsigned int dpos = 0;
|
|
||||||
|
|
||||||
dst = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), slen * 3);
|
|
||||||
while (spos < slen)
|
|
||||||
{
|
|
||||||
unsigned char c = src[spos++];
|
|
||||||
unsigned int hi;
|
|
||||||
unsigned int lo;
|
|
||||||
|
|
||||||
if (c <= 32
|
|
||||||
|| c > 126
|
|
||||||
|| c == 34
|
|
||||||
|| c == 35
|
|
||||||
|| c == 37
|
|
||||||
|| c == 38
|
|
||||||
|| c == 59
|
|
||||||
|| c == 60
|
|
||||||
|| c == 61
|
|
||||||
|| c == 62
|
|
||||||
|| c == 91
|
|
||||||
|| c == 92
|
|
||||||
|| c == 93
|
|
||||||
|| c == 94
|
|
||||||
|| c == 96
|
|
||||||
|| c == 123
|
|
||||||
|| c == 124
|
|
||||||
|| c == 125)
|
|
||||||
{
|
|
||||||
dst[dpos++] = '%';
|
|
||||||
hi = (c & 0xf0) >> 4;
|
|
||||||
dst[dpos++] = (hi > 9) ? 'A' + hi - 10 : '0' + hi;
|
|
||||||
lo = (c & 0x0f);
|
|
||||||
dst[dpos++] = (lo > 9) ? 'A' + lo - 10 : '0' + lo;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dst[dpos++] = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s = [[NSString alloc] initWithBytes: dst
|
|
||||||
length: dpos
|
|
||||||
encoding: NSASCIIStringEncoding];
|
|
||||||
NSZoneFree(NSDefaultMallocZone(), dst);
|
|
||||||
IF_NO_GC([s autorelease];)
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface NSURL (GSPrivate)
|
@interface NSURL (GSPrivate)
|
||||||
- (NSURL*) _URLBySettingPath: (NSString*)newPath;
|
- (NSURL*) _URLBySettingPath: (NSString*)newPath;
|
||||||
@end
|
@end
|
||||||
|
@ -707,6 +576,7 @@ static char *unescape(const char *from, char * to)
|
||||||
|
|
||||||
@implementation NSURL
|
@implementation NSURL
|
||||||
|
|
||||||
|
static NSCharacterSet *fileCharSet = nil;
|
||||||
static NSUInteger urlAlign;
|
static NSUInteger urlAlign;
|
||||||
|
|
||||||
+ (id) fileURLWithPath: (NSString*)aPath
|
+ (id) fileURLWithPath: (NSString*)aPath
|
||||||
|
@ -732,6 +602,8 @@ static NSUInteger urlAlign;
|
||||||
NSGetSizeAndAlignment(@encode(parsedURL), &urlAlign, 0);
|
NSGetSizeAndAlignment(@encode(parsedURL), &urlAlign, 0);
|
||||||
clientsLock = [NSLock new];
|
clientsLock = [NSLock new];
|
||||||
[[NSObject leakAt: &clientsLock] release];
|
[[NSObject leakAt: &clientsLock] release];
|
||||||
|
ASSIGN(fileCharSet, [NSCharacterSet characterSetWithCharactersInString:
|
||||||
|
@"!$&'()*+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -832,7 +704,8 @@ static NSUInteger urlAlign;
|
||||||
|
|
||||||
if ([aScheme isEqualToString: @"file"])
|
if ([aScheme isEqualToString: @"file"])
|
||||||
{
|
{
|
||||||
aPath = [aPath _stringByAddingPercentEscapes];
|
aPath = [aPath stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
|
fileCharSet];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2325,6 +2198,30 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
|
|
||||||
@implementation NSURLComponents
|
@implementation NSURLComponents
|
||||||
|
|
||||||
|
static NSCharacterSet *queryItemCharSet = nil;
|
||||||
|
|
||||||
|
+ (void) initialize
|
||||||
|
{
|
||||||
|
if (nil == queryItemCharSet)
|
||||||
|
{
|
||||||
|
ENTER_POOL
|
||||||
|
NSMutableCharacterSet *m;
|
||||||
|
|
||||||
|
m = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
|
||||||
|
|
||||||
|
/* Rationale: if a query item contained an ampersand we would not be
|
||||||
|
* able to tell where one name/value pair ends and the next starts,
|
||||||
|
* so we cannot permit that character in an item. Similarly, if a
|
||||||
|
* query item contained an equals sign we would not be able to tell
|
||||||
|
* where the name ends and the value starts, so we cannot permit that
|
||||||
|
* character either.
|
||||||
|
*/
|
||||||
|
[m removeCharactersInString: @"&="];
|
||||||
|
queryItemCharSet = [m copy];
|
||||||
|
LEAVE_POOL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Creating URL components...
|
// Creating URL components...
|
||||||
+ (instancetype) componentsWithString: (NSString *)urlString
|
+ (instancetype) componentsWithString: (NSString *)urlString
|
||||||
{
|
{
|
||||||
|
@ -2765,8 +2662,9 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
// Accessing Components in PercentEncoded Format
|
// Accessing Components in PercentEncoded Format
|
||||||
- (NSString *) percentEncodedFragment
|
- (NSString *) percentEncodedFragment
|
||||||
{
|
{
|
||||||
return [internal->_fragment stringByAddingPercentEncodingWithAllowedCharacters:
|
return [internal->_fragment
|
||||||
[NSCharacterSet URLFragmentAllowedCharacterSet]];
|
stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
|
[NSCharacterSet URLFragmentAllowedCharacterSet]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setPercentEncodedFragment: (NSString *)fragment
|
- (void) setPercentEncodedFragment: (NSString *)fragment
|
||||||
|
@ -2776,8 +2674,9 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
|
|
||||||
- (NSString *) percentEncodedHost
|
- (NSString *) percentEncodedHost
|
||||||
{
|
{
|
||||||
return [internal->_host stringByAddingPercentEncodingWithAllowedCharacters:
|
return [internal->_host
|
||||||
[NSCharacterSet URLHostAllowedCharacterSet]];
|
stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
|
[NSCharacterSet URLHostAllowedCharacterSet]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setPercentEncodedHost: (NSString *)host
|
- (void) setPercentEncodedHost: (NSString *)host
|
||||||
|
@ -2787,8 +2686,9 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
|
|
||||||
- (NSString *) percentEncodedPassword
|
- (NSString *) percentEncodedPassword
|
||||||
{
|
{
|
||||||
return [internal->_password stringByAddingPercentEncodingWithAllowedCharacters:
|
return [internal->_password
|
||||||
[NSCharacterSet URLPasswordAllowedCharacterSet]];
|
stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
|
[NSCharacterSet URLPasswordAllowedCharacterSet]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setPercentEncodedPassword: (NSString *)password
|
- (void) setPercentEncodedPassword: (NSString *)password
|
||||||
|
@ -2798,8 +2698,9 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
|
|
||||||
- (NSString *) percentEncodedPath
|
- (NSString *) percentEncodedPath
|
||||||
{
|
{
|
||||||
return [internal->_path stringByAddingPercentEncodingWithAllowedCharacters:
|
return [internal->_path
|
||||||
[NSCharacterSet URLPathAllowedCharacterSet]];
|
stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
|
[NSCharacterSet URLPathAllowedCharacterSet]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setPercentEncodedPath: (NSString *)path
|
- (void) setPercentEncodedPath: (NSString *)path
|
||||||
|
@ -2874,8 +2775,10 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
NSString *name = [i name];
|
NSString *name = [i name];
|
||||||
NSString *value = [i value];
|
NSString *value = [i value];
|
||||||
|
|
||||||
name = [name _stringByAddingPercentEscapesForQuery];
|
name = [name stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
value = [value _stringByAddingPercentEscapesForQuery];
|
queryItemCharSet];
|
||||||
|
value = [value stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
|
queryItemCharSet];
|
||||||
ni = [NSURLQueryItem queryItemWithName: name
|
ni = [NSURLQueryItem queryItemWithName: name
|
||||||
value: value];
|
value: value];
|
||||||
[items addObject: ni];
|
[items addObject: ni];
|
||||||
|
@ -2915,7 +2818,7 @@ GS_PRIVATE_INTERNAL(NSURLComponents)
|
||||||
- (NSString *) percentEncodedUser
|
- (NSString *) percentEncodedUser
|
||||||
{
|
{
|
||||||
return [internal->_user stringByAddingPercentEncodingWithAllowedCharacters:
|
return [internal->_user stringByAddingPercentEncodingWithAllowedCharacters:
|
||||||
[NSCharacterSet URLUserAllowedCharacterSet]];
|
[NSCharacterSet URLUserAllowedCharacterSet]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setPercentEncodedUser: (NSString *)user
|
- (void) setPercentEncodedUser: (NSString *)user
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue