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