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 package org.apache.http.impl.nio.conn;
28
29 import java.io.IOException;
30 import java.net.InetAddress;
31
32 import javax.net.ssl.SSLSession;
33
34 import org.apache.http.HttpConnectionMetrics;
35 import org.apache.http.HttpException;
36 import org.apache.http.HttpRequest;
37 import org.apache.http.HttpResponse;
38 import org.apache.http.impl.conn.ConnectionShutdownException;
39 import org.apache.http.nio.NHttpClientConnection;
40 import org.apache.http.nio.conn.ManagedNHttpClientConnection;
41 import org.apache.http.nio.reactor.IOSession;
42 import org.apache.http.protocol.HttpContext;
43
44 class CPoolProxy implements ManagedNHttpClientConnection {
45
46 private volatile CPoolEntry poolEntry;
47
48 CPoolProxy(final CPoolEntry entry) {
49 super();
50 this.poolEntry = entry;
51 }
52
53 CPoolEntry getPoolEntry() {
54 return this.poolEntry;
55 }
56
57 CPoolEntry detach() {
58 final CPoolEntry local = this.poolEntry;
59 this.poolEntry = null;
60 return local;
61 }
62
63 ManagedNHttpClientConnection getConnection() {
64 final CPoolEntry local = this.poolEntry;
65 if (local == null) {
66 return null;
67 }
68 return local.getConnection();
69 }
70
71 ManagedNHttpClientConnection getValidConnection() {
72 final ManagedNHttpClientConnection conn = getConnection();
73 if (conn == null) {
74 throw new ConnectionShutdownException();
75 }
76 return conn;
77 }
78
79 @Override
80 public void close() throws IOException {
81 final CPoolEntry local = this.poolEntry;
82 if (local != null) {
83 local.closeConnection();
84 }
85 }
86
87 @Override
88 public void shutdown() throws IOException {
89 final CPoolEntry local = this.poolEntry;
90 if (local != null) {
91 local.shutdownConnection();
92 }
93 }
94
95 @Override
96 public HttpConnectionMetrics getMetrics() {
97 return getValidConnection().getMetrics();
98 }
99
100 @Override
101 public void requestInput() {
102 final NHttpClientConnection conn = getConnection();
103 if (conn != null) {
104 conn.requestInput();
105 }
106 }
107
108 @Override
109 public void suspendInput() {
110 final NHttpClientConnection conn = getConnection();
111 if (conn != null) {
112 conn.suspendInput();
113 }
114 }
115
116 @Override
117 public void requestOutput() {
118 final NHttpClientConnection conn = getConnection();
119 if (conn != null) {
120 conn.requestOutput();
121 }
122 }
123
124 @Override
125 public void suspendOutput() {
126 final NHttpClientConnection conn = getConnection();
127 if (conn != null) {
128 conn.suspendOutput();
129 }
130 }
131
132 @Override
133 public InetAddress getLocalAddress() {
134 return getValidConnection().getLocalAddress();
135 }
136
137 @Override
138 public int getLocalPort() {
139 return getValidConnection().getLocalPort();
140 }
141
142 @Override
143 public InetAddress getRemoteAddress() {
144 return getValidConnection().getRemoteAddress();
145 }
146
147 @Override
148 public int getRemotePort() {
149 return getValidConnection().getRemotePort();
150 }
151
152 @Override
153 public boolean isOpen() {
154 final CPoolEntry local = this.poolEntry;
155 if (local != null) {
156 return !local.isClosed();
157 } else {
158 return false;
159 }
160 }
161
162 @Override
163 public boolean isStale() {
164 final NHttpClientConnection conn = getConnection();
165 if (conn != null) {
166 return !conn.isOpen();
167 } else {
168 return false;
169 }
170 }
171
172 @Override
173 public void setSocketTimeout(final int i) {
174 getValidConnection().setSocketTimeout(i);
175 }
176
177 @Override
178 public int getSocketTimeout() {
179 return getValidConnection().getSocketTimeout();
180 }
181
182 @Override
183 public void submitRequest(final HttpRequest request) throws IOException, HttpException {
184 getValidConnection().submitRequest(request);
185 }
186
187 @Override
188 public boolean isRequestSubmitted() {
189 return getValidConnection().isRequestSubmitted();
190 }
191
192 @Override
193 public void resetOutput() {
194 getValidConnection().resetOutput();
195 }
196
197 @Override
198 public void resetInput() {
199 getValidConnection().resetInput();
200 }
201
202 @Override
203 public int getStatus() {
204 return getValidConnection().getStatus();
205 }
206
207 @Override
208 public HttpRequest getHttpRequest() {
209 return getValidConnection().getHttpRequest();
210 }
211
212 @Override
213 public HttpResponse getHttpResponse() {
214 return getValidConnection().getHttpResponse();
215 }
216
217 @Override
218 public HttpContext getContext() {
219 return getValidConnection().getContext();
220 }
221
222 public static NHttpClientConnection newProxy(final CPoolEntry poolEntry) {
223 return new CPoolProxy(poolEntry);
224 }
225
226 private static CPoolProxy getProxy(final NHttpClientConnection conn) {
227 if (!CPoolProxy.class.isInstance(conn)) {
228 throw new IllegalStateException("Unexpected connection proxy class: " + conn.getClass());
229 }
230 return CPoolProxy.class.cast(conn);
231 }
232
233 public static CPoolEntry getPoolEntry(final NHttpClientConnection proxy) {
234 final CPoolEntry entry = getProxy(proxy).getPoolEntry();
235 if (entry == null) {
236 throw new ConnectionShutdownException();
237 }
238 return entry;
239 }
240
241 public static CPoolEntry detach(final NHttpClientConnection proxy) {
242 return getProxy(proxy).detach();
243 }
244
245 @Override
246 public String getId() {
247 return getValidConnection().getId();
248 }
249
250 @Override
251 public void bind(final IOSession iosession) {
252 getValidConnection().bind(iosession);
253 }
254
255 @Override
256 public IOSession getIOSession() {
257 return getValidConnection().getIOSession();
258 }
259
260 @Override
261 public SSLSession getSSLSession() {
262 return getValidConnection().getSSLSession();
263 }
264
265 @Override
266 public String toString() {
267 final StringBuilder sb = new StringBuilder("CPoolProxy{");
268 final ManagedNHttpClientConnection conn = getConnection();
269 if (conn != null) {
270 sb.append(conn);
271 } else {
272 sb.append("detached");
273 }
274 sb.append('}');
275 return sb.toString();
276 }
277
278 }