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.pool;
28
29 import java.net.InetSocketAddress;
30 import java.net.SocketAddress;
31 import java.util.concurrent.Future;
32 import java.util.concurrent.TimeUnit;
33 import java.util.concurrent.atomic.AtomicLong;
34
35 import org.apache.http.HttpHost;
36 import org.apache.http.annotation.ThreadingBehavior;
37 import org.apache.http.annotation.Contract;
38 import org.apache.http.concurrent.FutureCallback;
39 import org.apache.http.config.ConnectionConfig;
40 import org.apache.http.nio.NHttpClientConnection;
41 import org.apache.http.nio.pool.AbstractNIOConnPool;
42 import org.apache.http.nio.pool.NIOConnFactory;
43 import org.apache.http.nio.pool.SocketAddressResolver;
44 import org.apache.http.nio.reactor.ConnectingIOReactor;
45 import org.apache.http.params.CoreConnectionPNames;
46 import org.apache.http.params.HttpParams;
47 import org.apache.http.util.Args;
48
49
50
51
52
53
54
55
56
57
58
59 @SuppressWarnings("deprecation")
60 @Contract(threading = ThreadingBehavior.SAFE)
61 public class BasicNIOConnPool extends AbstractNIOConnPool<HttpHost, NHttpClientConnection, BasicNIOPoolEntry> {
62
63 private static final AtomicLong COUNTER = new AtomicLong();
64
65 private final int connectTimeout;
66
67 static class BasicAddressResolver implements SocketAddressResolver<HttpHost> {
68
69 @Override
70 public SocketAddress resolveLocalAddress(final HttpHost host) {
71 return null;
72 }
73
74 @Override
75 public SocketAddress resolveRemoteAddress(final HttpHost host) {
76 final String hostname = host.getHostName();
77 int port = host.getPort();
78 if (port == -1) {
79 if (host.getSchemeName().equalsIgnoreCase("http")) {
80 port = 80;
81 } else if (host.getSchemeName().equalsIgnoreCase("https")) {
82 port = 443;
83 }
84 }
85 return new InetSocketAddress(hostname, port);
86 }
87
88 }
89
90
91
92
93 @Deprecated
94 public BasicNIOConnPool(
95 final ConnectingIOReactor ioReactor,
96 final NIOConnFactory<HttpHost, NHttpClientConnection> connFactory,
97 final HttpParams params) {
98 super(ioReactor, connFactory, 2, 20);
99 Args.notNull(params, "HTTP parameters");
100 this.connectTimeout = params.getIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 0);
101 }
102
103
104
105
106
107 @Deprecated
108 public BasicNIOConnPool(
109 final ConnectingIOReactor ioReactor, final HttpParams params) {
110 this(ioReactor, new BasicNIOConnFactory(params), params);
111 }
112
113
114
115
116 public BasicNIOConnPool(
117 final ConnectingIOReactor ioReactor,
118 final NIOConnFactory<HttpHost, NHttpClientConnection> connFactory,
119 final int connectTimeout) {
120 super(ioReactor, connFactory, new BasicAddressResolver(), 2, 20);
121 this.connectTimeout = connectTimeout;
122 }
123
124
125
126
127 public BasicNIOConnPool(
128 final ConnectingIOReactor ioReactor,
129 final int connectTimeout,
130 final ConnectionConfig config) {
131 this(ioReactor, new BasicNIOConnFactory(config), connectTimeout);
132 }
133
134
135
136
137 public BasicNIOConnPool(
138 final ConnectingIOReactor ioReactor,
139 final ConnectionConfig config) {
140 this(ioReactor, new BasicNIOConnFactory(config), 0);
141 }
142
143
144
145
146 public BasicNIOConnPool(final ConnectingIOReactor ioReactor) {
147 this(ioReactor, new BasicNIOConnFactory(ConnectionConfig.DEFAULT), 0);
148 }
149
150
151
152
153 @Deprecated
154 @Override
155 protected SocketAddress resolveRemoteAddress(final HttpHost host) {
156 return new InetSocketAddress(host.getHostName(), host.getPort());
157 }
158
159
160
161
162 @Deprecated
163 @Override
164 protected SocketAddress resolveLocalAddress(final HttpHost host) {
165 return null;
166 }
167
168 @Override
169 protected BasicNIOPoolEntry createEntry(final HttpHost host, final NHttpClientConnection conn) {
170 final BasicNIOPoolEntrysicNIOPoolEntry.html#BasicNIOPoolEntry">BasicNIOPoolEntry entry = new BasicNIOPoolEntry(
171 Long.toString(COUNTER.getAndIncrement()), host, conn);
172 entry.setSocketTimeout(conn.getSocketTimeout());
173 return entry;
174 }
175
176 @Override
177 public Future<BasicNIOPoolEntry> lease(
178 final HttpHost route,
179 final Object state,
180 final FutureCallback<BasicNIOPoolEntry> callback) {
181 return super.lease(route, state,
182 this.connectTimeout, TimeUnit.MILLISECONDS, callback);
183 }
184
185 @Override
186 public Future<BasicNIOPoolEntry> lease(
187 final HttpHost route,
188 final Object state) {
189 return super.lease(route, state,
190 this.connectTimeout, TimeUnit.MILLISECONDS, null);
191 }
192
193 @Override
194 protected void onLease(final BasicNIOPoolEntry entry) {
195 final NHttpClientConnection conn = entry.getConnection();
196 conn.setSocketTimeout(entry.getSocketTimeout());
197 }
198
199 @Override
200 protected void onRelease(final BasicNIOPoolEntry entry) {
201 final NHttpClientConnection conn = entry.getConnection();
202 entry.setSocketTimeout(conn.getSocketTimeout());
203 conn.setSocketTimeout(0);
204 }
205
206 }