ページ

2009年9月14日月曜日

NSHTTPCookieStorage相当のクラスを自前で実装する (12)バグ修正他

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

触っていると GoogleApps でのログインに失敗することが判明。
原因はパスチェックにあった。

今までは比較対象のクッキーのパスへ無条件に / をつけていた。

 if (![url_path isEqualToString:cookie_path]) {
if (![url_path hasPrefix:[cookie_path stringByAppendingString:@"/"]]) {
continue;
}
}


この場合
url_path: /a/some.com/sample.gif
cookie_path: /a/some.com

は問題ないのだが

url_path: /a/some.com/LoginAction
cookie_path: /a/some.com/ ※最後に / がつく


のケースはcookie_pathの末尾に / を重ねてしまうので、クッキー送出の対象にならなくなっていた。

そこで末尾についているケースをきちんと対処してやる。

if (![url_path isEqualToString:cookie_path]) {
if (![cookie_path hasPrefix:@"/"]) {
cookie_path = [cookie_path stringByAppendingString:@"/"];
}
if (![url_path hasPrefix:cookie_path]) {
continue;
}
}


そもそも最後に / をつけていたのは単純な後方一致だと
url_path: /a/some.com.gif
cookie_path: /a/som.com

のようなケースも拾ってしまうため。
末尾に / をつけてチェック( cookie_path: /a/some.com/ )することでこういった誤送信を防げる。


修正後、無事に GoogleAppsへログインできた。


#####

なおバグとは別に、クッキーのクリアができた方が便利なので NSHTTPCookieStorage には無い、オリジナルのメソッドを追加しておく。
- (void)clearCookies
{
for (NSMutableDictionary* cookies2 in [_cookies allValues]) {
[cookies2 removeAllObjects];
}
[_cookies removeAllObjects];
_is_modified = YES;
[self _writeCookies:nil];
}


呼び出すと、メモリとファイル両方のクッキーを削除する(ファイル自体は空のまま残す)。