2010-08-11 43 views
1

我在文檔中找不到這個。NSURL是否應該解析無效的URL?

我在寫一些單元測試,其中一個應該失敗的測試是[NSURL URLWithString: @"cow"]。因爲cow不是有效的網址。

然而,它被愉快地解析了NSURL沒有任何錯誤。它不返回nil,它不會拋出異常。調用[url absoluteString]就可以將它變回@"cow"

這是怎麼回事? NSURL真的應該允許這個嗎?

+0

As @Chuck指出,@「牛」是一個有效的URL。像@「牛鈴」不應該,雖然... – walkytalky 2010-08-11 21:26:39

回答

3

NSURL允許包含「牛」的相對URL。

URI的RFC 2396中給出的一般形式允許相對引用:

URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] 
relativeURI = (net_path | abs_path | rel_path) [ "?" query ] 
rel_path  = rel_segment [ abs_path ] 
rel_segment = 1*(unreserved | escaped | 
         ";" | "@" | "&" | "=" | "+" | "$" | ",") 

除非我誤讀可怕,這意味着有效字符的序列可以形成一個有效的相對URL。

+0

是的,但不是通過'+ URLWithString:'。 – 2010-08-11 21:36:53

+0

該文檔說明URL根據RFC 1808進行分析 - 一個標題爲「相對統一資源定位符」的文檔,它允許相對或絕對URL。請參閱該RFC的第3頁,或相同定義的2396頁第14-16頁。相對URL是允許的。 – Chuck 2010-08-11 21:43:28

+0

撤回我以前的評論,用下面的代替它:我忽略的一個明顯例子是在現有的超文本文檔中使用的href =「/ someotherdocument」。我想這是由開發人員來維護上下文,如果相對URL給出。 – 2010-08-12 00:17:14

0

從+ URLWithString的文檔:

字符串用來初始化 的NSURL對象。必須符合RFC 2396.此方法根據RFC 1738和1808解析URLString。 ... 如果字符串格式不正確,則返回nil。

對RFC 2396並不熟悉,我不能確定地說,但我認爲你必須至少有一個協議和主機(即使域本身轉發給主機)。我當然期望無。

如果您沒有通過@「cow」返回「無」,您應該在bugreporter.apple.com上提交一個錯誤。你可能想要標題爲「別有一頭牛」。

+0

正確。基本規則在「3。 URI Syntactic Components「作爲''。 「c:w」會匹配,「牛」不會。 – 2010-08-11 21:38:10

+0

正如我在對我的回答的評論中指出的那樣,Ahruman錯誤地認爲這是網址必須解析的強制性表單。相對URL是有效的並且是允許的。 – Chuck 2010-08-11 21:47:23