我在http Headers 中使用了Expect 100-continue,就像你在下面的代码中看到的那样 . 当我得到输出流时,HttpUrlConnection不等待100 Expectation的答案或任何其他400错误 . (在RFC中,他们告诉它不是问题:https://tools.ietf.org/html/rfc7231#section-5.1.1) .

我看过这篇文章:How to wait for Expect 100-continue response in Java using HttpURLConnection如果他们有关于问题的更多信息,但我已经测试了setChuncked方法,看看它是否有所作为但没有 .

问题是当服务器回答错误并关闭连接而不让我完成上传我有一个断管错误 . 我在关闭连接上写字节是正确的,但我无法正确处理 . 我无法读取服务器的答案 . 在写之前我无法知道连接是否接近 . 如果我尝试获取ErrorStream,我会为InputStream,ResponseCode和其他方法获取一个空引用,以了解发生了什么 .

任何想法如何使它正确或我想念它使它工作?

javax.net.ssl.SSLException: Write error: ssl=0x73de8c02c0: I/O error during system call, Broken pipe
at com.android.org.conscrypt.NativeCrypto.SSL_write(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:824)
at com.android.okhttp.okio.Okio$1.write(Okio.java:76)
at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:155)
at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176)
at com.android.okhttp.okio.RealBufferedSink.write(RealBufferedSink.java:46)
at com.android.okhttp.internal.http.HttpConnection$ChunkedSink.write(HttpConnection.java:339)
at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176)
at com.android.okhttp.okio.RealBufferedSink$1.write(RealBufferedSink.java:198)
at out.write(buffer, 0, bytes_read);

在下面的代码中,我删除了一些不太有用的部分,如全局尝试,或者为fileSize计算 .

huc = (HttpURLConnection) new URL(upload_url).openConnection();
huc.setRequestMethod("POST");
huc.setRequestProperty("Content-Length", "" + FILE_SZ);
huc.setRequestProperty("User-Agent", "UA");
huc.setRequestProperty("Expect","100-continue");


huc.setFixedLengthStreamingMode(FILE_SZ);
huc.setUseCaches(false);
huc.setDoInput(true);
huc.setDoOutput(true);
huc.setInstanceFollowRedirects(true);
try {
   // read input file chunks + publish progress
   OutputStream out = new OutputStream(huc.getOutputStream());
   buffer_size = 4 * 1024;
   buffer = new byte[buffer_size];
   total_bytes = 0;
   while ((bytes_read = fis.read(buffer)) != -1) {
        out.write(buffer, 0, bytes_read);
        total_bytes += bytes_read;
   }
   out.flush();
   out.close();
} catch (IOException e) {
    e.printStackTrace();
}