1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.example.proxy;
21
22 import java.net.InetSocketAddress;
23 import java.net.URL;
24 import java.security.Security;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
28
29 import org.apache.mina.core.RuntimeIoException;
30 import org.apache.mina.core.future.ConnectFuture;
31 import org.apache.mina.core.session.IdleStatus;
32 import org.apache.mina.core.session.IoSession;
33 import org.apache.mina.filter.logging.LoggingFilter;
34 import org.apache.mina.proxy.ProxyConnector;
35 import org.apache.mina.proxy.handlers.ProxyRequest;
36 import org.apache.mina.proxy.handlers.http.HttpAuthenticationMethods;
37 import org.apache.mina.proxy.handlers.http.HttpProxyConstants;
38 import org.apache.mina.proxy.handlers.http.HttpProxyRequest;
39 import org.apache.mina.proxy.handlers.socks.SocksProxyConstants;
40 import org.apache.mina.proxy.handlers.socks.SocksProxyRequest;
41 import org.apache.mina.proxy.session.ProxyIoSession;
42 import org.apache.mina.proxy.utils.MD4Provider;
43 import org.apache.mina.transport.socket.nio.NioSocketConnector;
44
45
46
47
48
49
50
51 public class ProxyTestClient {
52
53
54
55
56
57
58
59
60 public final static String USER = "TED_KODS";
61
62
63
64
65 public final static String PWD = "EDOUARD";
66
67
68
69
70 public final static String DOMAIN = "MYDOMAIN";
71
72
73
74
75 public final static String WORKSTATION = "MYWORKSTATION";
76
77
78
79
80 private final static boolean USE_HTTP_1_1 = false;
81
82
83
84
85 static {
86 if (Security.getProvider("MINA") == null) {
87 Security.addProvider(new MD4Provider());
88 }
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 public ProxyTestClient(String[] args) throws Exception {
110 if (args.length < 3) {
111 System.out
112 .println(ProxyTestClient.class.getName()
113 + " <proxy-hostname> <proxy-port> <url> <proxy-method> (<proxy-method> is OPTIONNAL)");
114 return;
115 }
116
117
118 NioSocketConnector socketConnector = new NioSocketConnector(Runtime
119 .getRuntime().availableProcessors() + 1);
120
121 ProxyConnector connector = new ProxyConnector(socketConnector);
122
123
124 connector.setConnectTimeoutMillis(5000);
125
126 URL url = new URL(args[2]);
127 int port = url.getPort() == -1 ? url.getDefaultPort() : url.getPort();
128
129 ProxyRequest req = null;
130
131 if (args.length == 4) {
132 if ("SOCKS4".equals(args[3])) {
133 req = new SocksProxyRequest(
134 SocksProxyConstants.SOCKS_VERSION_4,
135 SocksProxyConstants.ESTABLISH_TCPIP_STREAM,
136 new InetSocketAddress(url.getHost(), port), USER);
137 } else if ("SOCKS4a".equals(args[3])) {
138 req = new SocksProxyRequest(
139 SocksProxyConstants.ESTABLISH_TCPIP_STREAM, url
140 .getHost(), port, USER);
141 } else if ("SOCKS5".equals(args[3])) {
142 req = new SocksProxyRequest(
143 SocksProxyConstants.SOCKS_VERSION_5,
144 SocksProxyConstants.ESTABLISH_TCPIP_STREAM,
145 new InetSocketAddress(url.getHost(), port), USER);
146 ((SocksProxyRequest) req).setPassword(PWD);
147 ((SocksProxyRequest) req)
148 .setServiceKerberosName(Socks5GSSAPITestServer.SERVICE_NAME);
149 } else {
150 req = createHttpProxyRequest(args[2]);
151 }
152 } else {
153 req = createHttpProxyRequest(args[2]);
154 }
155
156 ProxyIoSession proxyIoSession = new ProxyIoSession(
157 new InetSocketAddress(args[0], Integer.parseInt(args[1])), req);
158
159
160
161 List<HttpAuthenticationMethods> l = new ArrayList<HttpAuthenticationMethods>();
162 l.add(HttpAuthenticationMethods.DIGEST);
163 l.add(HttpAuthenticationMethods.BASIC);
164 proxyIoSession.setPreferedOrder(l);
165
166 connector.setProxyIoSession(proxyIoSession);
167
168 socketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);
169
170 connector.getFilterChain().addLast("logger", new LoggingFilter());
171
172
173 String cmd = "GET " + url.toExternalForm() + " HTTP/1.0"
174 + HttpProxyConstants.CRLF + HttpProxyConstants.CRLF;
175
176 connector.setHandler(new ClientSessionHandler(cmd));
177
178 IoSession session;
179 for (;;) {
180 try {
181 ConnectFuture future = connector.connect();
182 future.awaitUninterruptibly();
183 session = future.getSession();
184 break;
185 } catch (RuntimeIoException e) {
186 System.err.println("Failed to connect. Retrying in 5 secs ...");
187 Thread.sleep(5000);
188 }
189 }
190
191
192 if (session != null) {
193 session.getCloseFuture().awaitUninterruptibly();
194 }
195 connector.dispose();
196 System.exit(0);
197 }
198
199
200
201
202
203
204
205
206
207
208 private HttpProxyRequest createHttpProxyRequest(String uri) {
209 HttpProxyRequest req = new HttpProxyRequest(uri);
210 HashMap<String, String> props = new HashMap<String, String>();
211 props.put(HttpProxyConstants.USER_PROPERTY, USER);
212 props.put(HttpProxyConstants.PWD_PROPERTY, PWD);
213 props.put(HttpProxyConstants.DOMAIN_PROPERTY, DOMAIN);
214 props.put(HttpProxyConstants.WORKSTATION_PROPERTY, WORKSTATION);
215
216 req.setProperties(props);
217 if (USE_HTTP_1_1) {
218 req.setHttpVersion(HttpProxyConstants.HTTP_1_1);
219 }
220
221 return req;
222 }
223
224
225
226
227 public static void main(String[] args) throws Exception {
228 new ProxyTestClient(args);
229 }
230 }