永続化の前に NSHTTPCookieAcceptPolicy への対応を行っておく。
ヘッダファイル NSHTTPCookieStorage.h によれば3種類の値が存在する。
NSHTTPCookieStorage.h
/*!
@enum NSHTTPCookieAcceptPolicy
@abstract Values for the different cookie accept policies
@constant NSHTTPCookieAcceptPolicyAlways Accept all cookies
@constant NSHTTPCookieAcceptPolicyNever Reject all cookies
@constant NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain Accept cookies
only from the main document domain
*/
enum {
NSHTTPCookieAcceptPolicyAlways,
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
};
typedef NSUInteger NSHTTPCookieAcceptPolicy;
Safari(4.0)のセキュリティ設定を見ると3選択があるのでこれらが対応しているのだろう。
ポリシー適用には URLが必要になるので setCookies:forURL:mainDocumentURL: でチェックを行うことにする。前回のコードにポリシー適用の条件を加えた。
XCHTTPCookieStorage.m
- (void)setCookies:(NSArray *)cookies forURL:(NSURL *)URL mainDocumentURL:(NSURL *)mainDocumentURL
{
if (_cookie_accept_policy == NSHTTPCookieAcceptPolicyNever) {
return;
}
NSString* url_host = [mainDocumentURL host];
for (NSHTTPCookie *cookie in cookies) {
if (_cookie_accept_policy ==
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain &&
![url_host hasSuffix:[cookie domain]]) {
continue;
}
[self setCookie:cookie];
}
}
NSHTTPCookieAcceptPolicyNever は無条件に拒否、NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain の場合はドメインチェックを行うようにした。
また setCookie: にも NSHTTPCookieAcceptPolicyNever の場合の拒否ロジックを加えておいた。
デフォルト値は Safariに合わせて NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain にしておいた。