@@ -22,10 +22,12 @@ #import "OFString.h" #import "OFURL+Private.h" #import "OFInvalidFormatException.h" +extern void of_url_verify_escaped(OFString *, OFCharacterSet *); + @implementation OFMutableURL @dynamic scheme, URLEncodedScheme, host, URLEncodedHost, port, user; @dynamic URLEncodedUser, password, URLEncodedPassword, path, URLEncodedPath; @dynamic pathComponents, query, URLEncodedQuery, fragment, URLEncodedFragment; @@ -40,38 +42,53 @@ } - (void)setScheme: (OFString *)scheme { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedScheme; + + _URLEncodedScheme = [[scheme stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLSchemeAllowedCharacterSet]] copy]; - [self setURLEncodedScheme: - [scheme stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLSchemeAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedScheme: (OFString *)URLEncodedScheme { - OFString *old = _URLEncodedScheme; + OFString *old; + + of_url_verify_escaped(URLEncodedScheme, + [OFCharacterSet URLSchemeAllowedCharacterSet]); + + old = _URLEncodedScheme; _URLEncodedScheme = [URLEncodedScheme copy]; [old release]; } - (void)setHost: (OFString *)host { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedHost; + + _URLEncodedHost = [[host stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLHostAllowedCharacterSet]] copy]; - [self setURLEncodedHost: [host stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLHostAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedHost: (OFString *)URLEncodedHost { - OFString *old = _URLEncodedHost; + OFString *old; + + of_url_verify_escaped(URLEncodedHost, + [OFCharacterSet URLHostAllowedCharacterSet]); + + old = _URLEncodedHost; _URLEncodedHost = [URLEncodedHost copy]; [old release]; } - (void)setPort: (OFNumber *)port @@ -82,55 +99,79 @@ } - (void)setUser: (OFString *)user { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedUser; + + _URLEncodedUser = [[user stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLUserAllowedCharacterSet]] copy]; - [self setURLEncodedUser: [user stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLUserAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedUser: (OFString *)URLEncodedUser { - OFString *old = _URLEncodedUser; + OFString *old; + + of_url_verify_escaped(URLEncodedUser, + [OFCharacterSet URLUserAllowedCharacterSet]); + + old = _URLEncodedUser; _URLEncodedUser = [URLEncodedUser copy]; [old release]; } - (void)setPassword: (OFString *)password { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedPassword; + + _URLEncodedPassword = [[password + stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLPasswordAllowedCharacterSet]] copy]; - [self setURLEncodedPassword: - [password stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLPasswordAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedPassword: (OFString *)URLEncodedPassword { - OFString *old = _URLEncodedPassword; + OFString *old; + + of_url_verify_escaped(URLEncodedPassword, + [OFCharacterSet URLPasswordAllowedCharacterSet]); + + old = _URLEncodedPassword; _URLEncodedPassword = [URLEncodedPassword copy]; [old release]; } - (void)setPath: (OFString *)path { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedPath; + + _URLEncodedPath = [[path stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLPathAllowedCharacterSet]] copy]; - [self setURLEncodedPath: [path stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLPathAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedPath: (OFString *)URLEncodedPath { - OFString *old = _URLEncodedPath; + OFString *old; + + of_url_verify_escaped(URLEncodedPath, + [OFCharacterSet URLPathAllowedCharacterSet]); + + old = _URLEncodedPath; _URLEncodedPath = [URLEncodedPath copy]; [old release]; } - (void)setPathComponents: (OFArray *)components @@ -154,39 +195,54 @@ } - (void)setQuery: (OFString *)query { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedQuery; + + _URLEncodedQuery = [[query stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLQueryAllowedCharacterSet]] copy]; - [self setURLEncodedQuery: - [query stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLQueryAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedQuery: (OFString *)URLEncodedQuery { - OFString *old = _URLEncodedQuery; + OFString *old; + + of_url_verify_escaped(URLEncodedQuery, + [OFCharacterSet URLQueryAllowedCharacterSet]); + + old = _URLEncodedQuery; _URLEncodedQuery = [URLEncodedQuery copy]; [old release]; } - (void)setFragment: (OFString *)fragment { void *pool = objc_autoreleasePoolPush(); + OFString *old = _URLEncodedFragment; + + _URLEncodedFragment = [[fragment + stringByURLEncodingWithAllowedCharacters: + [OFCharacterSet URLFragmentAllowedCharacterSet]] copy]; - [self setURLEncodedFragment: - [fragment stringByURLEncodingWithAllowedCharacters: - [OFCharacterSet URLFragmentAllowedCharacterSet]]]; + [old release]; objc_autoreleasePoolPop(pool); } - (void)setURLEncodedFragment: (OFString *)URLEncodedFragment { - OFString *old = _URLEncodedFragment; + OFString *old; + + of_url_verify_escaped(URLEncodedFragment, + [OFCharacterSet URLFragmentAllowedCharacterSet]); + + old = _URLEncodedFragment; _URLEncodedFragment = [URLEncodedFragment copy]; [old release]; } - (id)copy