ページ

2009年8月14日金曜日

WPSU(12) - WebKitでクッキーを自前でハンドリングする #1 リクエストを調べる

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

クッキーをWebKitアプリ間で共有しないようにするには、クッキーの処理を自前でやる必要があることがわかった。WSBUでは共有したくないのでクッキー処理を実装することにする。

普通なら「まずクッキーの仕様を調べて、、」といくところだが大雑把な内容は理解しているつもりなので実装を進めながら確認を取っていこう。


まずは WebKit でクッキーを自前処理する方法を調べる。

WebView の WebResourceLoadDelegate に先日作成した WebController を指定する。ここにデリゲートメソッド webView:resource:willSendRequest:redirectResponse:fromDataSource: を実装してみた。

WebController.m

- (NSURLRequest *)webView:(WebView *)sender
resource:(id)identifier
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
fromDataSource:(WebDataSource *)dataSource
{
NSLog(@"%@", [request allHTTPHeaderFields]);
return request;
}


調査目的でリクエストヘッダの内容をデバッガコンソールへ出力させている。

google.com へアクセスしてみよう。

デバッガコンソール(抜粋)
[Session started at 2009-08-14 12:14:01 +0900.]
2009-08-14 12:14:05.494 WebPageScreenshotUtility[10382:10b] {
Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
"User-Agent" = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3";
}
2009-08-14 12:14:07.097 WebPageScreenshotUtility[10382:10b] {
Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "ja-jp";
"User-Agent" = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3";
}
2009-08-14 12:14:07.505 WebPageScreenshotUtility[10382:10b] {
Referer = "http://www.google.co.jp/";
"User-Agent" = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3";
}


見たところクッキーヘッダが無い。

クッキーが送出されていないと思いきや、google.comを見るとログイン状態になっている。



どうもこのメソッドが呼ばれるタイミングではまだクッキー情報が付加されていないようだ。

試しに setHTTPShouldHandleCookies: を使い、クッキー処理を停止させてみる。
 [(NSMutableURLRequest*)request setHTTPShouldHandleCookies:NO];


すると今度は google.com へアクセスしてもログイン状態にはなっていない。なるほど。