HTTPCLIENT-1651: Add ability to disable content compression on a request basis

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1682442 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Osipov 2015-05-29 12:28:21 +00:00
parent da8738d14a
commit 5f3ba04de2
3 changed files with 37 additions and 5 deletions

View File

@ -58,12 +58,13 @@ public class RequestConfig implements Cloneable {
private final int connectTimeout;
private final int socketTimeout;
private final boolean decompressionEnabled;
private final boolean contentCompressionEnabled;
/**
* Intended for CDI compatibility
*/
protected RequestConfig() {
this(false, null, null, false, null, false, false, false, 0, false, null, null, 0, 0, 0, false);
this(false, null, null, false, null, false, false, false, 0, false, null, null, 0, 0, 0, false, false);
}
RequestConfig(
@ -82,7 +83,8 @@ protected RequestConfig() {
final int connectionRequestTimeout,
final int connectTimeout,
final int socketTimeout,
final boolean decompressionEnabled) {
final boolean decompressionEnabled,
final boolean contentCompressionEnabled) {
super();
this.expectContinueEnabled = expectContinueEnabled;
this.proxy = proxy;
@ -99,6 +101,7 @@ protected RequestConfig() {
this.connectTimeout = connectTimeout;
this.socketTimeout = socketTimeout;
this.decompressionEnabled = decompressionEnabled;
this.contentCompressionEnabled = contentCompressionEnabled;
}
/**
@ -298,6 +301,18 @@ public boolean isDecompressionEnabled() {
return decompressionEnabled;
}
/**
* Determines whether the target server is requested to compress content.
* <p>
* Default: {@code true}
* </p>
*
* @since 4.5
*/
public boolean isContentCompressionEnabled() {
return contentCompressionEnabled;
}
@Override
protected RequestConfig clone() throws CloneNotSupportedException {
return (RequestConfig) super.clone();
@ -322,6 +337,7 @@ public String toString() {
builder.append(", connectTimeout=").append(connectTimeout);
builder.append(", socketTimeout=").append(socketTimeout);
builder.append(", decompressionEnabled=").append(decompressionEnabled);
builder.append(", contentCompressionEnabled=").append(contentCompressionEnabled);
builder.append("]");
return builder.toString();
}
@ -346,7 +362,8 @@ public static RequestConfig.Builder copy(final RequestConfig config) {
.setConnectionRequestTimeout(config.getConnectionRequestTimeout())
.setConnectTimeout(config.getConnectTimeout())
.setSocketTimeout(config.getSocketTimeout())
.setDecompressionEnabled(config.isDecompressionEnabled());
.setDecompressionEnabled(config.isDecompressionEnabled())
.setContentCompressionEnabled(config.isContentCompressionEnabled());
}
public static class Builder {
@ -367,6 +384,7 @@ public static class Builder {
private int connectTimeout;
private int socketTimeout;
private boolean decompressionEnabled;
private boolean contentCompressionEnabled;
Builder() {
super();
@ -379,6 +397,7 @@ public static class Builder {
this.connectTimeout = -1;
this.socketTimeout = -1;
this.decompressionEnabled = true;
this.contentCompressionEnabled = true;
}
public Builder setExpectContinueEnabled(final boolean expectContinueEnabled) {
@ -456,6 +475,11 @@ public Builder setDecompressionEnabled(final boolean decompressionEnabled) {
return this;
}
public Builder setContentCompressionEnabled(final boolean contentCompressionEnabled) {
this.contentCompressionEnabled = contentCompressionEnabled;
return this;
}
public RequestConfig build() {
return new RequestConfig(
expectContinueEnabled,
@ -473,7 +497,8 @@ public RequestConfig build() {
connectionRequestTimeout,
connectTimeout,
socketTimeout,
decompressionEnabled);
decompressionEnabled,
contentCompressionEnabled);
}
}

View File

@ -33,6 +33,7 @@
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.annotation.Immutable;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.protocol.HttpContext;
/**
@ -76,8 +77,11 @@ public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
final HttpClientContext clientContext = HttpClientContext.adapt(context);
final RequestConfig requestConfig = clientContext.getRequestConfig();
/* Signal support for Accept-Encoding transfer encodings. */
if (!request.containsHeader("Accept-Encoding")) {
if (!request.containsHeader("Accept-Encoding") && requestConfig.isContentCompressionEnabled()) {
request.addHeader("Accept-Encoding", acceptEncoding);
}
}

View File

@ -59,6 +59,7 @@ public void testDefaults() {
Assert.assertEquals(null, config.getProxy());
Assert.assertEquals(null, config.getTargetPreferredAuthSchemes());
Assert.assertEquals(null, config.getProxyPreferredAuthSchemes());
Assert.assertEquals(true, config.isContentCompressionEnabled());
}
@Test
@ -78,6 +79,7 @@ public void testBuildAndCopy() throws Exception {
.setProxy(new HttpHost("someproxy"))
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM))
.setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.DIGEST))
.setContentCompressionEnabled(false)
.build();
final RequestConfig config = RequestConfig.copy(config0).build();
Assert.assertEquals(22, config.getSocketTimeout());
@ -94,6 +96,7 @@ public void testBuildAndCopy() throws Exception {
Assert.assertEquals(new HttpHost("someproxy"), config.getProxy());
Assert.assertEquals(Arrays.asList(AuthSchemes.NTLM), config.getTargetPreferredAuthSchemes());
Assert.assertEquals(Arrays.asList(AuthSchemes.DIGEST), config.getProxyPreferredAuthSchemes());
Assert.assertEquals(false, config.isContentCompressionEnabled());
}
}