@@ -396,15 +396,25 @@ - (OFString *)scheme { return _scheme; } + +- (OFString *)URLEncodedScheme +{ + return [_scheme stringByURLEncoding]; +} - (OFString *)host { return _host; } + +- (OFString *)URLEncodedHost +{ + return [_host stringByURLEncoding]; +} - (OFNumber *)port { return _port; } @@ -411,20 +421,36 @@ - (OFString *)user { return _user; } + +- (OFString *)URLEncodedUser +{ + return [_user stringByURLEncoding]; +} - (OFString *)password { return _password; } + +- (OFString *)URLEncodedPassword +{ + return [_password stringByURLEncoding]; +} - (OFString *)path { return _path; } + +- (OFString *)URLEncodedPath +{ + return [_path stringByURLEncodingWithAllowedCharacters: + "-._~!$&'()*+,;=:@/"]; +} - (OFArray *)pathComponents { return [_path componentsSeparatedByString: @"/"]; } @@ -471,15 +497,27 @@ - (OFString *)query { return _query; } + +- (OFString *)URLEncodedQuery +{ + return [_query stringByURLEncodingWithAllowedCharacters: + "-._~!$&'()*+,;=:@/?"]; +} - (OFString *)fragment { return _fragment; } + +- (OFString *)URLEncodedFragment +{ + return [_fragment stringByURLEncodingWithAllowedCharacters: + "-._~!$&'()*+,;=:@/?"]; +} - (id)copy { return [self retain]; } @@ -508,42 +546,36 @@ - (OFString *)string { OFMutableString *ret = [OFMutableString string]; void *pool = objc_autoreleasePoolPush(); - [ret appendFormat: @"%@://", [_scheme stringByURLEncoding]]; + [ret appendFormat: @"%@://", [self URLEncodedScheme]]; if (_user != nil && _password != nil) [ret appendFormat: @"%@:%@@", - [_user stringByURLEncoding], - [_password stringByURLEncoding]]; + [self URLEncodedUser], + [self URLEncodedPassword]]; else if (_user != nil) - [ret appendFormat: @"%@@", [_user stringByURLEncoding]]; + [ret appendFormat: @"%@@", [self URLEncodedUser]]; if (_host != nil) - [ret appendString: [_host stringByURLEncoding]]; + [ret appendString: [self URLEncodedHost]]; if (_port != nil) [ret appendFormat: @":%@", _port]; if (_path != nil) { if (![_path hasPrefix: @"/"]) @throw [OFInvalidFormatException exception]; - [ret appendString: [_path - stringByURLEncodingWithAllowedCharacters: - "-._~!$&'()*+,;=:@/"]]; + [ret appendString: [self URLEncodedPath]]; } if (_query != nil) - [ret appendFormat: @"?%@", - [_query stringByURLEncodingWithAllowedCharacters: - "-._~!$&'()*+,;=:@/?"]]; + [ret appendFormat: @"?%@", [self URLEncodedQuery]]; if (_fragment != nil) - [ret appendFormat: @"#%@", - [_fragment stringByURLEncodingWithAllowedCharacters: - "-._~!$&'()*+,;=:@/?"]]; + [ret appendFormat: @"#%@", [self URLEncodedFragment]]; objc_autoreleasePoolPop(pool); [ret makeImmutable];