@@ -930,31 +930,48 @@ return _URLEncodedPath; } - (OFArray *)pathComponents { - return [self.path componentsSeparatedByString: @"/"]; + OFMutableArray *ret = [[[_URLEncodedPath + componentsSeparatedByString: @"/"] mutableCopy] autorelease]; + void *pool = objc_autoreleasePoolPush(); + size_t count = ret.count; + + if (count > 0 && [ret.firstObject length] == 0) + [ret replaceObjectAtIndex: 0 + withObject: @"/"]; + + for (size_t i = 0; i < count; i++) { + OFString *component = [ret objectAtIndex: i]; + [ret replaceObjectAtIndex: i + withObject: component.stringByURLDecoding]; + } + + [ret makeImmutable]; + + objc_autoreleasePoolPop(pool); + + return ret; } - (OFString *)lastPathComponent { void *pool = objc_autoreleasePoolPush(); - OFString *path = self.path; + OFString *path = _URLEncodedPath; const char *UTF8String, *lastComponent; size_t length; OFString *ret; if (path == nil) { objc_autoreleasePoolPop(pool); - return nil; } if ([path isEqual: @"/"]) { objc_autoreleasePoolPop(pool); - - return @""; + return @"/"; } if ([path hasSuffix: @"/"]) path = [path substringWithRange: of_range(0, path.length - 1)]; @@ -966,13 +983,14 @@ lastComponent = UTF8String + (length - i) + 1; break; } } - ret = [[OFString alloc] - initWithUTF8String: lastComponent - length: length - (lastComponent - UTF8String)]; + ret = [OFString + stringWithUTF8String: lastComponent + length: length - (lastComponent - UTF8String)]; + ret = [ret.stringByURLDecoding retain]; objc_autoreleasePoolPop(pool); return [ret autorelease]; }