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)

確認環境
追記

バグ対応版ってことで ASIHTTPRequest を使って修正版をリリースする方針にしよーと思った矢先、ASIHTTPRequest がディスコンになったというブログを発見。状況さらに悪化中 (T^T)

追記2 2012/2/6

NSHTTPCookieStorage で Cookie をクリアすることで回避できたよ :-)