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 public IoSessionConfig getSessionConfig() {
114 return connector.getSessionConfig();
115 }
116
117
118
119
120 public ProxyIoSession getProxyIoSession() {
121 return proxyIoSession;
122 }
123
124
125
126
127
128 public void setProxyIoSession(ProxyIoSession proxyIoSession) {
129 if (proxyIoSession == null) {
130 throw new IllegalArgumentException("proxySession object cannot be null");
131 }
132
133 if (proxyIoSession.getProxyAddress() == null) {
134 throw new IllegalArgumentException("proxySession.proxyAddress cannot be null");
135 }
136
137 proxyIoSession.setConnector(this);
138 setDefaultRemoteAddress(proxyIoSession.getProxyAddress());
139 this.proxyIoSession = proxyIoSession;
140 }
141
142
143
144
145
146
147
148
149
150
151 @SuppressWarnings("unchecked")
152 @Override
153 protected ConnectFuture connect0(final SocketAddress remoteAddress, final SocketAddress localAddress,
154 final IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
155 if (!proxyIoSession.isReconnectionNeeded()) {
156
157 IoHandler handler = getHandler();
158 if (!(handler instanceof AbstractProxyIoHandler)) {
159 throw new IllegalArgumentException("IoHandler must be an instance of AbstractProxyIoHandler");
160 }
161
162 connector.setHandler(handler);
163 future = new DefaultConnectFuture();
164 }
165
166 ConnectFuture conFuture = connector.connect(proxyIoSession.getProxyAddress(), new ProxyIoSessionInitializer(
167 sessionInitializer, proxyIoSession));
168
169
170
171
172
173
174 if (proxyIoSession.getRequest() instanceof SocksProxyRequest || proxyIoSession.isReconnectionNeeded()) {
175 return conFuture;
176 }
177
178 return future;
179 }
180
181
182
183
184 public void cancelConnectFuture() {
185 future.cancel();
186 }
187
188
189
190
191
192
193
194 protected ConnectFuture fireConnected(final IoSession session) {
195 future.setSession(session);
196 return future;
197 }
198
199
200
201
202
203 public final SocketConnector getConnector() {
204 return connector;
205 }
206
207
208
209
210
211
212
213 private final void setConnector(final SocketConnector connector) {
214 if (connector == null) {
215 throw new IllegalArgumentException("connector cannot be null");
216 }
217
218 this.connector = connector;
219 String className = ProxyFilter.class.getName();
220
221
222 if (connector.getFilterChain().contains(className)) {
223 connector.getFilterChain().remove(className);
224 }
225
226
227 connector.getFilterChain().addFirst(className, proxyFilter);
228 }
229
230
231
232
233 @Override
234 protected void dispose0() throws Exception {
235 if (connector != null) {
236 connector.dispose();
237 }
238 }
239
240
241
242
243 public TransportMetadata getTransportMetadata() {
244 return METADATA;
245 }
246 }