From 8026ba6242ac52fc05b4eea4891b7b18e41ca873 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 10 Nov 2014 10:06:14 -0800 Subject: Connection: close is enough to know length. Now that we're defeating connection reuse, we have one additional type of response where the length is known. Bug: 18306491 Change-Id: I19657c565238f07fd89a55a5dbf1e85748f6e7c3 --- src/com/android/providers/downloads/DownloadThread.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java index c0f5a5e9..2493adaf 100644 --- a/src/com/android/providers/downloads/DownloadThread.java +++ b/src/com/android/providers/downloads/DownloadThread.java @@ -439,12 +439,16 @@ public class DownloadThread implements Runnable { */ private void transferData(HttpURLConnection conn) throws StopRequestException { - // To detect when we're really finished, we either need a length or - // chunked encoding. + // To detect when we're really finished, we either need a length, closed + // connection, or chunked encoding. final boolean hasLength = mInfoDelta.mTotalBytes != -1; - final String transferEncoding = conn.getHeaderField("Transfer-Encoding"); - final boolean isChunked = "chunked".equalsIgnoreCase(transferEncoding); - if (!hasLength && !isChunked) { + final boolean isConnectionClose = "close".equalsIgnoreCase( + conn.getHeaderField("Connection")); + final boolean isEncodingChunked = "chunked".equalsIgnoreCase( + conn.getHeaderField("Transfer-Encoding")); + + final boolean finishKnown = hasLength || isConnectionClose || isEncodingChunked; + if (!finishKnown) { throw new StopRequestException( STATUS_CANNOT_RESUME, "can't know size of download, giving up"); } -- cgit v1.2.3