ページ

2009年8月29日土曜日

NSHTTPCookieStorage相当のクラスを自前で実装する (5)クッキー送出ではより詳細な方を返す

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

クッキー送出の処理で、同じドメイン内で同じ名前を持つクッキーがある場合はより詳細な方を返す。

例)pathが "/acme" と "/acme/ammo" で同じ nameの Cookieが存在する場合、
 a) リクエストURLのパスが "/acme/ammo/test.html" の場合、後者を返す
 b) リクエストURLのパスが "/acme/parts/some.html" の場合、前者を返す


前回のコードをこれに合わせて書き換えてみる。

XCHTTPCookieStorage.m
- (NSArray *)cookiesForURL:(NSURL *)URL
{
// NSMutableArray* return_cookies = [NSMutableArray array];
NSMutableDictionary* cookie_dicts = [NSMutableDictionary dictionary];
:
NSHTTPCookie* stored_cookie;
if (stored_cookie = [cookie_dicts valueForKey:cookie_name]) {
if ([cookie_path length] <= [[stored_cookie path] length]) {
continue;
}
}
// [return_cookies addObject:cookie];
[cookie_dicts setObject:cookie forKey:cookie_name];
}

// return return_cookies;
return [cookie_dicts allValues];
}


該当するクッキーを格納するクラスを、NSMutableArrayをやめて NSMuableDictionaryに変更する。キーにクッキーの名前を使うことで同一のドメイン内のクッキーの名前はユニークになる。同一の名前が存在する場合は、詳細な方=すなわちパスが長い方を選ぶようにした。