| /* |
| */ |
| package org.apache.tomcat.lite; |
| |
| import java.io.BufferedInputStream; |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.lang.reflect.Constructor; |
| import java.net.HttpURLConnection; |
| import java.net.URL; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| |
| import org.apache.tomcat.lite.http.BaseMapper; |
| import org.apache.tomcat.lite.http.HttpClient; |
| import org.apache.tomcat.lite.http.Dispatcher; |
| import org.apache.tomcat.lite.http.HttpConnector; |
| import org.apache.tomcat.lite.http.HttpRequest; |
| import org.apache.tomcat.lite.http.HttpResponse; |
| import org.apache.tomcat.lite.http.HttpServer; |
| import org.apache.tomcat.lite.http.HttpChannel.HttpService; |
| import org.apache.tomcat.lite.http.services.EchoCallback; |
| import org.apache.tomcat.lite.http.services.SleepCallback; |
| import org.apache.tomcat.lite.io.BBuffer; |
| import org.apache.tomcat.lite.io.jsse.JsseSslProvider; |
| import org.apache.tomcat.lite.proxy.HttpProxyService; |
| import org.apache.tomcat.lite.proxy.StaticContentService; |
| import org.apache.tomcat.lite.service.IOStatus; |
| |
| /** |
| * Laucher for tomcat-lite standalone, configured with test handlers. |
| * |
| * Used in tests - one is running for the entire suite. |
| * |
| * @author Costin Manolache |
| */ |
| public class TestMain { |
| |
| static { |
| JsseSslProvider.testModeURLConnection(); |
| } |
| |
| static TestMain defaultServer; |
| |
| private boolean init = false; |
| |
| HttpConnector testClient; |
| HttpConnector testServer; |
| HttpConnector testProxy; |
| HttpConnector sslServer; |
| HttpProxyService proxy; |
| |
| public TestMain() { |
| init(); |
| } |
| |
| protected void init() { |
| testClient = HttpClient.newClient(); |
| } |
| |
| /** |
| * A single instance used for all tests. |
| */ |
| public static TestMain shared() { |
| if (defaultServer == null) { |
| defaultServer = new TestMain(); |
| defaultServer.run(); |
| } |
| return defaultServer; |
| } |
| |
| public static HttpConnector getTestServer() { |
| return shared().testServer; |
| } |
| |
| public HttpConnector getClient() { |
| return shared().testClient; |
| } |
| |
| public static BaseMapper.Context initTestContext(Dispatcher d) throws IOException { |
| BaseMapper.Context mCtx = d.addContext(null, "", null, null, null, null); |
| |
| mCtx.addWrapper("/", new StaticContentService() |
| .setContentType("text/html") |
| .setData("<a href='/proc/cpool/client'>Client pool</a><br>" + |
| "<a href='/proc/cpool/server'>Server pool</a><br>" + |
| "<a href='/proc/cpool/proxy'>Proxy pool</a><br>" + |
| "")); |
| |
| mCtx.addWrapper("/favicon.ico", |
| new StaticContentService().setStatus(404).setData("Not found")); |
| |
| mCtx.addWrapper("/hello", new StaticContentService().setData("Hello world")); |
| mCtx.addWrapper("/2nd", new StaticContentService().setData("Hello world2")); |
| mCtx.addWrapper("/echo/*", new EchoCallback()); |
| |
| mCtx.addWrapper("/sleep/1", new SleepCallback().setData("sleep 1")); |
| mCtx.addWrapper("/sleep/10", new SleepCallback().sleep(10000).setData( |
| "sleep 1")); |
| |
| mCtx.addWrapper("/chunked/*", new StaticContentService().setData("AAAA") |
| .chunked()); |
| mCtx.addWrapper("/helloClose", new HttpService() { |
| @Override |
| public void service(HttpRequest httpReq, HttpResponse httpRes) |
| throws IOException { |
| httpRes.setHeader("Connection", "close"); |
| httpRes.getBodyWriter().write("Hello"); |
| } |
| }); |
| return mCtx; |
| } |
| |
| public void initTestCallback(Dispatcher d) throws IOException { |
| BaseMapper.Context mCtx = initTestContext(d); |
| mCtx.addWrapper("/proc/cpool/client", new IOStatus(testClient.cpool)); |
| mCtx.addWrapper("/proc/cpool/proxy", new IOStatus(testProxy.cpool)); |
| mCtx.addWrapper("/proc/cpool/server", new IOStatus(testServer.cpool)); |
| } |
| |
| public void run() { |
| try { |
| startAll(); |
| // TODO(costin): clean up |
| // Hook in JMX and debug properties |
| try { |
| Class c = Class.forName("org.apache.tomcat.lite.TomcatLiteJmx"); |
| Constructor constructor = c.getConstructor(TestMain.class); |
| constructor.newInstance(this); |
| } catch (Throwable t) { |
| // ignore |
| } |
| } catch (Throwable t) { |
| t.printStackTrace(); |
| } |
| } |
| |
| public static String findDir(String dir) { |
| String path = "."; |
| for (int i = 0; i < 5; i++) { |
| File f = new File(path + dir); |
| if (f.exists()) { |
| try { |
| return f.getCanonicalPath(); |
| } catch (IOException e) { |
| return f.getAbsolutePath(); |
| } |
| } |
| path = path + "/.."; |
| } |
| return null; |
| } |
| |
| public int getServerPort() { |
| return 8802; |
| } |
| |
| public int getProxyPort() { |
| return 8903; |
| } |
| |
| public int getSslServerPort() { |
| return 8443; |
| } |
| |
| static String PRIVATE_KEY = |
| "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALsz2milZGHliWte61TfMTSwpAdq" + |
| "9uJkMTqgpSVtwxxOe8kT84QtIzhdAsQYjRz9ZtQn9DYWhJQs/cs/R3wWsjWwgiFHLzGalvsmMYJ3" + |
| "vBO8VMj762fAWu7GjUApIXcxMJoK4sQUpZKbqTuXpwzVUeeqBcspsIDgOLCo233G7/fBAgMBAAEC" + |
| "gYAWEaDX4VeaKuMuYzw+/yjf20sbDMMaIVGkZbfSV8Q+nAn/xHhaxq92P5DJ6VMJbd4neKZTkggD" + |
| "J+KriUQ2Hr7XXd/nM+sllaDWGmUnMYFI4txaNkikMA3ZyE/Xa79eDpTnSst8Nm11vrX9oF/hDNo4" + |
| "dhbU1krjAwVl/WijzSk4gQJBANvSmsmdjPlzvGNE11Aq3Ffb9/SqAOdE8NevMFeVKtBEKHIe1WlO" + |
| "ThRyWv3I8bUKTQMNULruSFVghTh6Hkt/CBkCQQDaAuxaXjv2voYozkOviXMpt0X5LZJMQu2gFc2x" + |
| "6UgBqYP2pNGDdRVWpbxF65PpXcLNKllCss2WB8i8kdeixYHpAkEAnIrzfia7sR2RiCQLLWUIe20D" + |
| "vHGgqRG4bfCtfYGV9rDDGNoKYq7H/dmeIOML9kA6rbS6zBRK4LoWxSx6DIuPaQJAL2c3USbwTuR6" + |
| "c2D2IrL2UXnCQz3/c4mR9Z8IDMk2mPXs9bI8xCKvMxnyaBmjHbj/ZHDy26fZP+gNY8MqagAcEQJA" + |
| "SidPwFV6cO8LCIA43wSVHlKZt4yU5wa9EWfzqVZxj7VSav7431kuxktW/YlwwxO4Pn8hgpPqD+W1" + |
| "E+Ssocxi8A=="; |
| |
| static String CERTIFICATE = "-----BEGIN CERTIFICATE-----\n" + |
| "MIIC5DCCAk2gAwIBAgIJAMa8ioWQMpEZMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV" + |
| "BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEChMJbG9jYWxob3N0MRIwEAYDVQQL" + |
| "Ewlsb2NhbGhvc3QxEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDAyMjYyMzIxNDBa" + |
| "Fw0xMTAyMjYyMzIxNDBaMFYxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTESMBAG" + |
| "A1UEChMJbG9jYWxob3N0MRIwEAYDVQQLEwlsb2NhbGhvc3QxEjAQBgNVBAMTCWxv" + |
| "Y2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuzPaaKVkYeWJa17r" + |
| "VN8xNLCkB2r24mQxOqClJW3DHE57yRPzhC0jOF0CxBiNHP1m1Cf0NhaElCz9yz9H" + |
| "fBayNbCCIUcvMZqW+yYxgne8E7xUyPvrZ8Ba7saNQCkhdzEwmgrixBSlkpupO5en" + |
| "DNVR56oFyymwgOA4sKjbfcbv98ECAwEAAaOBuTCBtjAdBgNVHQ4EFgQUj3OnBK8R" + |
| "UN2CcmPvfQ1/IBeFwn8wgYYGA1UdIwR/MH2AFI9zpwSvEVDdgnJj730NfyAXhcJ/" + |
| "oVqkWDBWMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAoTCWxvY2Fs" + |
| "aG9zdDESMBAGA1UECxMJbG9jYWxob3N0MRIwEAYDVQQDEwlsb2NhbGhvc3SCCQDG" + |
| "vIqFkDKRGTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAKcJWWZbHRuG" + |
| "77ir1ETltxNIsAFvuhDD6E68eBwpviWfKhFxiOdD1vmAGqWWDYpmgORBGxFMZxTq" + |
| "c82iSbM0LseFeHwxAfeNXosSShMFtQzKt2wKZLLQB/Oqrea32m4hU//NP8rNbTux" + |
| "dcAHeNQEDB5EUUSewAlh+fUE6HB6c8j0\n" + |
| "-----END CERTIFICATE-----\n\n"; |
| |
| protected synchronized void startAll() throws IOException { |
| if (init) { |
| System.err.println("2x init ???"); |
| } else { |
| init = true; |
| boolean debug = false; |
| if (debug) { |
| System.setProperty("javax.net.debug", "ssl"); |
| System.setProperty("jsse", "conn_state,alert,engine,record,ssocket,socket,prf"); |
| Logger.getLogger("SSL").setLevel(Level.FINEST); |
| testClient.setDebug(true); |
| testClient.setDebugHttp(true); |
| } |
| |
| proxy = new HttpProxyService() |
| .withHttpClient(testClient); |
| testProxy = HttpServer.newServer(getProxyPort()); |
| |
| if (debug) { |
| testProxy.setDebugHttp(true); |
| testProxy.setDebug(true); |
| } |
| |
| // dispatcher rejects 'http://' |
| testProxy.setHttpService(proxy); |
| try { |
| testProxy.start(); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| |
| testServer = HttpServer.newServer(getServerPort()); |
| if (debug) { |
| testServer.setDebugHttp(true); |
| testServer.setDebug(true); |
| } |
| initTestCallback(testServer.getDispatcher()); |
| try { |
| testServer.start(); |
| } catch (IOException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| // Base64 b64 = new Base64(); |
| // byte[] keyBytes = b64.decode(PRIVATE_KEY); |
| |
| sslServer = HttpServer.newSslServer(getSslServerPort()); |
| |
| if (debug) { |
| sslServer.setDebug(true); |
| sslServer.setDebugHttp(true); |
| } |
| JsseSslProvider sslCon = (JsseSslProvider) sslServer.getSslProvider(); |
| |
| sslCon = sslCon |
| .setKeyRes("org/apache/tomcat/lite/http/genrsa_512.cert", |
| "org/apache/tomcat/lite/http/genrsa_512.der"); |
| initTestCallback(sslServer.getDispatcher()); |
| sslServer.start(); |
| } |
| |
| Runtime.getRuntime().addShutdownHook(new Thread() { |
| public void run() { |
| System.err.println("Done"); |
| } |
| public void start() { |
| System.err.println("Done1"); |
| } |
| }); |
| } |
| |
| /** |
| * Blocking get, returns when the body has been read. |
| */ |
| public static BBuffer get(String url) throws IOException { |
| |
| BBuffer out = BBuffer.allocate(); |
| |
| HttpRequest aclient = HttpClient.newClient().request(url); |
| aclient.send(); |
| aclient.readAll(out, |
| //Long.MAX_VALUE);// |
| 2000000); |
| aclient.release(); // return connection to pool |
| return out; |
| } |
| |
| public static BBuffer getUrl(String path) throws IOException { |
| BBuffer out = BBuffer.allocate(); |
| getUrl(path, out); |
| return out; |
| } |
| |
| public static HttpURLConnection getUrl(String path, |
| BBuffer out) throws IOException { |
| URL url = new URL(path); |
| HttpURLConnection connection = |
| (HttpURLConnection) url.openConnection(); |
| connection.setReadTimeout(10000); |
| connection.connect(); |
| int rc = connection.getResponseCode(); |
| InputStream is = connection.getInputStream(); |
| BufferedInputStream bis = new BufferedInputStream(is); |
| byte[] buf = new byte[2048]; |
| int rd = 0; |
| while((rd = bis.read(buf)) > 0) { |
| out.append(buf, 0, rd); |
| } |
| return connection; |
| } |
| |
| |
| } |