0

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 に変更すると、完全に機能します。

4

0 に答える 0