Skip to content

Commit

Permalink
Explicitly disable gzip for HttpUrlConnection.
Browse files Browse the repository at this point in the history
Fixes #440
  • Loading branch information
sjudd committed Apr 26, 2015
1 parent 2cf8671 commit 02c4246
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
* Fetches an {@link InputStream} using the okhttp library.
*/
public class OkHttpStreamFetcher implements DataFetcher<InputStream> {
private static final String CONTENT_LENGTH_HEADER = "Content-Length";
private final OkHttpClient client;
private final GlideUrl url;
private InputStream stream;
Expand All @@ -43,7 +42,7 @@ public InputStream loadData(Priority priority) throws Exception {
throw new IOException("Request failed with code: " + response.code());
}

String contentLength = response.header(CONTENT_LENGTH_HEADER);
long contentLength = responseBody.contentLength();
stream = ContentLengthInputStream.obtain(responseBody.byteStream(), contentLength);
return stream;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.bumptech.glide.load.data;

import android.text.TextUtils;
import android.util.Log;

import com.bumptech.glide.Priority;
import com.bumptech.glide.load.model.GlideUrl;
Expand All @@ -17,7 +18,9 @@
* A DataFetcher that retrieves an {@link java.io.InputStream} for a Url.
*/
public class HttpUrlFetcher implements DataFetcher<InputStream> {
private static final String CONTENT_LENGTH = "Content-Length";
private static final String TAG = "HttpUrlFetcher";
private static final String ENCODING_HEADER = "Accept-Encoding";
private static final String DEFAULT_ENCODING = "identity";
private static final int MAXIMUM_REDIRECTS = 5;
private static final HttpUrlConnectionFactory DEFAULT_CONNECTION_FACTORY = new DefaultHttpUrlConnectionFactory();

Expand Down Expand Up @@ -62,6 +65,11 @@ private InputStream loadDataWithRedirects(URL url, int redirects, URL lastUrl, M
for (Map.Entry<String, String> headerEntry : headers.entrySet()) {
urlConnection.addRequestProperty(headerEntry.getKey(), headerEntry.getValue());
}
// Do our best to avoid gzip since it's both inefficient for images and also makes it more
// difficult for us to detect and prevent partial content rendering. See #440.
if (TextUtils.isEmpty(urlConnection.getRequestProperty(ENCODING_HEADER))) {
urlConnection.setRequestProperty(ENCODING_HEADER, DEFAULT_ENCODING);
}
urlConnection.setConnectTimeout(2500);
urlConnection.setReadTimeout(2500);
urlConnection.setUseCaches(false);
Expand All @@ -74,9 +82,7 @@ private InputStream loadDataWithRedirects(URL url, int redirects, URL lastUrl, M
}
final int statusCode = urlConnection.getResponseCode();
if (statusCode / 100 == 2) {
String contentLength = urlConnection.getHeaderField(CONTENT_LENGTH);
stream = ContentLengthInputStream.obtain(urlConnection.getInputStream(), contentLength);
return stream;
return getStreamForSuccessfulRequest(urlConnection);
} else if (statusCode / 100 == 3) {
String redirectUrlString = urlConnection.getHeaderField("Location");
if (TextUtils.isEmpty(redirectUrlString)) {
Expand All @@ -92,6 +98,20 @@ private InputStream loadDataWithRedirects(URL url, int redirects, URL lastUrl, M
}
}

private InputStream getStreamForSuccessfulRequest(HttpURLConnection urlConnection)
throws IOException {
if (TextUtils.isEmpty(urlConnection.getContentEncoding())) {
int contentLength = urlConnection.getContentLength();
stream = ContentLengthInputStream.obtain(urlConnection.getInputStream(), contentLength);
} else {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Got non empty content encoding: " + urlConnection.getContentEncoding());
}
stream = urlConnection.getInputStream();
}
return stream;
}

@Override
public void cleanup() {
if (stream != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,15 @@ public final class ContentLengthInputStream extends FilterInputStream {
private static final String TAG = "ContentLengthStream";
private static final int UNKNOWN = -1;

private final int contentLength;
private final long contentLength;
private int readSoFar;

public static InputStream obtain(InputStream other, String contentLengthHeader) {
return new ContentLengthInputStream(other, parseContentLength(contentLengthHeader));
return obtain(other, parseContentLength(contentLengthHeader));
}

public static InputStream obtain(InputStream other, long contentLength) {
return new ContentLengthInputStream(other, contentLength);
}

private static int parseContentLength(String contentLengthHeader) {
Expand All @@ -36,14 +40,14 @@ private static int parseContentLength(String contentLengthHeader) {
return result;
}

ContentLengthInputStream(InputStream in, int contentLength) {
ContentLengthInputStream(InputStream in, long contentLength) {
super(in);
this.contentLength = contentLength;
}

@Override
public synchronized int available() throws IOException {
return Math.max(contentLength - readSoFar, in.available());
return (int) Math.max(contentLength - readSoFar, in.available());
}

@Override
Expand Down

0 comments on commit 02c4246

Please sign in to comment.