package io.vertx.example.core.http.proxyconnect;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.net.NetClient;
import io.vertx.core.net.NetClientOptions;
import io.vertx.core.net.NetSocket;
import io.vertx.example.util.Runner;
/*
* @author <a href="http://tfox.org">Tim Fox</a>
*/
public class Proxy extends AbstractVerticle {
// Convenience method so you can run it in your IDE
public static void main(String[] args) {
Runner.runExample(Proxy.class);
}
@Override
public void start() throws Exception {
NetClient client = vertx.createNetClient(new NetClientOptions());
vertx.createHttpServer().requestHandler(req -> {
if (req.method() == HttpMethod.CONNECT) {
// Determine proxied server address
String proxyAddress = req.uri();
int idx = proxyAddress.indexOf(':');
String host = proxyAddress.substring(0, idx);
int port = Integer.parseInt(proxyAddress.substring(idx + 1));
System.out.println("Connecting to proxy " + proxyAddress);
client.connect(port, host, ar -> {
if (ar.succeeded()) {
System.out.println("Connected to proxy");
NetSocket clientSocket = req.netSocket();
clientSocket.write("HTTP/1.0 200 Connection established\n\n");
NetSocket serverSocket = ar.result();
serverSocket.handler(buff -> {
System.out.println("Forwarding server packet to the client");
clientSocket.write(buff);
});
serverSocket.closeHandler(v -> {
System.out.println("Server socket closed");
clientSocket.close();
});
clientSocket.handler(buff -> {
System.out.println("Forwarding client packet to the server");
serverSocket.write(buff);
});
clientSocket.closeHandler(v -> {
System.out.println("Client socket closed");
serverSocket.close();
});
} else {
System.out.println("Fail proxy connection");
req.response().setStatusCode(403).end();
}
});
} else {
req.response().setStatusCode(405).end();
}
}).listen(8080);
}
}