// // ======================================================================== // 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.http; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import org.junit.Test; public class HttpTesterTest { public void testExampleUsage() throws Exception { try(Socket socket = new Socket("www.google.com",80)) { HttpTester.Request request = HttpTester.newRequest(); request.setMethod("POST"); request.setURI("/search"); request.setVersion(HttpVersion.HTTP_1_0); request.put(HttpHeader.HOST,"www.google.com"); request.put("Content-Type","application/x-www-form-urlencoded"); request.setContent("q=jetty%20server"); ByteBuffer output = request.generate(); socket.getOutputStream().write(output.array(),output.arrayOffset()+output.position(),output.remaining()); HttpTester.Input input = HttpTester.from(socket.getInputStream()); HttpTester.Response response = HttpTester.parseResponse(input); System.err.printf("%s %s %s%n",response.getVersion(),response.getStatus(),response.getReason()); for (HttpField field:response) System.err.printf("%s: %s%n",field.getName(),field.getValue()); System.err.printf("%n%s%n",response.getContent()); } } @Test public void testGetRequestBuffer10() { HttpTester.Request request =HttpTester.parseRequest( "GET /uri HTTP/1.0\r\n"+ "Host: localhost\r\n"+ "Connection: keep-alive\r\n"+ "\r\n"+ "GET /some/other/request /HTTP/1.0\r\n"+ "Host: localhost\r\n"+ "\r\n" ); assertThat(request.getMethod(),is("GET")); assertThat(request.getUri(),is("/uri")); assertThat(request.getVersion(),is(HttpVersion.HTTP_1_0)); assertThat(request.get(HttpHeader.HOST),is("localhost")); assertThat(request.getContent(),is("")); } @Test public void testGetRequestBuffer11() { HttpTester.Request request =HttpTester.parseRequest( "GET /uri HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "\r\n"+ "GET /some/other/request /HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "\r\n" ); assertThat(request.getMethod(),is("GET")); assertThat(request.getUri(),is("/uri")); assertThat(request.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(request.get(HttpHeader.HOST),is("localhost")); assertThat(request.getContent(),is("")); } @Test public void testPostRequestBuffer10() { HttpTester.Request request =HttpTester.parseRequest( "POST /uri HTTP/1.0\r\n"+ "Host: localhost\r\n"+ "Connection: keep-alive\r\n"+ "Content-Length: 16\r\n"+ "\r\n"+ "0123456789ABCDEF"+ "\r\n"+ "GET /some/other/request /HTTP/1.0\r\n"+ "Host: localhost\r\n"+ "\r\n" ); assertThat(request.getMethod(),is("POST")); assertThat(request.getUri(),is("/uri")); assertThat(request.getVersion(),is(HttpVersion.HTTP_1_0)); assertThat(request.get(HttpHeader.HOST),is("localhost")); assertThat(request.getContent(),is("0123456789ABCDEF")); } @Test public void testPostRequestBuffer11() { HttpTester.Request request =HttpTester.parseRequest( "POST /uri HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "\r\n"+ "A\r\n"+ "0123456789\r\n"+ "6\r\n"+ "ABCDEF\r\n"+ "0\r\n"+ "\r\n"+ "GET /some/other/request /HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "\r\n" ); assertThat(request.getMethod(),is("POST")); assertThat(request.getUri(),is("/uri")); assertThat(request.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(request.get(HttpHeader.HOST),is("localhost")); assertThat(request.getContent(),is("0123456789ABCDEF")); } @Test public void testResponseEOFBuffer() { HttpTester.Response response =HttpTester.parseResponse( "HTTP/1.1 200 OK\r\n"+ "Header: value\r\n"+ "Connection: close\r\n"+ "\r\n"+ "0123456789ABCDEF" ); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(200)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Header"),is("value")); assertThat(response.getContent(),is("0123456789ABCDEF")); } @Test public void testResponseLengthBuffer() { HttpTester.Response response =HttpTester.parseResponse( "HTTP/1.1 200 OK\r\n"+ "Header: value\r\n"+ "Content-Length: 16\r\n"+ "\r\n"+ "0123456789ABCDEF"+ "HTTP/1.1 200 OK\r\n"+ "\r\n" ); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(200)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Header"),is("value")); assertThat(response.getContent(),is("0123456789ABCDEF")); } @Test public void testResponseChunkedBuffer() { HttpTester.Response response =HttpTester.parseResponse( "HTTP/1.1 200 OK\r\n"+ "Header: value\r\n"+ "Transfer-Encoding: chunked\r\n"+ "\r\n"+ "A\r\n"+ "0123456789\r\n"+ "6\r\n"+ "ABCDEF\r\n"+ "0\r\n"+ "\r\n"+ "HTTP/1.1 200 OK\r\n"+ "\r\n" ); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(200)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Header"),is("value")); assertThat(response.getContent(),is("0123456789ABCDEF")); } @Test public void testResponsesInput() throws Exception { ByteArrayInputStream stream = new ByteArrayInputStream(( "HTTP/1.1 200 OK\r\n"+ "Header: value\r\n"+ "Transfer-Encoding: chunked\r\n"+ "\r\n"+ "A\r\n"+ "0123456789\r\n"+ "6\r\n"+ "ABCDEF\r\n"+ "0\r\n"+ "\r\n"+ "HTTP/1.1 400 OK\r\n"+ "Next: response\r\n"+ "Content-Length: 16\r\n"+ "\r\n"+ "0123456789ABCDEF").getBytes(StandardCharsets.ISO_8859_1) ); HttpTester.Input in = HttpTester.from(stream); HttpTester.Response response = HttpTester.parseResponse(in); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(200)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Header"),is("value")); assertThat(response.getContent(),is("0123456789ABCDEF")); response = HttpTester.parseResponse(in); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(400)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Next"),is("response")); assertThat(response.getContent(),is("0123456789ABCDEF")); } @Test public void testResponsesSplitInput() throws Exception { PipedOutputStream src = new PipedOutputStream(); PipedInputStream stream = new PipedInputStream(src) { @Override public synchronized int read(byte[] b, int off, int len) throws IOException { if (available()==0) return 0; return super.read(b,off,len); } }; HttpTester.Input in = HttpTester.from(stream); src.write(( "HTTP/1.1 200 OK\r\n"+ "Header: value\r\n"+ "Transfer-Encoding: chunked\r\n"+ "\r\n"+ "A\r\n"+ "0123456789\r\n"+ "6\r\n"+ "ABC" ).getBytes(StandardCharsets.ISO_8859_1) ); HttpTester.Response response = HttpTester.parseResponse(in); assertThat(response,nullValue()); src.write(( "DEF\r\n"+ "0\r\n"+ "\r\n"+ "HTTP/1.1 400 OK\r\n"+ "Next: response\r\n"+ "Content-Length: 16\r\n"+ "\r\n"+ "0123456789" ).getBytes(StandardCharsets.ISO_8859_1) ); response = HttpTester.parseResponse(in); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(200)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Header"),is("value")); assertThat(response.getContent(),is("0123456789ABCDEF")); response = HttpTester.parseResponse(in); assertThat(response,nullValue()); src.write(( "ABCDEF" ).getBytes(StandardCharsets.ISO_8859_1) ); response = HttpTester.parseResponse(in); assertThat(response.getVersion(),is(HttpVersion.HTTP_1_1)); assertThat(response.getStatus(),is(400)); assertThat(response.getReason(),is("OK")); assertThat(response.get("Next"),is("response")); assertThat(response.getContent(),is("0123456789ABCDEF")); } }