1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.proxy;
21
22 import java.net.InetSocketAddress;
23 import java.net.SocketAddress;
24 import java.util.concurrent.Executor;
25
26 import org.apache.mina.core.buffer.IoBuffer;
27 import org.apache.mina.core.file.FileRegion;
28 import org.apache.mina.core.filterchain.IoFilter;
29 import org.apache.mina.core.future.ConnectFuture;
30 import org.apache.mina.core.future.DefaultConnectFuture;
31 import org.apache.mina.core.service.AbstractIoConnector;
32 import org.apache.mina.core.service.DefaultTransportMetadata;
33 import org.apache.mina.core.service.IoHandler;
34 import org.apache.mina.core.service.TransportMetadata;
35 import org.apache.mina.core.session.IoSession;
36 import org.apache.mina.core.session.IoSessionConfig;
37 import org.apache.mina.core.session.IoSessionInitializer;
38 import org.apache.mina.proxy.filter.ProxyFilter;
39 import org.apache.mina.proxy.handlers.socks.SocksProxyRequest;
40 import org.apache.mina.proxy.session.ProxyIoSession;
41 import org.apache.mina.proxy.session.ProxyIoSessionInitializer;
42 import org.apache.mina.transport.socket.DefaultSocketSessionConfig;
43 import org.apache.mina.transport.socket.SocketConnector;
44 import org.apache.mina.transport.socket.SocketSessionConfig;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public class ProxyConnector extends AbstractIoConnector {
62 private static final TransportMetadata METADATA = new DefaultTransportMetadata(
63 "proxy", "proxyconnector", false, true, InetSocketAddress.class,
64 SocketSessionConfig.class, IoBuffer.class, FileRegion.class);
65
66
67
68
69 private SocketConnector connector = null;
70
71
72
73
74 private final ProxyFilter proxyFilter = new ProxyFilter();
75
76
77
78
79 private ProxyIoSession proxyIoSession;
80
81
82
83
84 private DefaultConnectFuture future;
85
86
87
88
89 public ProxyConnector() {
90 super(new DefaultSocketSessionConfig(), null);
91 }
92
93
94
95
96
97
98 public ProxyConnector(final SocketConnector connector) {
99 this(connector, new DefaultSocketSessionConfig(), null);
100 }
101
102
103
104
105
106 public ProxyConnector(final SocketConnector connector, IoSessionConfig config, Executor executor) {
107 super(config, executor);
108 setConnector(connector);
109 }
110
111
112
113
114 @Override
115 public IoSessionConfig getSessionConfig() {
116 return connector.getSessionConfig();
117 }
118
119
120
121
122 public ProxyIoSession getProxyIoSession() {
123 return proxyIoSession;
124 }
125
126
127
128
129
130 public void setProxyIoSession(ProxyIoSession proxyIoSession) {
131 if (proxyIoSession == null) {
132 throw new IllegalArgumentException("proxySession object cannot be null");
133 }
134
135 if (proxyIoSession.getProxyAddress() == null) {
136 throw new IllegalArgumentException(
137 "proxySession.proxyAddress cannot be null");
138 }
139
140 proxyIoSession.setConnector(this);
141 setDefaultRemoteAddress(proxyIoSession.getProxyAddress());
142 this.proxyIoSession = proxyIoSession;
143 }
144
145
146
147
148
149
150
151
152
153
154 @SuppressWarnings("unchecked")
155 @Override
156 protected ConnectFuture connect0(
157 final SocketAddress remoteAddress,
158 final SocketAddress localAddress,
159 final IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
160 if (!proxyIoSession.isReconnectionNeeded()) {
161
162 IoHandler handler = getHandler();
163 if (!(handler instanceof AbstractProxyIoHandler)) {
164 throw new IllegalArgumentException(
165 "IoHandler must be an instance of AbstractProxyIoHandler");
166 }
167
168 connector.setHandler(handler);
169 future = new DefaultConnectFuture();
170 }
171
172 ConnectFuture conFuture = connector.connect(proxyIoSession
173 .getProxyAddress(), new ProxyIoSessionInitializer(
174 sessionInitializer, proxyIoSession));
175
176
177
178
179
180
181 if (proxyIoSession.getRequest() instanceof SocksProxyRequest
182 || proxyIoSession.isReconnectionNeeded()) {
183 return conFuture;
184 }
185
186 return future;
187 }
188
189
190
191
192 public void cancelConnectFuture() {
193 future.cancel();
194 }
195
196
197
198
199
200
201
202 protected ConnectFuture fireConnected(final IoSession session) {
203 future.setSession(session);
204 return future;
205 }
206
207
208
209
210
211 public final SocketConnector getConnector() {
212 return connector;
213 }
214
215
216
217
218
219
220
221 private final void setConnector(final SocketConnector connector) {
222 if (connector == null) {
223 throw new IllegalArgumentException("connector cannot be null");
224 }
225
226 this.connector = connector;
227 String className = ProxyFilter.class.getName();
228
229
230 if (connector.getFilterChain().contains(className)) {
231 connector.getFilterChain().remove(className);
232 }
233
234
235 connector.getFilterChain().addFirst(className, proxyFilter);
236 }
237
238
239
240
241 @Override
242 protected void dispose0() throws Exception {
243 if (connector != null) {
244 connector.dispose();
245 }
246 }
247
248
249
250
251 public TransportMetadata getTransportMetadata() {
252 return METADATA;
253 }
254 }