// // ======================================================================== // 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.handler; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; import java.io.IOException; import java.util.Arrays; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.LocalConnector; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * Resource Handler test */ public class BufferedResponseHandlerTest { private static Server _server; private static HttpConfiguration _config; private static LocalConnector _local; private static ContextHandler _contextHandler; private static BufferedResponseHandler _bufferedHandler; private static TestHandler _test; @BeforeClass public static void setUp() throws Exception { _server = new Server(); _config = new HttpConfiguration(); _config.setOutputBufferSize(1024); _config.setOutputAggregationSize(256); _local = new LocalConnector(_server,new HttpConnectionFactory(_config)); _server.addConnector(_local); _bufferedHandler = new BufferedResponseHandler(); _bufferedHandler.getPathIncludeExclude().include("/include/*"); _bufferedHandler.getPathIncludeExclude().exclude("*.exclude"); _bufferedHandler.getMimeIncludeExclude().exclude("text/excluded"); _bufferedHandler.setHandler(_test=new TestHandler()); _contextHandler = new ContextHandler("/ctx"); _contextHandler.setHandler(_bufferedHandler); _server.setHandler(_contextHandler); _server.start(); // BufferedResponseHandler.LOG.setDebugEnabled(true); } @AfterClass public static void tearDown() throws Exception { _server.stop(); } @Before public void before() { _test._bufferSize=-1; _test._mimeType=null; _test._content=new byte[128]; Arrays.fill(_test._content,(byte)'X'); _test._content[_test._content.length-1]='\n'; _test._writes=10; _test._flush=false; _test._close=false; _test._reset=false; } @Test public void testNormal() throws Exception { String response = _local.getResponse("GET /ctx/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 7")); assertThat(response,not(containsString("Content-Length: "))); assertThat(response,not(containsString("Write: 8"))); assertThat(response,not(containsString("Write: 9"))); assertThat(response,not(containsString("Written: true"))); } @Test public void testIncluded() throws Exception { String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 9")); assertThat(response,containsString("Written: true")); } @Test public void testExcludedByPath() throws Exception { String response = _local.getResponse("GET /ctx/include/path.exclude HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 7")); assertThat(response,not(containsString("Content-Length: "))); assertThat(response,not(containsString("Write: 8"))); assertThat(response,not(containsString("Write: 9"))); assertThat(response,not(containsString("Written: true"))); } @Test public void testExcludedByMime() throws Exception { _test._mimeType="text/excluded"; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 7")); assertThat(response,not(containsString("Content-Length: "))); assertThat(response,not(containsString("Write: 8"))); assertThat(response,not(containsString("Write: 9"))); assertThat(response,not(containsString("Written: true"))); } @Test public void testFlushed() throws Exception { _test._flush=true; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 9")); assertThat(response,containsString("Written: true")); } @Test public void testClosed() throws Exception { _test._close=true; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 9")); assertThat(response,not(containsString("Written: true"))); } @Test public void testBufferSizeSmall() throws Exception { _test._bufferSize=16; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 9")); assertThat(response,containsString("Written: true")); } @Test public void testBufferSizeBig() throws Exception { _test._bufferSize=4096; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Content-Length: ")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 9")); assertThat(response,containsString("Written: true")); } @Test public void testOne() throws Exception { _test._writes=1; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Content-Length: ")); assertThat(response,containsString("Write: 0")); assertThat(response,not(containsString("Write: 1"))); assertThat(response,containsString("Written: true")); } @Test public void testFlushEmpty() throws Exception { _test._writes=1; _test._flush=true; _test._close=false; _test._content = new byte[0]; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Content-Length: ")); assertThat(response,containsString("Write: 0")); assertThat(response,not(containsString("Write: 1"))); assertThat(response,containsString("Written: true")); } @Test public void testReset() throws Exception { _test._reset=true; String response = _local.getResponse("GET /ctx/include/path HTTP/1.1\r\nHost: localhost\r\n\r\n"); assertThat(response,containsString(" 200 OK")); assertThat(response,containsString("Write: 0")); assertThat(response,containsString("Write: 9")); assertThat(response,containsString("Written: true")); assertThat(response,not(containsString("RESET"))); } public static class TestHandler extends AbstractHandler { int _bufferSize; String _mimeType; byte[] _content; int _writes; boolean _flush; boolean _close; boolean _reset; @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { baseRequest.setHandled(true); if (_bufferSize>0) response.setBufferSize(_bufferSize); if (_mimeType!=null) response.setContentType(_mimeType); if (_reset) { response.getOutputStream().print("THIS WILL BE RESET"); response.getOutputStream().flush(); response.getOutputStream().print("THIS WILL BE RESET"); response.resetBuffer(); } for (int i=0;i<_writes;i++) { response.addHeader("Write",Integer.toString(i)); response.getOutputStream().write(_content); if (_flush) response.getOutputStream().flush(); } if (_close) response.getOutputStream().close(); response.addHeader("Written","true"); } } }