package org.webpieces.webserver;
import java.io.File;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.channels.ServerSocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.webpieces.httpcommon.api.RequestListener;
import org.webpieces.nio.api.channels.TCPServerChannel;
import org.webpieces.router.api.PortConfig;
import org.webpieces.router.api.RouterConfig;
import org.webpieces.templating.api.TemplateConfig;
import org.webpieces.util.file.VirtualFile;
import org.webpieces.util.file.VirtualFileClasspath;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
import org.webpieces.util.security.SecretKeyInfo;
import org.webpieces.webserver.api.WebServer;
import org.webpieces.webserver.api.WebServerConfig;
import org.webpieces.webserver.api.WebServerFactory;
import com.google.inject.Module;
public class WebserverForTest {
private static final Logger log = LoggerFactory.getLogger(WebserverForTest.class);
private File cacheDir = new File(System.getProperty("java.io.tmpdir")+"/webpiecesTestCache");
public static final Charset CHAR_SET_TO_USE = StandardCharsets.UTF_8;
public static void main(String[] args) throws InterruptedException {
new WebserverForTest(null, null, false, null).start();
synchronized (WebserverForTest.class) {
//wait forever for now so server doesn't shut down..
WebserverForTest.class.wait();
}
}
private WebServer webServer;
public WebserverForTest(Module platformOverrides, Module appOverrides, boolean usePortZero, VirtualFile metaFile) {
this(new TestConfig(platformOverrides, appOverrides, usePortZero, metaFile, true));
}
public WebserverForTest(TestConfig testConfig) {
String filePath = System.getProperty("user.dir");
log.info("property user.dir="+filePath);
VirtualFile metaFile = testConfig.getMetaFile();
//Tests can override this...
if(testConfig.getMetaFile() == null)
metaFile = new VirtualFileClasspath("basicMeta.txt", WebserverForTest.class.getClassLoader());
int httpPort = 8080;
int httpsPort = 8443;
if(testConfig.isUsePortZero()) {
httpPort = 0;
httpsPort = 0;
}
//3 pieces to the webserver so a configuration for each piece
WebServerConfig config = new WebServerConfig()
.setPlatformOverrides(testConfig.getPlatformOverrides())
.setHttpListenAddress(new InetSocketAddress(httpPort))
.setHttpsListenAddress(new InetSocketAddress(httpsPort))
.setSslEngineFactory(new SSLEngineFactoryWebServerTesting())
.setFunctionToConfigureServerSocket(s -> configure(s));
RouterConfig routerConfig = new RouterConfig()
.setMetaFile(metaFile )
.setWebappOverrides(testConfig.getAppOverrides())
.setFileEncoding(CHAR_SET_TO_USE)
.setDefaultResponseBodyEncoding(CHAR_SET_TO_USE)
.setCachedCompressedDirectory(cacheDir)
.setSecretKey(SecretKeyInfo.generateForTest())
.setTokenCheckOn(testConfig.isUseTokenCheck())
.setPortConfigCallback(() -> fetchPortsForRedirects());
TemplateConfig templateConfig = new TemplateConfig();
webServer = WebServerFactory.create(config, routerConfig, templateConfig);
}
PortConfig fetchPortsForRedirects() {
int httpPort = getUnderlyingHttpChannel().getLocalAddress().getPort();
int httpsPort = getUnderlyingHttpsChannel().getLocalAddress().getPort();
return new PortConfig(httpPort, httpsPort);
}
public void configure(ServerSocketChannel channel) throws SocketException {
channel.socket().setReuseAddress(true);
//channel.socket().setSoTimeout(timeout);
//channel.socket().setReceiveBufferSize(size);
}
public RequestListener start() {
return webServer.start();
}
public void stop() {
webServer.stop();
}
public TCPServerChannel getUnderlyingHttpChannel() {
return webServer.getUnderlyingHttpChannel();
}
public TCPServerChannel getUnderlyingHttpsChannel() {
return webServer.getUnderlyingHttpsChannel();
}
public File getCacheDir() {
return cacheDir;
}
}