1

この問題の真相を突き止めようとして、見つけたすべての関連記事を調べましたが、はっきりとはわかりません。誰かが私を悲惨な状況から解放してくれることを願っています…</p>

プロキシ経由で HTTPS 経由で Android 2.3 を POST しようとしています。このコードは、プロキシを介して 2.2 で完全に機能し、プロキシを介さない場合は HTTPS を使用して 2.2 と 2.3 の両方で完全に機能し、すべての場合 (2.2 と 2.3) でプロキシを介して HTTPS 経由で GET できます。問題と思われるプロキシを介してHTTPSを使用する2.3 POSTだけです。恐ろしい「壊れたパイプ」エラーが発生します。接続から入力ストリーム応答を読み取ろうとすると、エラーがスローされます。おそらく、ストリームの下で TCP ソケットが閉じられているためです。Connection ヘッダーと Proxy-connection ヘッダーの使用 (close と keep-alive の両方に設定) や大きな readTimeout 値 (30 秒) の設定など、考えられるすべてのことを試しました。私の執拗なグーグル検索から、Android 2.3 の SSL には既知の問題があることがわかりますが、問題はありません。POST が問題になる理由を示唆するものは何も見つからないようです。Wireshark でいくつかの結果が得られましたが、これが SSL であることを考えると、問題を解決するのが少し難しいだけです。

誰もがこのように見えますか。さまざまな投稿がこれが AndroidHttpClient よりも安定していることを示唆しているため、私は HttpsURLConnection を使用しています。これが私のコードです...どんな助けもかけがえのないものです。ありがとう

urlConnection.setSSLSocketFactory(factory);     
urlConnection.setHostnameVerifier(new AllowAllHostnameVerifier() );

String dateText = "{\"loopParam\":\"" + String.valueOf(d.getHours()) + ":" +   String.valueOf(d.getMinutes()) + ":" + String.valueOf(d.getSeconds())  + "\"}";
                txtOutput.setText("Sending " +     String.valueOf(dateText.length() ) + " bytes of JSON to /pulse/loop" );

urlConnection.addRequestProperty("Content-type", "application/json");
                urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Proxy-connection", "Keep-Alive");
urlConnection.setRequestProperty("Connection", "Keep-Alive");
                urlConnection.setDoInput(true);
                urlConnection.setUseCaches(false);
                urlConnection.setReadTimeout(30000);
                urlConnection.setRequestMethod("POST");
                DataOutputStream dataOut = new     DataOutputStream(urlConnection.getOutputStream());
                dataOut.writeBytes(dateText);
                dataOut.flush();

BufferedReader bufIn = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String sResponse;
            StringBuilder s = new StringBuilder();

         //bufIn is null as error as closed urlcConnection
            while ((sResponse = bufIn.readLine()) != null) {
                s = s.append(sResponse);
            }

エラーの詳細: 08-May-12 09:09:51 SsliferSnifferActivity プロキシ経由で接続中 INFO

08-May-12 09:09:54 SsliferSnifferActivity javax.net.ssl.SSLException: Write error: ssl=0x2d42b8: I/O error during system call, Broken pipe
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:837)
at java.io.OutputStream.write(OutputStream.java:80)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.writeRequestHeaders(HttpURLConnectionImpl.java:799)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1028)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726)
at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:110)
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity.makeRequest(SslifersnifferActivity.java:236)
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity.access$2(SslifersnifferActivity.java:148)
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity$2.onClick(SslifersnifferActivity.java:76)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9080)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3822)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

編集:これは、サーバーが 400 (Bad Request) を上げてパイプを閉じていることが原因のようです。400 を引き起こすプロキシ経由でルーティングされたときに余分なコンテンツを追加している ANdroid 2.3 についてはどうですか?

4

1 に答える 1

2

「壊れたパイプ」には、まさに 1 つの意味があります。もう一方の端によって既に閉じられている接続に書き込みました。ピアが本当に SSL を使用していると確信していますか?

于 2012-05-10T01:54:48.873 に答える