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