HTTPCLIENT-1464: ability to enable / disable content decompression at request level

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1570142 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2014-02-20 10:53:52 +00:00
parent 3826597f1a
commit 24d5d8b454
3 changed files with 53 additions and 4 deletions

View File

@ -51,6 +51,7 @@ public class RequestConfig implements Cloneable {
private final int connectionRequestTimeout;
private final int connectTimeout;
private final int socketTimeout;
private final boolean decompressionEnabled;
RequestConfig(
final boolean expectContinueEnabled,
@ -67,7 +68,8 @@ public class RequestConfig implements Cloneable {
final Collection<String> proxyPreferredAuthSchemes,
final int connectionRequestTimeout,
final int connectTimeout,
final int socketTimeout) {
final int socketTimeout,
final boolean decompressionEnabled) {
super();
this.expectContinueEnabled = expectContinueEnabled;
this.proxy = proxy;
@ -84,6 +86,7 @@ public class RequestConfig implements Cloneable {
this.connectionRequestTimeout = connectionRequestTimeout;
this.connectTimeout = connectTimeout;
this.socketTimeout = socketTimeout;
this.decompressionEnabled = decompressionEnabled;
}
/**
@ -263,6 +266,17 @@ public int getSocketTimeout() {
return socketTimeout;
}
/**
* Determines whether compressed entities should be decompressed automatically.
* <p/>
* Default: <code>true</code>
*
* @since 4.4
*/
public boolean isDecompressionEnabled() {
return decompressionEnabled;
}
@Override
protected RequestConfig clone() throws CloneNotSupportedException {
return (RequestConfig) super.clone();
@ -286,6 +300,7 @@ public String toString() {
builder.append(", connectionRequestTimeout=").append(connectionRequestTimeout);
builder.append(", connectTimeout=").append(connectTimeout);
builder.append(", socketTimeout=").append(socketTimeout);
builder.append(", decompressionEnabled=").append(decompressionEnabled);
builder.append("]");
return builder.toString();
}
@ -310,7 +325,8 @@ public static RequestConfig.Builder copy(final RequestConfig config) {
.setProxyPreferredAuthSchemes(config.getProxyPreferredAuthSchemes())
.setConnectionRequestTimeout(config.getConnectionRequestTimeout())
.setConnectTimeout(config.getConnectTimeout())
.setSocketTimeout(config.getSocketTimeout());
.setSocketTimeout(config.getSocketTimeout())
.setDecompressionEnabled(config.isDecompressionEnabled());
}
public static class Builder {
@ -330,6 +346,7 @@ public static class Builder {
private int connectionRequestTimeout;
private int connectTimeout;
private int socketTimeout;
private boolean decompressionEnabled;
Builder() {
super();
@ -341,6 +358,7 @@ public static class Builder {
this.connectionRequestTimeout = -1;
this.connectTimeout = -1;
this.socketTimeout = -1;
this.decompressionEnabled = true;
}
public Builder setExpectContinueEnabled(final boolean expectContinueEnabled) {
@ -418,6 +436,11 @@ public Builder setSocketTimeout(final int socketTimeout) {
return this;
}
public Builder setDecompressionEnabled(final boolean decompressionEnabled) {
this.decompressionEnabled = decompressionEnabled;
return this;
}
public RequestConfig build() {
return new RequestConfig(
expectContinueEnabled,
@ -434,7 +457,8 @@ public RequestConfig build() {
proxyPreferredAuthSchemes,
connectionRequestTimeout,
connectTimeout,
socketTimeout);
socketTimeout,
decompressionEnabled);
}
}

View File

@ -36,6 +36,7 @@
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.annotation.Immutable;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.DeflateDecompressingEntity;
import org.apache.http.client.entity.GzipDecompressingEntity;
import org.apache.http.protocol.HttpContext;
@ -74,9 +75,11 @@ public void process(
final HttpContext context) throws HttpException, IOException {
final HttpEntity entity = response.getEntity();
final HttpClientContext clientContext = HttpClientContext.adapt(context);
final RequestConfig requestConfig = clientContext.getRequestConfig();
// entity can be null in case of 304 Not Modified, 204 No Content or similar
// check for zero length entity.
if (entity != null && entity.getContentLength() != 0) {
if (requestConfig.isDecompressionEnabled() && entity != null && entity.getContentLength() != 0) {
final Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
final HeaderElement[] codecs = ceheader.getElements();

View File

@ -31,6 +31,7 @@
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.HttpVersion;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.DeflateDecompressingEntity;
import org.apache.http.client.entity.GzipDecompressingEntity;
import org.apache.http.entity.StringEntity;
@ -154,4 +155,25 @@ public void testUnknownContentEncoding() throws Exception {
interceptor.process(response, context);
}
@Test
public void testContentEncodingRequestParameter() throws Exception {
final HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final StringEntity original = new StringEntity("encoded stuff");
original.setContentEncoding("GZip");
response.setEntity(original);
final RequestConfig config = RequestConfig.custom()
.setDecompressionEnabled(false)
.build();
final HttpContext context = new BasicHttpContext();
context.setAttribute(HttpClientContext.REQUEST_CONFIG, config);
final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
interceptor.process(response, context);
final HttpEntity entity = response.getEntity();
Assert.assertNotNull(entity);
Assert.assertFalse(entity instanceof GzipDecompressingEntity);
}
}