blob: 4ecfaf277ba8519e791b0b2b717ab83636a61807 [file] [log] [blame]
//
// ========================================================================
// 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"));
}
}