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
27
28 package org.apache.http.impl;
29
30 import java.io.IOException;
31 import java.net.SocketTimeoutException;
32
33 import org.apache.http.HttpClientConnection;
34 import org.apache.http.HttpConnectionMetrics;
35 import org.apache.http.HttpEntity;
36 import org.apache.http.HttpEntityEnclosingRequest;
37 import org.apache.http.HttpException;
38 import org.apache.http.HttpRequest;
39 import org.apache.http.HttpResponse;
40 import org.apache.http.HttpResponseFactory;
41 import org.apache.http.HttpStatus;
42 import org.apache.http.impl.entity.EntityDeserializer;
43 import org.apache.http.impl.entity.EntitySerializer;
44 import org.apache.http.impl.entity.LaxContentLengthStrategy;
45 import org.apache.http.impl.entity.StrictContentLengthStrategy;
46 import org.apache.http.impl.io.DefaultHttpResponseParser;
47 import org.apache.http.impl.io.HttpRequestWriter;
48 import org.apache.http.io.EofSensor;
49 import org.apache.http.io.HttpMessageParser;
50 import org.apache.http.io.HttpMessageWriter;
51 import org.apache.http.io.HttpTransportMetrics;
52 import org.apache.http.io.SessionInputBuffer;
53 import org.apache.http.io.SessionOutputBuffer;
54 import org.apache.http.params.HttpParams;
55 import org.apache.http.util.Args;
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 @Deprecated
76 public abstract class AbstractHttpClientConnection implements HttpClientConnection {
77
78 private final EntitySerializer entityserializer;
79 private final EntityDeserializer entitydeserializer;
80
81 private SessionInputBuffer inBuffer = null;
82 private SessionOutputBuffer outbuffer = null;
83 private EofSensor eofSensor = null;
84 private HttpMessageParser<HttpResponse> responseParser = null;
85 private HttpMessageWriter<HttpRequest> requestWriter = null;
86 private HttpConnectionMetricsImpl metrics = null;
87
88
89
90
91
92
93
94
95
96
97 public AbstractHttpClientConnection() {
98 super();
99 this.entityserializer = createEntitySerializer();
100 this.entitydeserializer = createEntityDeserializer();
101 }
102
103
104
105
106
107
108 protected abstract void assertOpen() throws IllegalStateException;
109
110
111
112
113
114
115
116
117
118
119
120
121
122 protected EntityDeserializer createEntityDeserializer() {
123 return new EntityDeserializer(new LaxContentLengthStrategy());
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137
138 protected EntitySerializer createEntitySerializer() {
139 return new EntitySerializer(new StrictContentLengthStrategy());
140 }
141
142
143
144
145
146
147
148
149
150
151
152
153 protected HttpResponseFactory createHttpResponseFactory() {
154 return DefaultHttpResponseFactory.INSTANCE;
155 }
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 protected HttpMessageParser<HttpResponse> createResponseParser(
174 final SessionInputBuffer buffer,
175 final HttpResponseFactory responseFactory,
176 final HttpParams params) {
177 return new DefaultHttpResponseParser(buffer, null, responseFactory, params);
178 }
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195 protected HttpMessageWriter<HttpRequest> createRequestWriter(
196 final SessionOutputBuffer buffer,
197 final HttpParams params) {
198 return new HttpRequestWriter(buffer, null, params);
199 }
200
201
202
203
204 protected HttpConnectionMetricsImpl createConnectionMetrics(
205 final HttpTransportMetrics inTransportMetric,
206 final HttpTransportMetrics outTransportMetric) {
207 return new HttpConnectionMetricsImpl(inTransportMetric, outTransportMetric);
208 }
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 protected void init(
228 final SessionInputBuffer sessionInputBuffer,
229 final SessionOutputBuffer sessionOutputBuffer,
230 final HttpParams params) {
231 this.inBuffer = Args.notNull(sessionInputBuffer, "Input session buffer");
232 this.outbuffer = Args.notNull(sessionOutputBuffer, "Output session buffer");
233 if (sessionInputBuffer instanceof EofSensor) {
234 this.eofSensor = (EofSensor) sessionInputBuffer;
235 }
236 this.responseParser = createResponseParser(
237 sessionInputBuffer,
238 createHttpResponseFactory(),
239 params);
240 this.requestWriter = createRequestWriter(
241 sessionOutputBuffer, params);
242 this.metrics = createConnectionMetrics(
243 sessionInputBuffer.getMetrics(),
244 sessionOutputBuffer.getMetrics());
245 }
246
247 @Override
248 public boolean isResponseAvailable(final int timeout) throws IOException {
249 assertOpen();
250 try {
251 return this.inBuffer.isDataAvailable(timeout);
252 } catch (final SocketTimeoutException ex) {
253 return false;
254 }
255 }
256
257 @Override
258 public void sendRequestHeader(final HttpRequest request)
259 throws HttpException, IOException {
260 Args.notNull(request, "HTTP request");
261 assertOpen();
262 this.requestWriter.write(request);
263 this.metrics.incrementRequestCount();
264 }
265
266 @Override
267 public void sendRequestEntity(final HttpEntityEnclosingRequest request)
268 throws HttpException, IOException {
269 Args.notNull(request, "HTTP request");
270 assertOpen();
271 if (request.getEntity() == null) {
272 return;
273 }
274 this.entityserializer.serialize(
275 this.outbuffer,
276 request,
277 request.getEntity());
278 }
279
280 protected void doFlush() throws IOException {
281 this.outbuffer.flush();
282 }
283
284 @Override
285 public void flush() throws IOException {
286 assertOpen();
287 doFlush();
288 }
289
290 @Override
291 public HttpResponse receiveResponseHeader()
292 throws HttpException, IOException {
293 assertOpen();
294 final HttpResponse response = this.responseParser.parse();
295 if (response.getStatusLine().getStatusCode() >= HttpStatus.SC_OK) {
296 this.metrics.incrementResponseCount();
297 }
298 return response;
299 }
300
301 @Override
302 public void receiveResponseEntity(final HttpResponse response)
303 throws HttpException, IOException {
304 Args.notNull(response, "HTTP response");
305 assertOpen();
306 final HttpEntity entity = this.entitydeserializer.deserialize(this.inBuffer, response);
307 response.setEntity(entity);
308 }
309
310 protected boolean isEof() {
311 return this.eofSensor != null && this.eofSensor.isEof();
312 }
313
314 @Override
315 public boolean isStale() {
316 if (!isOpen()) {
317 return true;
318 }
319 if (isEof()) {
320 return true;
321 }
322 try {
323 this.inBuffer.isDataAvailable(1);
324 return isEof();
325 } catch (final SocketTimeoutException ex) {
326 return false;
327 } catch (final IOException ex) {
328 return true;
329 }
330 }
331
332 @Override
333 public HttpConnectionMetrics getMetrics() {
334 return this.metrics;
335 }
336
337 }