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.io.OutputStream;
32 import java.net.Socket;
33 import java.net.SocketTimeoutException;
34 import java.nio.charset.CharsetDecoder;
35 import java.nio.charset.CharsetEncoder;
36
37 import org.apache.http.HttpClientConnection;
38 import org.apache.http.HttpEntity;
39 import org.apache.http.HttpEntityEnclosingRequest;
40 import org.apache.http.HttpException;
41 import org.apache.http.HttpRequest;
42 import org.apache.http.HttpResponse;
43 import org.apache.http.HttpStatus;
44 import org.apache.http.config.MessageConstraints;
45 import org.apache.http.entity.ContentLengthStrategy;
46 import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
47 import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
48 import org.apache.http.io.HttpMessageParser;
49 import org.apache.http.io.HttpMessageParserFactory;
50 import org.apache.http.io.HttpMessageWriter;
51 import org.apache.http.io.HttpMessageWriterFactory;
52 import org.apache.http.util.Args;
53
54
55
56
57
58
59 public class DefaultBHttpClientConnection extends BHttpConnectionBase
60 implements HttpClientConnection {
61
62 private final HttpMessageParser<HttpResponse> responseParser;
63 private final HttpMessageWriter<HttpRequest> requestWriter;
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 public DefaultBHttpClientConnection(
86 final int bufferSize,
87 final int fragmentSizeHint,
88 final CharsetDecoder charDecoder,
89 final CharsetEncoder charEncoder,
90 final MessageConstraints constraints,
91 final ContentLengthStrategy incomingContentStrategy,
92 final ContentLengthStrategy outgoingContentStrategy,
93 final HttpMessageWriterFactory<HttpRequest> requestWriterFactory,
94 final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
95 super(bufferSize, fragmentSizeHint, charDecoder, charEncoder,
96 constraints, incomingContentStrategy, outgoingContentStrategy);
97 this.requestWriter = (requestWriterFactory != null ? requestWriterFactory :
98 DefaultHttpRequestWriterFactory.INSTANCE).create(getSessionOutputBuffer());
99 this.responseParser = (responseParserFactory != null ? responseParserFactory :
100 DefaultHttpResponseParserFactory.INSTANCE).create(getSessionInputBuffer(), constraints);
101 }
102
103 public DefaultBHttpClientConnection(
104 final int bufferSize,
105 final CharsetDecoder charDecoder,
106 final CharsetEncoder charEncoder,
107 final MessageConstraints constraints) {
108 this(bufferSize, bufferSize, charDecoder, charEncoder, constraints, null, null, null, null);
109 }
110
111 public DefaultBHttpClientConnection(final int bufferSize) {
112 this(bufferSize, bufferSize, null, null, null, null, null, null, null);
113 }
114
115 protected void onResponseReceived(final HttpResponse response) {
116 }
117
118 protected void onRequestSubmitted(final HttpRequest request) {
119 }
120
121 @Override
122 public void bind(final Socket socket) throws IOException {
123 super.bind(socket);
124 }
125
126 @Override
127 public boolean isResponseAvailable(final int timeout) throws IOException {
128 ensureOpen();
129 try {
130 return awaitInput(timeout);
131 } catch (final SocketTimeoutException ex) {
132 return false;
133 }
134 }
135
136 @Override
137 public void sendRequestHeader(final HttpRequest request)
138 throws HttpException, IOException {
139 Args.notNull(request, "HTTP request");
140 ensureOpen();
141 this.requestWriter.write(request);
142 onRequestSubmitted(request);
143 incrementRequestCount();
144 }
145
146 @Override
147 public void sendRequestEntity(final HttpEntityEnclosingRequest request)
148 throws HttpException, IOException {
149 Args.notNull(request, "HTTP request");
150 ensureOpen();
151 final HttpEntity entity = request.getEntity();
152 if (entity == null) {
153 return;
154 }
155 final OutputStream outStream = prepareOutput(request);
156 entity.writeTo(outStream);
157 outStream.close();
158 }
159
160 @Override
161 public HttpResponse receiveResponseHeader() throws HttpException, IOException {
162 ensureOpen();
163 final HttpResponse response = this.responseParser.parse();
164 onResponseReceived(response);
165 if (response.getStatusLine().getStatusCode() >= HttpStatus.SC_OK) {
166 incrementResponseCount();
167 }
168 return response;
169 }
170
171 @Override
172 public void receiveResponseEntity(
173 final HttpResponse response) throws HttpException, IOException {
174 Args.notNull(response, "HTTP response");
175 ensureOpen();
176 final HttpEntity entity = prepareInput(response);
177 response.setEntity(entity);
178 }
179
180 @Override
181 public void flush() throws IOException {
182 ensureOpen();
183 doFlush();
184 }
185
186 }