// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.URI; import java.nio.charset.StandardCharsets; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSession; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.HandlerWrapper; import org.eclipse.jetty.server.handler.HotSwapHandler; import org.eclipse.jetty.toolchain.test.PropertyFlag; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.junit.After; import org.junit.Before; public class HttpServerTestFixture { // Useful constants protected static final long PAUSE=10L; protected static final int LOOPS= PropertyFlag.isEnabled("test.stress")?250:50; protected QueuedThreadPool _threadPool; protected Server _server; protected URI _serverURI; protected HttpConfiguration _httpConfiguration; protected ServerConnector _connector; protected String _scheme="http"; protected Socket newSocket(String host,int port) throws Exception { Socket socket = new Socket(host,port); socket.setSoTimeout(10000); socket.setTcpNoDelay(true); socket.setSoLinger(false,0); return socket; } @Before public void before() { _threadPool = new QueuedThreadPool(); _server = new Server(_threadPool); } protected void startServer(ServerConnector connector) throws Exception { startServer(connector,new HotSwapHandler()); } protected void startServer(ServerConnector connector, Handler handler) throws Exception { _connector = connector; _httpConfiguration=_connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration(); _httpConfiguration.setBlockingTimeout(-1); _httpConfiguration.setSendDateHeader(false); _server.addConnector(_connector); _server.setHandler(handler); _server.start(); _serverURI = _server.getURI(); } @After public void stopServer() throws Exception { _server.stop(); _server.join(); _server.setConnectors(new Connector[]{}); } protected void configureServer(Handler handler) throws Exception { HotSwapHandler swapper = (HotSwapHandler)_server.getHandler(); swapper.setHandler(handler); handler.start(); } protected static class EchoHandler extends AbstractHandler { boolean _musthavecontent=true; public EchoHandler() {} public EchoHandler(boolean content) { _musthavecontent=false; } @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { baseRequest.setHandled(true); if (request.getContentType()!=null) response.setContentType(request.getContentType()); if (request.getParameter("charset")!=null) response.setCharacterEncoding(request.getParameter("charset")); else if (request.getCharacterEncoding()!=null) response.setCharacterEncoding(request.getCharacterEncoding()); PrintWriter writer=response.getWriter(); int count=0; BufferedReader reader=request.getReader(); if (request.getContentLength()!=0) { String line=reader.readLine(); while (line!=null) { writer.print(line); writer.print("\n"); count+=line.length(); line=reader.readLine(); } } if (count==0) { if (_musthavecontent) throw new IllegalStateException("no input recieved"); writer.println("No content"); } // just to be difficult reader.close(); writer.close(); if (reader.read()>=0) throw new IllegalStateException("Not closed"); } } protected static class OptionsHandler extends AbstractHandler { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { baseRequest.setHandled(true); if (request.getMethod().equals("OPTIONS")) response.setStatus(200); else response.setStatus(500); response.setHeader("Allow", "GET"); } } protected static class HelloWorldHandler extends AbstractHandler { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { baseRequest.setHandled(true); response.setStatus(200); response.getOutputStream().print("Hello world\r\n"); } } protected static class ReadHandler extends AbstractHandler { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { baseRequest.setHandled(true); response.setStatus(200); try { InputStream in = request.getInputStream(); String input= IO.toString(in); response.getWriter().printf("read %d%n",input.length()); } catch(Exception e) { response.getWriter().printf("caught %s%n",e); } } } protected static class DataHandler extends AbstractHandler { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { baseRequest.setHandled(true); response.setStatus(200); InputStream in = request.getInputStream(); String input= IO.toString(in); String tmp = request.getParameter("writes"); int writes=Integer.parseInt(tmp==null?"10":tmp); tmp = request.getParameter("block"); int block=Integer.parseInt(tmp==null?"10":tmp); String encoding=request.getParameter("encoding"); String chars=request.getParameter("chars"); String data = "\u0a870123456789A\u0a87CDEFGHIJKLMNOPQRSTUVWXYZ\u0250bcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; while (data.length()<block) data+=data; String chunk = (input+data).substring(0,block); response.setContentType("text/plain"); if (encoding==null) { byte[] bytes=chunk.getBytes(StandardCharsets.ISO_8859_1); OutputStream out=response.getOutputStream(); for (int i=0;i<writes;i++) { out.write(bytes); } } else if ("true".equals(chars)) { response.setCharacterEncoding(encoding); PrintWriter out=response.getWriter(); char[] c=chunk.toCharArray(); for (int i=0;i<writes;i++) { out.write(c); if (out.checkError()) break; } } else { response.setCharacterEncoding(encoding); PrintWriter out=response.getWriter(); for (int i=0;i<writes;i++) { out.write(chunk); if (out.checkError()) break; } } } } public final static HostnameVerifier __hostnameverifier = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; }