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