触っていると 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];
}
呼び出すと、メモリとファイル両方のクッキーを削除する(ファイル自体は空のまま残す)。