diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/UnexpectedDataTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/UnexpectedDataTest.java new file mode 100644 index 00000000000..f4b3d82168c --- /dev/null +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/UnexpectedDataTest.java @@ -0,0 +1,203 @@ +// ======================================================================== +// Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ======================================================================== + +package org.eclipse.jetty.client; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import junit.framework.TestCase; + +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.http.HttpMethods; +import org.eclipse.jetty.io.EofException; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.nio.SelectChannelConnector; +import org.eclipse.jetty.util.IO; + + +/** + * Functional testing for HttpExchange. + * + * @author Matthew Purland + * @author Greg Wilkins + */ +public class UnexpectedDataTest extends TestCase +{ + protected int _maxConnectionsPerAddress = 1; + protected String _scheme = "http://"; + protected Server _server; + protected int _port; + protected HttpClient _httpClient; + protected Connector _connector; + protected AtomicInteger _count = new AtomicInteger(); + + protected void setUp() throws Exception + { + startServer(); + _httpClient=new HttpClient(); + _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); + _httpClient.setMaxConnectionsPerAddress(_maxConnectionsPerAddress); + _httpClient.start(); + } + + protected void tearDown() throws Exception + { + _httpClient.stop(); + Thread.sleep(500); + stopServer(); + } + + public void testUnexpectedData() throws Exception + { + for (int i=0; i<4; i++) + { + final CountDownLatch done=new CountDownLatch(1); + ContentExchange httpExchange=new ContentExchange() + { + protected void onResponseComplete() throws IOException + { + super.onResponseComplete(); + + done.countDown(); + } + }; + httpExchange.setURL(_scheme+"localhost:"+_port+"/?i="+i); + httpExchange.setMethod(HttpMethods.GET); + _httpClient.send(httpExchange); + + done.await(1,TimeUnit.SECONDS); + + int status = httpExchange.getStatus(); + String result=httpExchange.getResponseContent(); + assertEquals("i="+i,0,result.indexOf("")); + assertEquals("i="+i,result.length()-10,result.indexOf("")); + assertEquals(HttpExchange.STATUS_COMPLETED, status); + + Thread.sleep(5); + } + } + + public static void copyStream(InputStream in, OutputStream out) + { + try + { + byte[] buffer=new byte[1024]; + int len; + while ((len=in.read(buffer))>=0) + { + out.write(buffer,0,len); + } + } + catch (EofException e) + { + System.err.println(e); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + protected void newServer() throws Exception + { + _server=new Server(); + _server.setGracefulShutdown(500); + _connector=new SelectChannelConnector(); + + _connector.setPort(0); + _server.setConnectors(new Connector[] { _connector }); + } + + protected void startServer() throws Exception + { + newServer(); + _server.setHandler(new AbstractHandler() + { + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException + { + int i=0; + try + { + baseRequest.setHandled(true); + response.setStatus(200); + _count.incrementAndGet(); + + if (request.getMethod().equalsIgnoreCase("GET")) + { + StringBuffer buffer = new StringBuffer(); + buffer.append("\r\n"); + for (; i<100; i++) + { + buffer.append(" "+i+"\r\n"); + } + buffer.append("\r\n"); + + byte[] buff = buffer.toString().getBytes(); + response.setContentLength(buff.length); + + buffer.append("extra data"); + buff = buffer.toString().getBytes(); + + OutputStream out = response.getOutputStream(); + out.write(buff, 0, buff.length); + out.flush(); + } + else + { + response.setContentType(request.getContentType()); + int size=request.getContentLength(); + ByteArrayOutputStream bout = new ByteArrayOutputStream(size>0?size:32768); + IO.copy(request.getInputStream(),bout); + response.getOutputStream().write(bout.toByteArray()); + } + } + catch(IOException e) + { + e.printStackTrace(); + throw e; + } + catch(Throwable e) + { + e.printStackTrace(); + throw new ServletException(e); + } + finally + { + // System.err.println("HANDLED "+i); + } + } + }); + _server.start(); + _port=_connector.getLocalPort(); + } + + private void stopServer() throws Exception + { + _server.stop(); + } + +}