1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package org.apache.http.impl.client;
27
28 import java.io.IOException;
29 import java.net.URI;
30
31 import org.apache.http.HttpEntity;
32 import org.apache.http.HttpEntityEnclosingRequest;
33 import org.apache.http.HttpException;
34 import org.apache.http.HttpHost;
35 import org.apache.http.HttpRequest;
36 import org.apache.http.HttpRequestInterceptor;
37 import org.apache.http.HttpResponse;
38 import org.apache.http.HttpResponseInterceptor;
39 import org.apache.http.client.ClientProtocolException;
40 import org.apache.http.client.HttpClient;
41 import org.apache.http.client.ResponseHandler;
42 import org.apache.http.client.methods.HttpUriRequest;
43 import org.apache.http.client.protocol.RequestAcceptEncoding;
44 import org.apache.http.client.protocol.ResponseContentEncoding;
45 import org.apache.http.client.utils.URIUtils;
46 import org.apache.http.conn.ClientConnectionManager;
47 import org.apache.http.params.HttpParams;
48 import org.apache.http.protocol.BasicHttpContext;
49 import org.apache.http.protocol.HttpContext;
50 import org.apache.http.util.EntityUtils;
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 public class DecompressingHttpClient implements HttpClient {
75
76 private HttpClient backend;
77 private HttpRequestInterceptor acceptEncodingInterceptor;
78 private HttpResponseInterceptor contentEncodingInterceptor;
79
80
81
82
83
84
85
86 public DecompressingHttpClient(HttpClient backend) {
87 this(backend, new RequestAcceptEncoding(), new ResponseContentEncoding());
88 }
89
90 DecompressingHttpClient(HttpClient backend,
91 HttpRequestInterceptor requestInterceptor,
92 HttpResponseInterceptor responseInterceptor) {
93 this.backend = backend;
94 this.acceptEncodingInterceptor = requestInterceptor;
95 this.contentEncodingInterceptor = responseInterceptor;
96 }
97
98 public HttpParams getParams() {
99 return backend.getParams();
100 }
101
102 public ClientConnectionManager getConnectionManager() {
103 return backend.getConnectionManager();
104 }
105
106 public HttpResponse execute(HttpUriRequest request) throws IOException,
107 ClientProtocolException {
108 return execute(getHttpHost(request), request, (HttpContext)null);
109 }
110
111 HttpHost getHttpHost(HttpUriRequest request) {
112 URI uri = request.getURI();
113 return URIUtils.extractHost(uri);
114 }
115
116 public HttpResponse execute(HttpUriRequest request, HttpContext context)
117 throws IOException, ClientProtocolException {
118 return execute(getHttpHost(request), request, context);
119 }
120
121 public HttpResponse execute(HttpHost target, HttpRequest request)
122 throws IOException, ClientProtocolException {
123 return execute(target, request, (HttpContext)null);
124 }
125
126 public HttpResponse execute(HttpHost target, HttpRequest request,
127 HttpContext context) throws IOException, ClientProtocolException {
128 try {
129 if (context == null) context = new BasicHttpContext();
130 HttpRequest wrapped;
131 if (request instanceof HttpEntityEnclosingRequest) {
132 wrapped = new EntityEnclosingRequestWrapper((HttpEntityEnclosingRequest) request);
133 } else {
134 wrapped = new RequestWrapper(request);
135 }
136 acceptEncodingInterceptor.process(wrapped, context);
137 HttpResponse response = backend.execute(target, wrapped, context);
138 try {
139 contentEncodingInterceptor.process(response, context);
140 if (Boolean.TRUE.equals(context.getAttribute(ResponseContentEncoding.UNCOMPRESSED))) {
141 response.removeHeaders("Content-Length");
142 response.removeHeaders("Content-Encoding");
143 response.removeHeaders("Content-MD5");
144 }
145 return response;
146 } catch (HttpException ex) {
147 EntityUtils.consume(response.getEntity());
148 throw ex;
149 } catch (IOException ex) {
150 EntityUtils.consume(response.getEntity());
151 throw ex;
152 } catch (RuntimeException ex) {
153 EntityUtils.consume(response.getEntity());
154 throw ex;
155 }
156 } catch (HttpException e) {
157 throw new ClientProtocolException(e);
158 }
159 }
160
161 public <T> T execute(HttpUriRequest request,
162 ResponseHandler<? extends T> responseHandler) throws IOException,
163 ClientProtocolException {
164 return execute(getHttpHost(request), request, responseHandler);
165 }
166
167 public <T> T execute(HttpUriRequest request,
168 ResponseHandler<? extends T> responseHandler, HttpContext context)
169 throws IOException, ClientProtocolException {
170 return execute(getHttpHost(request), request, responseHandler, context);
171 }
172
173 public <T> T execute(HttpHost target, HttpRequest request,
174 ResponseHandler<? extends T> responseHandler) throws IOException,
175 ClientProtocolException {
176 return execute(target, request, responseHandler, null);
177 }
178
179 public <T> T execute(HttpHost target, HttpRequest request,
180 ResponseHandler<? extends T> responseHandler, HttpContext context)
181 throws IOException, ClientProtocolException {
182 HttpResponse response = execute(target, request, context);
183 try {
184 return responseHandler.handleResponse(response);
185 } finally {
186 HttpEntity entity = response.getEntity();
187 if (entity != null) EntityUtils.consume(entity);
188 }
189 }
190
191 }