Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: HttpResponse GZip content encoding equality change #843

Merged
Expand Up @@ -26,6 +26,7 @@
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
Expand Down Expand Up @@ -80,6 +81,12 @@ public final class HttpResponse {
/** Whether {@link #getContent()} should return raw input stream. */
private final boolean returnRawInputStream;

/** Content encoding for GZip */
private static final String CONTENT_ENCODING_GZIP = "gzip";

/** Content encoding for GZip (legacy) */
private static final String CONTENT_ENCODING_XGZIP = "x-gzip";
egsavage marked this conversation as resolved.
Show resolved Hide resolved

/**
* Determines the limit to the content size that will be logged during {@link #getContent()}.
*
Expand Down Expand Up @@ -327,12 +334,12 @@ public InputStream getContent() throws IOException {
boolean contentProcessed = false;
try {
// gzip encoding (wrap content with GZipInputStream)
String contentEncoding = this.contentEncoding;
if (!returnRawInputStream
&& contentEncoding != null
&& contentEncoding.contains("gzip")) {
lowLevelResponseContent =
new ConsumingInputStream(new GZIPInputStream(lowLevelResponseContent));
if (!returnRawInputStream && this.contentEncoding != null) {
final String oontentEncoding = this.contentEncoding.trim().toLowerCase(Locale.ENGLISH);
egsavage marked this conversation as resolved.
Show resolved Hide resolved
if (CONTENT_ENCODING_GZIP.equals(oontentEncoding) || CONTENT_ENCODING_XGZIP.equals(oontentEncoding)) {
lowLevelResponseContent =
new ConsumingInputStream(new GZIPInputStream(lowLevelResponseContent));
}
}
// logging (wrap content with LoggingInputStream)
Logger logger = HttpTransport.LOGGER;
Expand Down
Expand Up @@ -29,6 +29,7 @@
import java.nio.charset.StandardCharsets;
import java.text.NumberFormat;
import java.util.Arrays;
import java.util.Locale;
import java.util.logging.Level;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
Expand Down Expand Up @@ -461,6 +462,21 @@ public LowLevelHttpResponse execute() throws IOException {
}

public void testGetContent_gzipEncoding_finishReading() throws IOException {
do_testGetContent_gzipEncoding_finishReading("gzip");
}

public void testGetContent_gzipEncoding_finishReadingWithUppercaseContentEncoding() throws IOException {
egsavage marked this conversation as resolved.
Show resolved Hide resolved
do_testGetContent_gzipEncoding_finishReading("GZIP");
}

public void testGetContent_gzipEncoding_finishReadingWithDifferentDefaultLocaleAndUppercaseContentEncoding() throws IOException {
egsavage marked this conversation as resolved.
Show resolved Hide resolved
Locale originalDefaultLocale = Locale.getDefault();
Locale.setDefault(Locale.JAPAN);
egsavage marked this conversation as resolved.
Show resolved Hide resolved
do_testGetContent_gzipEncoding_finishReading("GZIP");
Locale.setDefault(originalDefaultLocale);
egsavage marked this conversation as resolved.
Show resolved Hide resolved
}

private void do_testGetContent_gzipEncoding_finishReading(String contentEncoding) throws IOException {
byte[] dataToCompress = "abcd".getBytes(StandardCharsets.UTF_8);
byte[] mockBytes;
egsavage marked this conversation as resolved.
Show resolved Hide resolved
try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream(dataToCompress.length)) {
Expand All @@ -471,7 +487,7 @@ public void testGetContent_gzipEncoding_finishReading() throws IOException {
}
final MockLowLevelHttpResponse mockResponse = new MockLowLevelHttpResponse();
mockResponse.setContent(mockBytes);
mockResponse.setContentEncoding("gzip");
mockResponse.setContentEncoding(contentEncoding);
mockResponse.setContentType("text/plain");

HttpTransport transport =
Expand All @@ -495,4 +511,29 @@ public LowLevelHttpResponse execute() throws IOException {
assertEquals("abcd", response.parseAsString());
assertTrue(output.isClosed());
}

public void testGetContent_otherEncodingWithgzipInItsName_GzipIsNotUsed() throws IOException {
final MockLowLevelHttpResponse mockResponse = new MockLowLevelHttpResponse();
mockResponse.setContent("abcd");
mockResponse.setContentEncoding("otherEncodingWithgzipInItsName");
mockResponse.setContentType("text/plain");

HttpTransport transport =
new MockHttpTransport() {
@Override
public LowLevelHttpRequest buildRequest(String method, final String url)
throws IOException {
return new MockLowLevelHttpRequest() {
@Override
public LowLevelHttpResponse execute() throws IOException {
return mockResponse;
}
};
}
};
HttpRequest request = transport.createRequestFactory().buildHeadRequest(HttpTesting.SIMPLE_GENERIC_URL);
// If gzip was used on this response, an exception would be thrown
HttpResponse response = request.execute();
assertEquals("abcd", response.parseAsString());
}
}