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
62
63
64
65 public class ProxyConnector extends AbstractIoConnector {
66 private static final TransportMetadata METADATA = new DefaultTransportMetadata("proxy", "proxyconnector", false,
67 true, InetSocketAddress.class, SocketSessionConfig.class, IoBuffer.class, FileRegion.class);
68
69
70
71
72 private SocketConnector connector = null;
73
74
75
76
77 private final ProxyFilterer.html#ProxyFilter">ProxyFilter proxyFilter = new ProxyFilter();
78
79
80
81
82 private ProxyIoSession proxyIoSession;
83
84
85
86
87 private DefaultConnectFuture future;
88
89
90
91
92 public ProxyConnector() {
93 super(new DefaultSocketSessionConfig(), null);
94 }
95
96
97
98
99
100
101 public ProxyConnector(final SocketConnector connector) {
102 this(connector, new DefaultSocketSessionConfig(), null);
103 }
104
105
106
107
108
109
110
111
112 public ProxyConnector(final SocketConnector connector, IoSessionConfig config, Executor executor) {
113 super(config, executor);
114 setConnector(connector);
115 }
116
117
118
119
120 public IoSessionConfig getSessionConfig() {
121 return connector.getSessionConfig();
122 }
123
124
125
126
127 public ProxyIoSession getProxyIoSession() {
128 return proxyIoSession;
129 }
130
131
132
133
134
135 public void setProxyIoSession(ProxyIoSession proxyIoSession) {
136 if (proxyIoSession == null) {
137 throw new IllegalArgumentException("proxySession object cannot be null");
138 }
139
140 if (proxyIoSession.getProxyAddress() == null) {
141 throw new IllegalArgumentException("proxySession.proxyAddress cannot be null");
142 }
143
144 proxyIoSession.setConnector(this);
145 setDefaultRemoteAddress(proxyIoSession.getProxyAddress());
146 this.proxyIoSession = proxyIoSession;
147 }
148
149
150
151
152
153
154
155
156
157
158 @SuppressWarnings("unchecked")
159 @Override
160 protected ConnectFuture connect0(final SocketAddress remoteAddress, final SocketAddress localAddress,
161 final IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
162 if (!proxyIoSession.isReconnectionNeeded()) {
163
164 IoHandler handler = getHandler();
165 if (!(handler instanceof AbstractProxyIoHandler)) {
166 throw new IllegalArgumentException("IoHandler must be an instance of AbstractProxyIoHandler");
167 }
168
169 connector.setHandler(handler);
170 future = new DefaultConnectFuture();
171 }
172
173 ConnectFuture conFuture = connector.connect(proxyIoSession.getProxyAddress(), new ProxyIoSessionInitializer(
174 sessionInitializer, proxyIoSession));
175
176
177
178
179
180
181 if (proxyIoSession.getRequest() instanceof SocksProxyRequest || proxyIoSession.isReconnectionNeeded()) {
182 return conFuture;
183 }
184
185 return future;
186 }
187
188
189
190
191 public void cancelConnectFuture() {
192 future.cancel();
193 }
194
195
196
197
198
199
200
201 protected ConnectFuture fireConnected(final IoSession session) {
202 future.setSession(session);
203 return future;
204 }
205
206
207
208
209
210 public final SocketConnector getConnector() {
211 return connector;
212 }
213
214
215
216
217
218
219
220 private void setConnector(final SocketConnector connector) {
221 if (connector == null) {
222 throw new IllegalArgumentException("connector cannot be null");
223 }
224
225 this.connector = connector;
226 String className = ProxyFilter.class.getName();
227
228
229 if (connector.getFilterChain().contains(className)) {
230 connector.getFilterChain().remove(className);
231 }
232
233
234 connector.getFilterChain().addFirst(className, proxyFilter);
235 }
236
237
238
239
240 @Override
241 protected void dispose0() throws Exception {
242 if (connector != null) {
243 connector.dispose();
244 }
245 }
246
247
248
249
250 public TransportMetadata getTransportMetadata() {
251 return METADATA;
252 }
253 }