NSURLConnection は Connection: close できない
Webサーバの認証方法の1つ、BASIC認証はログインはあってもログアウトできない。一度、認証に成功するとHTTPヘッダに Authentication: Basic xxx と Connection: keep-alive が設定されて、その後は認証なしに保護されたページにアクセスできる、という動作をする。
どうしても再認証させたい場合、一度、Connection: close をサーバに送信することで、再認証フェーズに持ってくことができるのが HTTP/1.1 (RFC2616) の仕様のはずなんだけど NSURLConnection はそれができない。orz
NSMutableHTTPRequest で request インスタンス作って Connection:close を設定しても、NSURLConnection を実行する段階で、Connection: keep-alive に上書きされちゃうらしい。
■ ソースコード
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"close" forHTTPHeaderField:@"Connection"];
NSURLConnection *conn = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO] retain];
…
[conn start];
■ 実行結果
GET /protected/page.html HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: MyApp/1.0 CFNetwork/548.0.3 Darwin/11.2.0
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Authorization: Basic xxxx
Connection: keep-alive
アプリのリリース直前でこのネタに気付いて本気で困り中。検索しても ASIHTTPRequest を使うか、CFNetwork から独自実装してね、という記事しか見つからない。
結構、作り込みしちゃったから、今から ASIHTTPRequest に切り替えるって分けにもいかない。。。う〜ん、マジでどうしよう。(T^T)
確認環境
- iOS 5.0
追記
バグ対応版ってことで ASIHTTPRequest を使って修正版をリリースする方針にしよーと思った矢先、ASIHTTPRequest がディスコンになったというブログを発見。状況さらに悪化中 (T^T)