package jp.vmi.selenium.testutils;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import org.junit.rules.ExternalResource;
import org.littleshoot.proxy.HttpFilters;
import org.littleshoot.proxy.HttpFiltersAdapter;
import org.littleshoot.proxy.HttpFiltersSourceAdapter;
import org.littleshoot.proxy.HttpProxyServer;
import org.littleshoot.proxy.impl.DefaultHttpProxyServer;
import org.openqa.selenium.net.PortProber;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.HttpRequest;
/**
* Web proxy resource class for test.
*
* @author hayato
*/
public class WebProxyResource extends ExternalResource {
/** Dummy URI for proxy test */
public static final String DUMMY_URI = "http://dummy.example.com/";
private final int proxyPort;
private final HttpProxyServer proxyServer;
private InetAddress localHost;
private int localPort;
private int count;
/**
* Constructor.
*/
public WebProxyResource() {
localHost = InetAddress.getLoopbackAddress();
proxyPort = PortProber.findFreePort();
proxyServer = DefaultHttpProxyServer.bootstrap()
.withPort(proxyPort)
.withFiltersSource(new HttpFiltersSourceAdapter() {
@Override
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
return new HttpFiltersAdapter(originalRequest) {
@Override
public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHostAndPort) {
String[] sp = resolvingServerHostAndPort.split(":", 2);
if (!sp[0].endsWith(".example.com"))
return null;
synchronized (WebProxyResource.this) {
count++;
}
// redirect to local web server from dummy URI.
return new InetSocketAddress(localHost, localPort);
}
};
}
}).start();
Runtime.getRuntime().addShutdownHook(new Thread(() -> proxyServer.stop()));
}
/**
* Set port number of local web server.
*
* @param localPort port number.
*/
public synchronized void setLocalPort(int localPort) {
this.localPort = localPort;
}
/**
* Reset request count.
*/
public synchronized void resetCount() {
count = 0;
}
/**
* Get request count.
*
* @return request count.
*/
public synchronized int getCount() {
return count;
}
/**
* Get proxyPort number.
*
* @return proxyPort number.
*/
public int getPort() {
return proxyPort;
}
/**
* Get server name.
*
* @return server name.
*/
public String getServerNameString() {
return "localhost:" + proxyPort;
}
}