ページ

2009年8月22日土曜日

NSHTTPCookie の同値性チェック -[isEqual:]

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

クッキーを管理する上では2つのクッキーが同じものかどうかを判断する(=同値性をチェックする)必要がある。

以前参考にしたソースコードでは domain + path + name の3つで判断していた。これを採用するにしても、本来同値性チェックの責務は NSHTTPCookie 側で持った方が良いと考えられるのでサブクラスを作りそのロジックを実装しよう。と、思ったが NSHTTPCookie はその辺り考えて作ってあるのでは?という考えが浮かんできた。そこでコードを書いて簡単に NSHTTPCookie の同値性を調べてみることにする。

まずは domain + path + name の組み合わせで判断されているかどうか。

domain + path + name が同じクッキーを作成して -[isEqual:] を使って同値性をチェックする。

 NSDictionary* properties1 =
[NSDictionary dictionaryWithObjectsAndKeys:
@"/" , NSHTTPCookiePath,
@".xcatsan.com" , NSHTTPCookieDomain,
@"sample" , NSHTTPCookieName,
@"hello" , NSHTTPCookieValue,
nil];

NSDictionary* properties2 =
[NSDictionary dictionaryWithObjectsAndKeys:
@"/" , NSHTTPCookiePath,
@".xcatsan.com" , NSHTTPCookieDomain,
@"sample" , NSHTTPCookieName,
@"hello" , NSHTTPCookieValue,
nil];

NSHTTPCookie* cookie1 = [NSHTTPCookie cookieWithProperties:properties1];
NSHTTPCookie* cookie2 = [NSHTTPCookie cookieWithProperties:properties2];

NSLog(@"cookie1: %@", cookie1);
NSLog(@"cookie2: %@", cookie2);

if ([cookie1 isEqual:cookie2]) {
NSLog(@"[cookie1 isEqual:cookie2]: YES");
} else {
NSLog(@"[cookie1 isEqual:cookie2]: NO");
}


結果は YES。良さそう。
2009-08-22 12:59:38.286 CookieStorage[9346:10b] cookie1: 
2009-08-22 12:59:38.293 CookieStorage[9346:10b] cookie2:
2009-08-22 12:59:38.297 CookieStorage[9346:10b] [cookie1 isEqual:cookie2]: YES


次に cookie2のパスを /some に変えてみる。

結果は NO。
2009-08-22 13:02:21.825 CookieStorage[9382:10b] cookie1: 
2009-08-22 13:02:21.831 CookieStorage[9382:10b] cookie2:
2009-08-22 13:02:21.837 CookieStorage[9382:10b] [cookie1 isEqual:cookie2]: NO


その他、domain, name を変えても同様に NO。これは良さそうだ。

が、value を変えると不一致となった。
[Session started at 2009-08-21 13:06:29 +0900.]
2009-08-22 13:06:31.789 CookieStorage[9497:10b] cookie1:
2009-08-22 13:06:31.795 CookieStorage[9497:10b] cookie2:
2009-08-22 13:06:31.796 CookieStorage[9497:10b] [cookie1 isEqual:cookie2]: NO


うーん、駄目か。
その他のエントリも念のため調べてみた。
同値性条件に入る値
NSHTTPCookieComment
NSHTTPCookieCommentURL
NSHTTPCookieDomain
NSHTTPCookieName
NSHTTPCookiePath
NSHTTPCookieSecure
NSHTTPCookieValue
NSHTTPCookieVersion

同値性条件に入らない値
NSHTTPCookieDiscard
NSHTTPCookieExpires
NSHTTPCookieMaximumAge
NSHTTPCookieOriginURL
NSHTTPCookiePort

※上記はラフに確認したので不正確なところもあるかもしれない。うまく設定できなかった値もあった。

- - - - -
本来の同値性と言う意味からは NSHTTPCookieの isEqualの動作はこれで良いのだろう。が、domain + path + name で同一視したい今回の要件では使えない。やはり自前で判断する必要がある。サブクラス化するかどうか。