OSX アプリのプロキシ サポートを実装しています。
カスタムを作成しましたが、NSURLProtocol
認証なしのプロキシで完全に機能しています。ローカル ネットワークの Windows コンピューターで CCProxy と FreeProxy の両方を試しました。
ただし、プロキシ認証がオンの場合、最初の数秒間のリクエストはすべて完全に機能し、接続は 5 秒で ESTABLISHED から CLOSE_WAIT になります。プロキシは再び 0 接続を示し、その後、プロキシ認証ヘッダーが事前に設定されていても、アプリで HTTP リクエストが 407 を取得します。
私のコードは次のようになります:
// set the auth fields
CFStringRef usernameRef = (__bridge CFStringRef)appProxyPrefs.proxyUserName;
CFStringRef passwordRef = (__bridge CFStringRef)appProxyPrefs.proxyPassword;
CFHTTPMessageAddAuthentication(copyOfOriginal, nil, usernameRef, passwordRef, kCFHTTPAuthenticationSchemeBasic, YES);
...
// useless
CFHTTPMessageSetHeaderFieldValue(copyOfOriginal, (__bridge CFStringRef)@"Connection", (CFStringRef)(@"Keep-Alive"));
...
// create stream, callback, schedule
// apply proxy settings to the stream
if (isNoProxyOverride)
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)(noProxyDict));
else
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)(manualProxyDict));
...
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue);
if (!CFReadStreamOpen(myReadStream)) { // error }
else
{
// check if there is a prev stream
if (currentStream != nil)
{
[currentStream close];
currentStream = nil;
}
currentStream = (__bridge NSInputStream *)(myReadStream);
}
ご覧のとおり、以前の接続を静的な入力ストリームに保存し、新しい接続を開いた後にのみ解放しようとしましたが、役に立たないようです。
また、 NSStream TCP Keep-alive iOSkCFStreamEventOpenCompleted
で提案されているように、基になるソケットをキープアライブに設定しようとしましたが、まだ成功していません。
接続が閉じるのはなぜですか? どうすればデバッグしたり、機能させたりできますか? 接続の障害はプロキシが異常になりますか?
ありがとう。
編集1:
編集 2 : HTTPS に関係しているようです... サーバーを https ではなくプレーンな http に変更すると、完全に機能します。