Index: src/OFURL.m ================================================================== --- src/OFURL.m +++ src/OFURL.m @@ -106,11 +106,15 @@ newWithClass: isa requestedSize: [str cStringLength]]; str_c = str_c2; - if (!strncmp(str_c, "http://", 7)) { + if (!strncmp(str_c, "file://", 7)) { + scheme = @"file"; + path = [[OFString alloc] initWithCString: str_c + 7]; + return self; + } else if (!strncmp(str_c, "http://", 7)) { scheme = @"http"; str_c += 7; } else if (!strncmp(str_c, "https://", 8)) { scheme = @"https"; str_c += 8; @@ -481,10 +485,15 @@ - (OFString*)description { OFMutableString *desc = [OFMutableString stringWithFormat: @"%@://", scheme]; BOOL needPort = YES; + + if ([scheme isEqual: @"file"]) { + [desc appendString: path]; + return desc; + } if (user != nil && password != nil) [desc appendFormat: @"%@:%@@", user, password]; else if (user != nil) [desc appendFormat: @"%@@", user]; Index: tests/OFURLTests.m ================================================================== --- tests/OFURLTests.m +++ tests/OFURLTests.m @@ -33,11 +33,12 @@ OFURL *u1, *u2, *u3, *u4; TEST(@"+[URLWithString:]", R(u1 = [OFURL URLWithString: url_str]) && R(u2 = [OFURL URLWithString: @"http://foo:80"]) && - R(u3 = [OFURL URLWithString: @"http://bar/"])) + R(u3 = [OFURL URLWithString: @"http://bar/"]) && + R(u4 = [OFURL URLWithString: @"file:///etc/passwd"])) TEST(@"+[URLWithString:relativeToURL:]", [[[OFURL URLWithString: @"/foo" relativeToURL: u1] description] isEqual: @"http://u:p@h:1234/foo"] && @@ -51,21 +52,27 @@ relativeToURL: u1] description] isEqual: @"http://foo/?q"]) TEST(@"-[description]", [[u1 description] isEqual: url_str] && [[u2 description] isEqual: @"http://foo"] && - [[u3 description] isEqual: @"http://bar/"]) + [[u3 description] isEqual: @"http://bar/"] && + [[u4 description] isEqual: @"file:///etc/passwd"]) - TEST(@"-[scheme]", [[u1 scheme] isEqual: @"http"]) - TEST(@"-[user]", [[u1 user] isEqual: @"u"]) - TEST(@"-[password]", [[u1 password] isEqual: @"p"]) - TEST(@"-[host]", [[u1 host] isEqual: @"h"]) + TEST(@"-[scheme]", + [[u1 scheme] isEqual: @"http"] && [[u4 scheme] isEqual: @"file"]) + TEST(@"-[user]", [[u1 user] isEqual: @"u"] && [u4 user] == nil) + TEST(@"-[password]", + [[u1 password] isEqual: @"p"] && [u4 password] == nil) + TEST(@"-[host]", [[u1 host] isEqual: @"h"] && [u4 port] == 0) TEST(@"-[port]", [u1 port] == 1234) - TEST(@"-[path]", [[u1 path] isEqual: @"f"]) - TEST(@"-[parameters]", [[u1 parameters] isEqual: @"p"]) - TEST(@"-[query]", [[u1 query] isEqual: @"q"]) - TEST(@"-[fragment]", [[u1 fragment] isEqual: @"f"]) + TEST(@"-[path]", + [[u1 path] isEqual: @"f"] && [[u4 path] isEqual: @"/etc/passwd"]) + TEST(@"-[parameters]", + [[u1 parameters] isEqual: @"p"] && [u4 parameters] == nil) + TEST(@"-[query]", [[u1 query] isEqual: @"q"] && [u4 query] == nil) + TEST(@"-[fragment]", + [[u1 fragment] isEqual: @"f"] && [u4 fragment] == nil) TEST(@"-[copy]", R(u4 = [[u1 copy] autorelease])) TEST(@"-[isEqual:]", [u1 isEqual: u4] && ![u2 isEqual: u3]) TEST(@"-[hash:]", [u1 hash] == [u4 hash] && [u2 hash] != [u3 hash])