Merged branch 'master' into 'jetty-9.1'.
diff --git a/jetty-http-spi/pom.xml b/jetty-http-spi/pom.xml
index 4243975..263c91f 100644
--- a/jetty-http-spi/pom.xml
+++ b/jetty-http-spi/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>9.0.0-SNAPSHOT</version>
+ <version>9.0.5-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-http-spi</artifactId>
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java
new file mode 100644
index 0000000..1a1ce7b
--- /dev/null
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java
@@ -0,0 +1,160 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 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.spi;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ThreadPool;
+
+public class DelegatingThreadPool extends ContainerLifeCycle implements ThreadPool
+{
+ private static final Logger LOG = Log.getLogger(DelegatingThreadPool.class);
+
+ private Executor _executor; // memory barrier provided by start/stop semantics
+
+ public DelegatingThreadPool(Executor executor)
+ {
+ _executor=executor;
+ addBean(_executor);
+ }
+
+ /* ------------------------------------------------------------ */
+ public Executor getExecutor()
+ {
+ return _executor;
+ }
+
+ /* ------------------------------------------------------------ */
+ public void setExecutor(Executor executor)
+ {
+ if (isRunning())
+ throw new IllegalStateException(getState());
+ updateBean(_executor,executor);
+ _executor=executor;
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public void execute(Runnable job)
+ {
+ _executor.execute(job);
+ }
+
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public boolean dispatch(Runnable job)
+ {
+ final Executor executor=_executor;
+ if (executor instanceof ThreadPool)
+ return ((ThreadPool)executor).dispatch(job);
+
+ try
+ {
+ _executor.execute(job);
+ return true;
+ }
+ catch(RejectedExecutionException e)
+ {
+ LOG.warn(e);
+ return false;
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public int getIdleThreads()
+ {
+ final Executor executor=_executor;
+ if (executor instanceof ThreadPool)
+ return ((ThreadPool)executor).getIdleThreads();
+
+ if (executor instanceof ThreadPoolExecutor)
+ {
+ final ThreadPoolExecutor tpe = (ThreadPoolExecutor)executor;
+ return tpe.getPoolSize() - tpe.getActiveCount();
+ }
+ return -1;
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public int getThreads()
+ {
+ final Executor executor=_executor;
+ if (executor instanceof ThreadPool)
+ return ((ThreadPool)executor).getThreads();
+
+ if (executor instanceof ThreadPoolExecutor)
+ {
+ final ThreadPoolExecutor tpe = (ThreadPoolExecutor)executor;
+ return tpe.getPoolSize();
+ }
+ return -1;
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public boolean isLowOnThreads()
+ {
+ final Executor executor=_executor;
+ if (executor instanceof ThreadPool)
+ return ((ThreadPool)executor).isLowOnThreads();
+
+ if (executor instanceof ThreadPoolExecutor)
+ {
+ final ThreadPoolExecutor tpe = (ThreadPoolExecutor)executor;
+ // getActiveCount() locks the thread pool, so execute it last
+ return tpe.getPoolSize() == tpe.getMaximumPoolSize() &&
+ tpe.getQueue().size() >= tpe.getPoolSize() - tpe.getActiveCount();
+ }
+ return false;
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public void join() throws InterruptedException
+ {
+ final Executor executor=_executor;
+ if (executor instanceof ThreadPool)
+ ((ThreadPool)executor).join();
+ else if (executor instanceof ExecutorService)
+ ((ExecutorService)executor).awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
+ else
+ throw new IllegalStateException();
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ protected void doStop() throws Exception
+ {
+ super.doStop();
+ if (!(_executor instanceof LifeCycle) && (_executor instanceof ExecutorService))
+ ((ExecutorService)_executor).shutdownNow();
+ }
+
+}
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java
index f5af972..22e6b3d 100644
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java
Binary files differ
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServerProvider.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServerProvider.java
index b96d9a2..410ef2a 100644
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServerProvider.java
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServerProvider.java
@@ -26,6 +26,9 @@
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.util.thread.ExecutorThreadPool;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.eclipse.jetty.util.thread.ThreadPool;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpsServer;
@@ -53,11 +56,12 @@
if (server == null)
{
- server = new Server();
-
- HandlerCollection handlerCollection = new HandlerCollection();
- handlerCollection.setHandlers(new Handler[] {new ContextHandlerCollection(), new DefaultHandler()});
- server.setHandler(handlerCollection);
+ ThreadPool threadPool = new DelegatingThreadPool(new QueuedThreadPool());
+ server = new Server(threadPool);
+
+ HandlerCollection handlerCollection = new HandlerCollection();
+ handlerCollection.setHandlers(new Handler[] {new ContextHandlerCollection(), new DefaultHandler()});
+ server.setHandler(handlerCollection);
shared = false;
}
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/ThreadPoolExecutorAdapter.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/ThreadPoolExecutorAdapter.java
deleted file mode 100644
index aaffe8e..0000000
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/ThreadPoolExecutorAdapter.java
+++ /dev/null
Binary files differ
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java
index 6db5c1a..a569b1a 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java
@@ -67,8 +67,10 @@
{
Response r=new Response();
HttpParser parser =new HttpParser(r);
- parser.parseNext(response);
- return r;
+ if (parser.parseNext(response))
+ return r;
+ else
+ return null;
}
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
index 0c65211..01fa377 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
@@ -26,6 +26,7 @@
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
+
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
index d53e91b..8e815d9 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
@@ -116,7 +116,6 @@
this(server,null,null,null,acceptors,selectors,new HttpConnectionFactory());
}
-
/* ------------------------------------------------------------ */
/** Generic Server Connection with default configuration.
* <p>Construct a Server Connector with the passed Connection factories.</p>
diff --git a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java
index d405677..894a17f 100644
--- a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java
+++ b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java
@@ -39,8 +39,7 @@
/**
* JSON Parser and Generator.
- *
- * <p>
+ * <p />
* This class provides some static methods to convert POJOs to and from JSON
* notation. The mapping from JSON to java is:
*
@@ -52,9 +51,7 @@
* null ==> null
* bool ==> Boolean
* </pre>
- *
- * </p>
- * <p>
+
* The java to JSON mapping is:
*
* <pre>
@@ -68,30 +65,27 @@
* Object --> string (dubious!)
* </pre>
*
- * </p>
- * <p>
* The interface {@link JSON.Convertible} may be implemented by classes that
* wish to externalize and initialize specific fields to and from JSON objects.
* Only directed acyclic graphs of objects are supported.
- * </p>
- * <p>
+ * <p />
* The interface {@link JSON.Generator} may be implemented by classes that know
* how to render themselves as JSON and the {@link #toString(Object)} method
* will use {@link JSON.Generator#addJSON(Appendable)} to generate the JSON.
* The class {@link JSON.Literal} may be used to hold pre-generated JSON object.
- * <p>
+ * <p />
* The interface {@link JSON.Convertor} may be implemented to provide static
- * convertors for objects that may be registered with
- * {@link #registerConvertor(Class, org.eclipse.jetty.util.ajax.JSON.Convertor)}
- * . These convertors are looked up by class, interface and super class by
+ * converters for objects that may be registered with
+ * {@link #registerConvertor(Class, Convertor)}.
+ * These converters are looked up by class, interface and super class by
* {@link #getConvertor(Class)}.
- * </p>
- * <p>If a JSON object has a "class" field, then a java class for that name is
- * looked up and the method {@link convertTo(Class,Map)} is used to find a
- * Convertor for that class. If a JSON object has a "x-class" field then a
- * direct lookup for a Convertor for that named x-class is done, so that none
- * java classes may be converted.
- * </p>
+ * <p />
+ * If a JSON object has a "class" field, then a java class for that name is
+ * loaded and the method {@link #convertTo(Class,Map)} is used to find a
+ * {@link JSON.Convertor} for that class.
+ * <p />
+ * If a JSON object has a "x-class" field then a direct lookup for a
+ * {@link JSON.Convertor} for that class name is done (without loading the class).
*/
public class JSON
{
@@ -105,7 +99,6 @@
{
}
- /* ------------------------------------------------------------ */
/**
* @return the initial stringBuffer size to use when creating JSON strings
* (default 1024)
@@ -115,7 +108,6 @@
return _stringBufferSize;
}
- /* ------------------------------------------------------------ */
/**
* @param stringBufferSize
* the initial stringBuffer size to use when creating JSON
@@ -126,7 +118,6 @@
_stringBufferSize = stringBufferSize;
}
- /* ------------------------------------------------------------ */
/**
* Register a {@link Convertor} for a class or interface.
*
@@ -140,19 +131,16 @@
DEFAULT.addConvertor(forClass,convertor);
}
- /* ------------------------------------------------------------ */
public static JSON getDefault()
{
return DEFAULT;
}
- /* ------------------------------------------------------------ */
@Deprecated
public static void setDefault(JSON json)
{
}
- /* ------------------------------------------------------------ */
public static String toString(Object object)
{
StringBuilder buffer = new StringBuilder(DEFAULT.getStringBufferSize());
@@ -160,7 +148,6 @@
return buffer.toString();
}
- /* ------------------------------------------------------------ */
public static String toString(Map object)
{
StringBuilder buffer = new StringBuilder(DEFAULT.getStringBufferSize());
@@ -168,7 +155,6 @@
return buffer.toString();
}
- /* ------------------------------------------------------------ */
public static String toString(Object[] array)
{
StringBuilder buffer = new StringBuilder(DEFAULT.getStringBufferSize());
@@ -176,7 +162,6 @@
return buffer.toString();
}
- /* ------------------------------------------------------------ */
/**
* @param s
* String containing JSON object or array.
@@ -187,7 +172,6 @@
return DEFAULT.parse(new StringSource(s),false);
}
- /* ------------------------------------------------------------ */
/**
* @param s
* String containing JSON object or array.
@@ -200,7 +184,6 @@
return DEFAULT.parse(new StringSource(s),stripOuterComment);
}
- /* ------------------------------------------------------------ */
/**
* @param in
* Reader containing JSON object or array.
@@ -211,7 +194,6 @@
return DEFAULT.parse(new ReaderSource(in),false);
}
- /* ------------------------------------------------------------ */
/**
* @param in
* Reader containing JSON object or array.
@@ -224,7 +206,6 @@
return DEFAULT.parse(new ReaderSource(in),stripOuterComment);
}
- /* ------------------------------------------------------------ */
/**
* @deprecated use {@link #parse(Reader)}
* @param in
@@ -237,7 +218,6 @@
return DEFAULT.parse(new StringSource(IO.toString(in)),false);
}
- /* ------------------------------------------------------------ */
/**
* @deprecated use {@link #parse(Reader, boolean)}
* @param in
@@ -252,7 +232,6 @@
return DEFAULT.parse(new StringSource(IO.toString(in)),stripOuterComment);
}
- /* ------------------------------------------------------------ */
/**
* Convert Object to JSON
*
@@ -267,7 +246,6 @@
return buffer.toString();
}
- /* ------------------------------------------------------------ */
/**
* Convert JSON to Object
*
@@ -287,7 +265,6 @@
append((Appendable)buffer,object);
}
- /* ------------------------------------------------------------ */
/**
* Append object as JSON to string buffer.
*
@@ -301,32 +278,58 @@
try
{
if (object == null)
+ {
buffer.append("null");
- else if (object instanceof Convertible)
- appendJSON(buffer,(Convertible)object);
- else if (object instanceof Generator)
- appendJSON(buffer,(Generator)object);
+ }
+ // Most likely first
else if (object instanceof Map)
+ {
appendMap(buffer,(Map)object);
- else if (object instanceof Collection)
- appendArray(buffer,(Collection)object);
- else if (object.getClass().isArray())
- appendArray(buffer,object);
- else if (object instanceof Number)
- appendNumber(buffer,(Number)object);
- else if (object instanceof Boolean)
- appendBoolean(buffer,(Boolean)object);
- else if (object instanceof Character)
- appendString(buffer,object.toString());
+ }
else if (object instanceof String)
+ {
appendString(buffer,(String)object);
+ }
+ else if (object instanceof Number)
+ {
+ appendNumber(buffer,(Number)object);
+ }
+ else if (object instanceof Boolean)
+ {
+ appendBoolean(buffer,(Boolean)object);
+ }
+ else if (object.getClass().isArray())
+ {
+ appendArray(buffer,object);
+ }
+ else if (object instanceof Character)
+ {
+ appendString(buffer,object.toString());
+ }
+ else if (object instanceof Convertible)
+ {
+ appendJSON(buffer,(Convertible)object);
+ }
+ else if (object instanceof Generator)
+ {
+ appendJSON(buffer,(Generator)object);
+ }
else
{
+ // Check Convertor before Collection to support JSONCollectionConvertor
Convertor convertor = getConvertor(object.getClass());
if (convertor != null)
+ {
appendJSON(buffer,convertor,object);
+ }
+ else if (object instanceof Collection)
+ {
+ appendArray(buffer,(Collection)object);
+ }
else
+ {
appendString(buffer,object.toString());
+ }
}
}
catch (IOException e)
@@ -335,14 +338,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendNull(StringBuffer buffer)
{
appendNull((Appendable)buffer);
}
- /* ------------------------------------------------------------ */
public void appendNull(Appendable buffer)
{
try
@@ -355,14 +356,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendJSON(final StringBuffer buffer, final Convertor convertor, final Object object)
{
appendJSON((Appendable)buffer,convertor,object);
}
- /* ------------------------------------------------------------ */
public void appendJSON(final Appendable buffer, final Convertor convertor, final Object object)
{
appendJSON(buffer,new Convertible()
@@ -378,14 +377,12 @@
});
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendJSON(final StringBuffer buffer, Convertible converter)
{
appendJSON((Appendable)buffer,converter);
}
- /* ------------------------------------------------------------ */
public void appendJSON(final Appendable buffer, Convertible converter)
{
ConvertableOutput out=new ConvertableOutput(buffer);
@@ -393,27 +390,23 @@
out.complete();
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendJSON(StringBuffer buffer, Generator generator)
{
generator.addJSON(buffer);
}
- /* ------------------------------------------------------------ */
public void appendJSON(Appendable buffer, Generator generator)
{
generator.addJSON(buffer);
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendMap(StringBuffer buffer, Map<?,?> map)
{
appendMap((Appendable)buffer,map);
}
- /* ------------------------------------------------------------ */
public void appendMap(Appendable buffer, Map<?,?> map)
{
try
@@ -444,14 +437,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendArray(StringBuffer buffer, Collection collection)
{
- appendArray((Appendable)buffer,collection);
+ appendArray((Appendable)buffer,collection);
}
- /* ------------------------------------------------------------ */
public void appendArray(Appendable buffer, Collection collection)
{
try
@@ -482,14 +473,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendArray(StringBuffer buffer, Object array)
{
- appendArray((Appendable)buffer,array);
+ appendArray((Appendable)buffer,array);
}
- /* ------------------------------------------------------------ */
public void appendArray(Appendable buffer, Object array)
{
try
@@ -518,14 +507,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendBoolean(StringBuffer buffer, Boolean b)
{
appendBoolean((Appendable)buffer,b);
}
- /* ------------------------------------------------------------ */
public void appendBoolean(Appendable buffer, Boolean b)
{
try
@@ -535,7 +522,7 @@
appendNull(buffer);
return;
}
- buffer.append(b.booleanValue()?"true":"false");
+ buffer.append(b?"true":"false");
}
catch (IOException e)
{
@@ -543,14 +530,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendNumber(StringBuffer buffer, Number number)
{
- appendNumber((Appendable)buffer,number);
+ appendNumber((Appendable)buffer,number);
}
- /* ------------------------------------------------------------ */
public void appendNumber(Appendable buffer, Number number)
{
try
@@ -568,14 +553,12 @@
}
}
- /* ------------------------------------------------------------ */
@Deprecated
public void appendString(StringBuffer buffer, String string)
{
- appendString((Appendable)buffer,string);
+ appendString((Appendable)buffer,string);
}
- /* ------------------------------------------------------------ */
public void appendString(Appendable buffer, String string)
{
if (string == null)
@@ -589,37 +572,31 @@
// Parsing utilities
- /* ------------------------------------------------------------ */
protected String toString(char[] buffer, int offset, int length)
{
return new String(buffer,offset,length);
}
- /* ------------------------------------------------------------ */
protected Map<String, Object> newMap()
{
return new HashMap<String, Object>();
}
- /* ------------------------------------------------------------ */
protected Object[] newArray(int size)
{
return new Object[size];
}
- /* ------------------------------------------------------------ */
protected JSON contextForArray()
{
return this;
}
- /* ------------------------------------------------------------ */
protected JSON contextFor(String field)
{
return this;
}
- /* ------------------------------------------------------------ */
protected Object convertTo(Class type, Map map)
{
if (type != null && Convertible.class.isAssignableFrom(type))
@@ -644,7 +621,6 @@
return map;
}
- /* ------------------------------------------------------------ */
/**
* Register a {@link Convertor} for a class or interface.
*
@@ -658,7 +634,6 @@
_convertors.put(forClass.getName(),convertor);
}
- /* ------------------------------------------------------------ */
/**
* Lookup a convertor for a class.
* <p>
@@ -677,7 +652,7 @@
if (convertor == null && this != DEFAULT)
convertor = DEFAULT.getConvertor(cls);
- while (convertor == null && cls != null && cls != Object.class)
+ while (convertor == null && cls != Object.class)
{
Class[] ifs = cls.getInterfaces();
int i = 0;
@@ -692,7 +667,6 @@
return convertor;
}
- /* ------------------------------------------------------------ */
/**
* Register a {@link JSON.Convertor} for a named class or interface.
*
@@ -706,7 +680,6 @@
_convertors.put(name,convertor);
}
- /* ------------------------------------------------------------ */
/**
* Lookup a convertor for a named class.
*
@@ -716,14 +689,12 @@
*/
public Convertor getConvertorFor(String name)
{
- String clsName = name;
- Convertor convertor = _convertors.get(clsName);
+ Convertor convertor = _convertors.get(name);
if (convertor == null && this != DEFAULT)
- convertor = DEFAULT.getConvertorFor(clsName);
+ convertor = DEFAULT.getConvertorFor(name);
return convertor;
}
- /* ------------------------------------------------------------ */
public Object parse(Source source, boolean stripOuterComment)
{
int comment_state = 0; // 0=no comment, 1="/", 2="/*", 3="/* *" -1="//"
@@ -811,7 +782,6 @@
return o;
}
- /* ------------------------------------------------------------ */
public Object parse(Source source)
{
int comment_state = 0; // 0=no comment, 1="/", 2="/*", 3="/* *" -1="//"
@@ -911,13 +881,11 @@
return null;
}
- /* ------------------------------------------------------------ */
protected Object handleUnknown(Source source, char c)
{
throw new IllegalStateException("unknown char '" + c + "'(" + (int)c + ") in " + source);
}
- /* ------------------------------------------------------------ */
protected Object parseObject(Source source)
{
if (source.next() != '{')
@@ -952,10 +920,10 @@
String xclassname = (String)map.get("x-class");
if (xclassname != null)
{
- Convertor c = getConvertorFor(xclassname);
- if (c != null)
- return c.fromJSON(map);
- LOG.warn("no Convertor for xclassname '%s'", xclassname);
+ Convertor c = getConvertorFor(xclassname);
+ if (c != null)
+ return c.fromJSON(map);
+ LOG.warn("No Convertor for x-class '{}'", xclassname);
}
String classname = (String)map.get("class");
@@ -968,14 +936,13 @@
}
catch (ClassNotFoundException e)
{
- LOG.warn("no Class for classname '%s'", classname);
+ LOG.warn("No Class for '{}'", classname);
}
}
-
+
return map;
}
- /* ------------------------------------------------------------ */
protected Object parseArray(Source source)
{
if (source.next() != '[')
@@ -1042,7 +1009,6 @@
throw new IllegalStateException("unexpected end of array");
}
- /* ------------------------------------------------------------ */
protected String parseString(Source source)
{
if (source.next() != '"')
@@ -1110,7 +1076,6 @@
else if (c == '\\')
{
escape = true;
- continue;
}
else if (c == '\"')
{
@@ -1118,7 +1083,9 @@
return toString(scratch,0,i);
}
else
+ {
scratch[i++] = c;
+ }
}
// Missing end quote, but return string anyway ?
@@ -1175,17 +1142,19 @@
else if (c == '\\')
{
escape = true;
- continue;
}
else if (c == '\"')
+ {
break;
+ }
else
+ {
builder.append(c);
+ }
}
return builder.toString();
}
- /* ------------------------------------------------------------ */
public Number parseNumber(Source source)
{
boolean minus = false;
@@ -1270,7 +1239,6 @@
}
- /* ------------------------------------------------------------ */
protected void seekTo(char seek, Source source)
{
while (source.hasNext())
@@ -1287,7 +1255,6 @@
throw new IllegalStateException("Expected '" + seek + "'");
}
- /* ------------------------------------------------------------ */
protected char seekTo(String seek, Source source)
{
while (source.hasNext())
@@ -1306,7 +1273,6 @@
throw new IllegalStateException("Expected one of '" + seek + "'");
}
- /* ------------------------------------------------------------ */
protected static void complete(String seek, Source source)
{
int i = 0;
@@ -1398,7 +1364,7 @@
_buffer.append(c);
QuotedStringTokenizer.quote(_buffer,name);
_buffer.append(':');
- appendNumber(_buffer,new Double(value));
+ appendNumber(_buffer, value);
c = ',';
}
catch (IOException e)
@@ -1444,7 +1410,6 @@
}
}
- /* ------------------------------------------------------------ */
public interface Source
{
boolean hasNext();
@@ -1456,7 +1421,6 @@
char[] scratchBuffer();
}
- /* ------------------------------------------------------------ */
public static class StringSource implements Source
{
private final String string;
@@ -1500,7 +1464,6 @@
}
}
- /* ------------------------------------------------------------ */
public static class ReaderSource implements Source
{
private Reader _reader;
@@ -1567,7 +1530,6 @@
}
- /* ------------------------------------------------------------ */
/**
* JSON Output class for use by {@link Convertible}.
*/
@@ -1587,7 +1549,6 @@
}
/* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
/**
* JSON Convertible object. Object can implement this interface in a similar
* way to the {@link Externalizable} interface is used to allow classes to
@@ -1607,7 +1568,6 @@
public void fromJSON(Map object);
}
- /* ------------------------------------------------------------ */
/**
* Static JSON Convertor.
* <p>
@@ -1626,7 +1586,6 @@
public Object fromJSON(Map object);
}
- /* ------------------------------------------------------------ */
/**
* JSON Generator. A class that can add it's JSON representation directly to
* a StringBuffer. This is useful for object instances that are frequently
@@ -1637,7 +1596,6 @@
public void addJSON(Appendable buffer);
}
- /* ------------------------------------------------------------ */
/**
* A Literal JSON generator A utility instance of {@link JSON.Generator}
* that holds a pre-generated string on JSON text.
@@ -1646,7 +1604,6 @@
{
private String _json;
- /* ------------------------------------------------------------ */
/**
* Construct a literal JSON instance for use by
* {@link JSON#toString(Object)}. If {@link Log#isDebugEnabled()} is
diff --git a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONDateConvertor.java b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONDateConvertor.java
index a244b1f..e50206b 100644
--- a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONDateConvertor.java
+++ b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONDateConvertor.java
@@ -40,9 +40,10 @@
public class JSONDateConvertor implements JSON.Convertor
{
private static final Logger LOG = Log.getLogger(JSONDateConvertor.class);
- private boolean _fromJSON;
- DateCache _dateCache;
- SimpleDateFormat _format;
+
+ private final boolean _fromJSON;
+ private final DateCache _dateCache;
+ private final SimpleDateFormat _format;
public JSONDateConvertor()
{
@@ -53,7 +54,7 @@
{
this(DateCache.DEFAULT_FORMAT,TimeZone.getTimeZone("GMT"),fromJSON);
}
-
+
public JSONDateConvertor(String format,TimeZone zone,boolean fromJSON)
{
_dateCache=new DateCache(format);
@@ -62,7 +63,7 @@
_format=new SimpleDateFormat(format);
_format.setTimeZone(zone);
}
-
+
public JSONDateConvertor(String format, TimeZone zone, boolean fromJSON, Locale locale)
{
_dateCache = new DateCache(format, locale);
@@ -71,7 +72,7 @@
_format = new SimpleDateFormat(format, new DateFormatSymbols(locale));
_format.setTimeZone(zone);
}
-
+
public Object fromJSON(Map map)
{
if (!_fromJSON)
@@ -85,7 +86,7 @@
}
catch(Exception e)
{
- LOG.warn(e);
+ LOG.warn(e);
}
return null;
}
diff --git a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java
index 3d90eaa..54c10c6 100644
--- a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java
+++ b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java
@@ -32,7 +32,7 @@
* If fromJSON is true in the constructor, the JSON generated will
* be of the form {class="com.acme.TrafficLight",value="Green"}
* If fromJSON is false, then only the string value of the enum is generated.
- *
+ *
*
*/
public class JSONEnumConvertor implements JSON.Convertor
@@ -43,8 +43,8 @@
{
try
{
- Class e = Loader.loadClass(getClass(),"java.lang.Enum");
- _valueOf=e.getMethod("valueOf",new Class[]{Class.class,String.class});
+ Class<?> e = Loader.loadClass(getClass(),"java.lang.Enum");
+ _valueOf=e.getMethod("valueOf",Class.class,String.class);
}
catch(Exception e)
{
@@ -56,12 +56,12 @@
{
this(false);
}
-
+
public JSONEnumConvertor(boolean fromJSON)
{
_fromJSON=fromJSON;
}
-
+
public Object fromJSON(Map map)
{
if (!_fromJSON)
@@ -69,11 +69,11 @@
try
{
Class c=Loader.loadClass(getClass(),(String)map.get("class"));
- return _valueOf.invoke(null,new Object[]{c,map.get("value")});
+ return _valueOf.invoke(null,c,map.get("value"));
}
catch(Exception e)
{
- LOG.warn(e);
+ LOG.warn(e);
}
return null;
}
@@ -83,12 +83,11 @@
if (_fromJSON)
{
out.addClass(obj.getClass());
- out.add("value",obj.toString());
+ out.add("value",((Enum)obj).name());
}
else
{
- out.add(obj.toString());
+ out.add(((Enum)obj).name());
}
}
-
}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertor.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertor.java
new file mode 100644
index 0000000..9629e3c
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertor.java
@@ -0,0 +1,50 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 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.util.ajax;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.eclipse.jetty.util.Loader;
+
+public class JSONCollectionConvertor implements JSON.Convertor
+{
+ public void toJSON(Object obj, JSON.Output out)
+ {
+ out.addClass(obj.getClass());
+ out.add("list", ((Collection)obj).toArray());
+ }
+
+ public Object fromJSON(Map object)
+ {
+ try
+ {
+ Collection result = (Collection)Loader.loadClass(getClass(), (String)object.get("class")).newInstance();
+ Collections.addAll(result, (Object[])object.get("list"));
+ return result;
+ }
+ catch (Exception x)
+ {
+ if (x instanceof RuntimeException)
+ throw (RuntimeException)x;
+ throw new RuntimeException(x);
+ }
+ }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertorTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertorTest.java
new file mode 100644
index 0000000..6534483
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertorTest.java
@@ -0,0 +1,112 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 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.util.ajax;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JSONCollectionConvertorTest
+{
+ @Test
+ public void testArrayList() throws Exception
+ {
+ List<String> list = new ArrayList<String>();
+ Collections.addAll(list, "one", "two");
+ testList(list);
+ }
+
+ @Test
+ public void testLinkedList() throws Exception
+ {
+ List<String> list = new LinkedList<String>();
+ Collections.addAll(list, "one", "two");
+ testList(list);
+ }
+
+ @Test
+ public void testCopyOnWriteArrayList() throws Exception
+ {
+ List<String> list = new CopyOnWriteArrayList<String>();
+ Collections.addAll(list, "one", "two");
+ testList(list);
+ }
+
+ private void testList(List<String> list1) throws Exception
+ {
+ JSON json = new JSON();
+ json.addConvertor(List.class, new JSONCollectionConvertor());
+
+ Map<String, Object> object1 = new HashMap<String, Object>();
+ String field = "field";
+ object1.put(field, list1);
+
+ String string = json.toJSON(object1);
+ Assert.assertTrue(string.contains(list1.getClass().getName()));
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> object2 = (Map<String, Object>)json.parse(new JSON.StringSource(string));
+ @SuppressWarnings("unchecked")
+ List<String> list2 = (List<String>)object2.get(field);
+
+ Assert.assertSame(list1.getClass(), list2.getClass());
+ Assert.assertEquals(list1, list2);
+ }
+
+ @Test
+ public void testHashSet() throws Exception
+ {
+ Set<String> set = new HashSet<String>();
+ Collections.addAll(set, "one", "two", "three");
+ testSet(set);
+ }
+
+ @Test
+ public void testTreeSet() throws Exception
+ {
+ Set<String> set = new TreeSet<String>();
+ Collections.addAll(set, "one", "two", "three");
+ testSet(set);
+ }
+
+ private void testSet(Set<String> set1)
+ {
+ JSON json = new JSON();
+ json.addConvertor(Set.class, new JSONCollectionConvertor());
+
+ String string = json.toJSON(set1);
+ Assert.assertTrue(string.contains(set1.getClass().getName()));
+
+ @SuppressWarnings("unchecked")
+ Set<String> set2 = (Set<String>)json.parse(new JSON.StringSource(string));
+
+ Assert.assertSame(set1.getClass(), set2.getClass());
+ Assert.assertEquals(set1, set2);
+ }
+}
diff --git a/pom.xml b/pom.xml
index 8059349..45e04b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -419,10 +419,10 @@
<module>jetty-distribution</module>
<module>jetty-runner</module>
<module>jetty-monitor</module>
+ <module>jetty-http-spi</module>
<!-- modules that need fixed and added back, or simply dropped and not maintained
<module>jetty-rhttp</module>
- <module>jetty-http-spi</module>
-->
<module>jetty-overlay-deployer</module>
</modules>
diff --git a/tests/test-integration/pom.xml b/tests/test-integration/pom.xml
index fb5784a..d3232a3 100644
--- a/tests/test-integration/pom.xml
+++ b/tests/test-integration/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>tests-parent</artifactId>
- <version>9.0.0-SNAPSHOT</version>
+ <version>9.0.5-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-integration</artifactId>
@@ -111,8 +111,6 @@
<version>${project.version}</version>
</dependency>
<dependency>
- </dependency>
- <dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<scope>test</scope>
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java
index 96d0556..f6baafa 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java
@@ -18,6 +18,8 @@
package org.eclipse.jetty.test;
+import static org.junit.Assert.*;
+
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.InetAddress;
@@ -27,9 +29,9 @@
import java.util.List;
import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.test.support.TestableJettyServer;
-import org.eclipse.jetty.test.support.rawhttp.HttpRequestTester;
-import org.eclipse.jetty.test.support.rawhttp.HttpResponseTester;
import org.eclipse.jetty.test.support.rawhttp.HttpSocketImpl;
import org.eclipse.jetty.test.support.rawhttp.HttpTesting;
import org.eclipse.jetty.util.IO;
@@ -55,6 +57,7 @@
server = new TestableJettyServer();
server.setScheme(HttpScheme.HTTP.asString());
server.addConfiguration("DefaultHandler.xml");
+ server.addConfiguration("NIOHttp.xml");
server.load();
server.start();
@@ -107,14 +110,15 @@
// Collect response
String rawResponse = IO.toString(sock.getInputStream());
DEBUG("--raw-response--\n" + rawResponse);
- HttpResponseTester response = new HttpResponseTester();
- response.parse(rawResponse);
+
+ HttpTester.Response response = HttpTester.parseResponse(rawResponse);
- response.assertStatusOK();
+ assertEquals(HttpStatus.OK_200, response.getStatus());
- response.assertBody("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
+ assertTrue(response.getContent().contains("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"));
}
+ /*
@Test
public void testMultiGET_Raw() throws Exception
{
@@ -131,38 +135,43 @@
rawRequests.append("\r\n");
HttpTesting http = new HttpTesting(new HttpSocketImpl(),serverPort);
+
- List<HttpResponseTester> responses = http.requests(rawRequests);
+ List<HttpTester.Response> responses = http.requests(rawRequests);
- HttpResponseTester response = responses.get(0);
- response.assertStatusOK();
- response.assertBody("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
+ HttpTester.Response response = responses.get(0);
+ assertEquals(HttpStatus.OK_200, response.getStatus());
+ assertTrue(response.getContent().contains("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"));
response = responses.get(1);
- response.assertStatusOK();
- response.assertBody("Host=Default\nResource=R1\n");
+ assertEquals(HttpStatus.OK_200, response.getStatus());
+ assertTrue(response.getContent().contains("Host=Default\nResource=R1\n"));
response = responses.get(2);
- response.assertStatusOK();
- response.assertBody("Host=Default\nResource=R1\n");
+ assertEquals(HttpStatus.OK_200, response.getStatus());
+ assertTrue(response.getContent().contains("Host=Default\nResource=R1\n"));
}
+ */
+
+
+
@Test
public void testGET_HttpTesting() throws Exception
{
- HttpRequestTester request = new HttpRequestTester();
+ HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET");
request.setURI("/tests/alpha.txt");
- request.addHeader("Host","localhost");
- request.addHeader("Connection","close");
+ request.put("Host","localhost");
+ request.put("Connection","close");
// request.setContent(null);
HttpTesting testing = new HttpTesting(new HttpSocketImpl(),serverPort);
- HttpResponseTester response = testing.request(request);
+ HttpTester.Response response = testing.request(request);
- response.assertStatusOK();
- response.assertContentType("text/plain");
- response.assertBody("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
+ assertEquals(HttpStatus.OK_200, response.getStatus());
+ assertEquals("text/plain", response.get("Content-Type"));
+ assertTrue(response.getContent().contains("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"));
}
private void DEBUG(String msg)
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/DigestPostTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/DigestPostTest.java
index 2432ae9..4911cd2 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/DigestPostTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/DigestPostTest.java
@@ -21,6 +21,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
+import java.net.URI;
import java.security.MessageDigest;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
@@ -230,14 +231,15 @@
try
{
AuthenticationStore authStore = client.getAuthenticationStore();
- authStore.addAuthentication(new DigestAuthentication(srvUrl, "test", "testuser", "password"));
+ authStore.addAuthentication(new DigestAuthentication(new URI(srvUrl), "test", "testuser", "password"));
client.start();
Request request = client.newRequest(srvUrl);
request.method(HttpMethod.POST);
request.content(new BytesContentProvider(__message.getBytes("UTF8")));
_received=null;
- ContentResponse response = request.send().get(5, TimeUnit.SECONDS);
+ request = request.timeout(5, TimeUnit.SECONDS);
+ ContentResponse response = request.send();
Assert.assertEquals(__message,_received);
Assert.assertEquals(200,response.getStatus());
}
@@ -255,7 +257,7 @@
try
{
AuthenticationStore authStore = client.getAuthenticationStore();
- authStore.addAuthentication(new DigestAuthentication(srvUrl, "test", "testuser", "password"));
+ authStore.addAuthentication(new DigestAuthentication(new URI(srvUrl), "test", "testuser", "password"));
client.start();
String sent = IO.toString(new FileInputStream("src/test/resources/message.txt"));
@@ -264,7 +266,8 @@
request.method(HttpMethod.POST);
request.content(new StringContentProvider(sent));
_received=null;
- ContentResponse response = request.send().get(5, TimeUnit.SECONDS);
+ request = request.timeout(5, TimeUnit.SECONDS);
+ ContentResponse response = request.send();
Assert.assertEquals(200,response.getStatus());
Assert.assertEquals(sent,_received);
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java
index afabaf2..f9b5754 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java
@@ -33,9 +33,9 @@
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.test.support.StringUtil;
import org.eclipse.jetty.test.support.TestableJettyServer;
-import org.eclipse.jetty.test.support.rawhttp.HttpResponseTester;
import org.eclipse.jetty.test.support.rawhttp.HttpSocket;
import org.eclipse.jetty.test.support.rawhttp.HttpTesting;
import org.eclipse.jetty.toolchain.test.FS;
@@ -56,8 +56,6 @@
/** STRICT RFC TESTS */
private static final boolean STRICT = false;
private static TestableJettyServer server;
- private List<HttpResponseTester> responses;
- private HttpResponseTester response;
private HttpTesting http;
class TestFile
@@ -167,8 +165,9 @@
req1.append("123\r\n\r\n");
req1.append("0;\r\n\r\n");
- response = http.request(req1);
- response.assertStatus("3.6 Transfer Coding / Bad 400",HttpStatus.BAD_REQUEST_400);
+ HttpTester.Response response = http.request(req1);
+
+ assertEquals("3.6 Transfer Coding / Bad 400",HttpStatus.BAD_REQUEST_400,response.getStatus());
}
/**
@@ -208,20 +207,20 @@
req2.append("Connection: close\n");
req2.append("\n");
- responses = http.requests(req2);
+ List<HttpTester.Response> responses = http.requests(req2);
Assert.assertEquals("Response Count",3,responses.size());
- response = responses.get(0); // Response 1
- response.assertStatusOK("3.6.1 Transfer Codings / Response 1 Code");
- response.assertBody("3.6.1 Transfer Codings / Chunked String","12345\n");
+ HttpTester.Response response = responses.get(0); // Response 1
+ assertEquals("3.6.1 Transfer Codings / Response 1 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / Chunked String", response.getContent().contains("12345\n"));
response = responses.get(1); // Response 2
- response.assertStatusOK("3.6.1 Transfer Codings / Response 2 Code");
- response.assertBody("3.6.1 Transfer Codings / Chunked String","6789abcde\n");
+ assertEquals("3.6.1 Transfer Codings / Response 2 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / Chunked String",response.getContent().contains("6789abcde\n"));
response = responses.get(2); // Response 3
- response.assertStatusOK("3.6.1 Transfer Codings / Response 3 Code");
- response.assertNoBody("3.6.1 Transfer Codings / No Body");
+ assertEquals("3.6.1 Transfer Codings / Response 3 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / No Body",response.getContent() == null);
}
/**
@@ -261,20 +260,20 @@
req3.append("Connection: close\n");
req3.append("\n");
- responses = http.requests(req3);
+ List<HttpTester.Response> responses = http.requests(req3);
Assert.assertEquals("Response Count",3,responses.size());
- response = responses.get(0); // Response 1
- response.assertStatusOK("3.6.1 Transfer Codings / Response 1 Code");
- response.assertBody("3.6.1 Transfer Codings / Chunked String","fghIjk\n"); // Complete R1 string
+ HttpTester.Response response = responses.get(0); // Response 1
+ assertEquals("3.6.1 Transfer Codings / Response 1 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / Chunked String", response.getContent().contains("fghIjk\n")); // Complete R1 string
response = responses.get(1); // Response 2
- response.assertStatusOK("3.6.1 Transfer Codings / Response 2 Code");
- response.assertBody("3.6.1 Transfer Codings / Chunked String","lmnoPqrst\n"); // Complete R2 string
+ assertEquals("3.6.1 Transfer Codings / Response 2 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / Chunked String", response.getContent().contains("lmnoPqrst\n")); // Complete R2 string
response = responses.get(2); // Response 3
- response.assertStatusOK("3.6.1 Transfer Codings / Response 3 Code");
- response.assertNoBody("3.6.1 Transfer Codings / No Body");
+ assertEquals("3.6.1 Transfer Codings / Response 3 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / No Body", response.getContent() == null);
}
@@ -305,16 +304,16 @@
req4.append("Connection: close\n"); // close
req4.append("\n");
- responses = http.requests(req4);
+ List<HttpTester.Response> responses = http.requests(req4);
Assert.assertEquals("Response Count",2,responses.size());
- response = responses.get(0); // Response 1
- response.assertStatusOK("3.6.1 Transfer Codings / Response 1 Code");
- response.assertBody("3.6.1 Transfer Codings / Chunked String","123456\n"); // Complete R1 string
+ HttpTester.Response response = responses.get(0); // Response 1
+ assertEquals("3.6.1 Transfer Codings / Response 1 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / Chunked String", response.getContent().contains("123456\n")); // Complete R1 string
response = responses.get(1); // Response 2
- response.assertStatusOK("3.6.1 Transfer Codings / Response 2 Code");
- response.assertNoBody("3.6.1 Transfer Codings / No Body");
+ assertEquals("3.6.1 Transfer Codings / Response 2 Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("3.6.1 Transfer Codings / No Body", response.getContent() == null);
}
/**
@@ -364,15 +363,15 @@
req1.append("Connection: close\n");
req1.append("\n");
- responses = http.requests(req1);
+ List<HttpTester.Response> responses = http.requests(req1);
Assert.assertEquals("Response Count",2,responses.size());
- response = responses.get(0);
- response.assertStatusOK("4.4.2 Message Length / Response Code");
- response.assertBody("4.4.2 Message Length / Body","123\n");
+ HttpTester.Response response = responses.get(0);
+ assertEquals("4.4.2 Message Length / Response Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("4.4.2 Message Length / Body",response.getContent().contains("123\n"));
response = responses.get(1);
- response.assertStatusOK("4.4.2 Message Length / Response Code");
- response.assertNoBody("4.4.2 Message Length / No Body");
+ assertEquals("4.4.2 Message Length / Response Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("4.4.2 Message Length / No Body", response.getContent() == null);
// 4.4.3 -
// Client - do not send 'Content-Length' if entity-length
@@ -405,11 +404,11 @@
Assert.assertEquals("Response Count",2,responses.size());
response = responses.get(0); // response 1
- response.assertStatusOK("4.4.3 Ignore Content-Length / Response Code");
- response.assertBody("4.4.3 Ignore Content-Length / Body","123456\n");
+ assertEquals("4.4.3 Ignore Content-Length / Response Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("4.4.3 Ignore Content-Length / Body", response.getContent().contains("123456\n"));
response = responses.get(1); // response 2
- response.assertStatusOK("4.4.3 Ignore Content-Length / Response Code");
- response.assertBody("4.4.3 Ignore Content-Length / Body","7890AB\n");
+ assertEquals("4.4.3 Ignore Content-Length / Response Code", HttpStatus.OK_200, response.getStatus());
+ assertTrue("4.4.3 Ignore Content-Length / Body", response.getContent().contains("7890AB\n"));
// 4.4 - Server can request valid Content-Length from client if client
// fails to provide a Content-Length.
@@ -430,8 +429,8 @@
response = http.request(req3);
- response.assertStatus("4.4 Valid Content-Length Required",HttpStatus.LENGTH_REQUIRED_411);
- response.assertNoBody("4.4 Valid Content-Length Required");
+ assertEquals("4.4 Valid Content-Length Required",HttpStatus.LENGTH_REQUIRED_411, response.getStatus());
+ assertTrue("4.4 Valid Content-Length Required", response.getContent() == null);
StringBuffer req4 = new StringBuffer();
req4.append("GET /echo/R2 HTTP/1.0\n");
@@ -441,8 +440,8 @@
response = http.request(req4);
- response.assertStatus("4.4 Valid Content-Length Required",HttpStatus.LENGTH_REQUIRED_411);
- response.assertNoBody("4.4 Valid Content-Length Required");
+ assertEquals("4.4 Valid Content-Length Required",HttpStatus.LENGTH_REQUIRED_411, response.getStatus());
+ assertTrue("4.4 Valid Content-Length Required", response.getContent() == null);
}
}
@@ -462,10 +461,10 @@
req1.append("Connection: close\n");
req1.append("\r\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatusOK("5.2 Default Host");
- response.assertBodyContains("5.2 Default Host","Default DOCRoot");
+ assertEquals("5.2 Default Host", HttpStatus.OK_200, response.getStatus());
+ assertTrue("5.2 Default Host",response.getContent().contains("Default DOCRoot"));
}
/**
@@ -484,10 +483,10 @@
req2.append("Connection: close\n");
req2.append("\r\n");
- response = http.request(req2);
+ HttpTester.Response response = http.request(req2);
- response.assertStatusOK("5.2 Virtual Host");
- response.assertBodyContains("5.2 Virtual Host","VirtualHost DOCRoot");
+ assertEquals("5.2 Virtual Host", HttpStatus.OK_200, response.getStatus());
+ assertTrue("5.2 Virtual Host",response.getContent().contains("VirtualHost DOCRoot"));
}
/**
@@ -506,10 +505,10 @@
req3.append("Connection: close\n");
req3.append("\n");
- response = http.request(req3);
+ HttpTester.Response response = http.request(req3);
- response.assertStatusOK("5.2 Virtual Host (mixed case)");
- response.assertBodyContains("5.2 Virtual Host (mixed case)","VirtualHost DOCRoot");
+ assertEquals("5.2 Virtual Host (mixed case)", HttpStatus.OK_200, response.getStatus());
+ assertTrue("5.2 Virtual Host (mixed case)",response.getContent().contains("VirtualHost DOCRoot"));
}
/**
@@ -527,10 +526,10 @@
req4.append("Connection: close\n");
req4.append("\n"); // no virtual host
- response = http.request(req4);
+ HttpTester.Response response = http.request(req4);
- response.assertStatus("5.2 No Host",HttpStatus.BAD_REQUEST_400);
- response.assertNoBody("5.2 No Host");
+ assertEquals("5.2 No Host",HttpStatus.BAD_REQUEST_400,response.getStatus());
+ assertEquals("5.2 No Host","", response.getContent());
}
/**
@@ -549,10 +548,10 @@
req5.append("Connection: close\n");
req5.append("\n");
- response = http.request(req5);
+ HttpTester.Response response = http.request(req5);
- response.assertStatusOK("5.2 Bad Host");
- response.assertBodyContains("5.2 Bad Host","Default DOCRoot"); // served by default context
+ assertEquals("5.2 Bad Host",HttpStatus.OK_200, response.getStatus());
+ assertTrue("5.2 Bad Host",response.getContent().contains("Default DOCRoot")); // served by default context
}
/**
@@ -570,10 +569,10 @@
req6.append("Connection: close\n");
req6.append("\n");
- response = http.request(req6);
+ HttpTester.Response response = http.request(req6);
// No host header should always return a 400 Bad Request.
- response.assertStatus("5.2 Virtual Host as AbsoluteURI (No Host Header / HTTP 1.1)",HttpStatus.BAD_REQUEST_400);
+ assertEquals("5.2 Virtual Host as AbsoluteURI (No Host Header / HTTP 1.1)",HttpStatus.BAD_REQUEST_400,response.getStatus());
}
/**
@@ -591,10 +590,10 @@
req6.append("Connection: close\n");
req6.append("\n");
- response = http.request(req6);
+ HttpTester.Response response = http.request(req6);
- response.assertStatusOK("5.2 Virtual Host as AbsoluteURI (No Host Header / HTTP 1.0)");
- response.assertBodyContains("5.2 Virtual Host as AbsoluteURI (No Host Header / HTTP 1.1)","VirtualHost DOCRoot");
+ assertEquals("5.2 Virtual Host as AbsoluteURI (No Host Header / HTTP 1.0)",HttpStatus.OK_200, response.getStatus());
+ assertTrue("5.2 Virtual Host as AbsoluteURI (No Host Header / HTTP 1.1)",response.getContent().contains("VirtualHost DOCRoot"));
}
/**
@@ -613,10 +612,11 @@
req7.append("Connection: close\n");
req7.append("\n");
- response = http.request(req7);
+ HttpTester.Response response = http.request(req7);
- response.assertStatusOK("5.2 Virtual Host as AbsoluteURI (and Host header)");
- response.assertBodyContains("5.2 Virtual Host as AbsoluteURI (and Host header)","VirtualHost DOCRoot");
+ assertEquals("5.2 Virtual Host as AbsoluteURI (and Host header)", HttpStatus.OK_200, response.getStatus());
+ System.err.println(response.getContent());
+ assertTrue("5.2 Virtual Host as AbsoluteURI (and Host header)",response.getContent().contains("VirtualHost DOCRoot"));
}
/**
@@ -633,11 +633,11 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatusOK("8.1 Persistent Connections");
- response.assertHeaderExists("8.1 Persistent Connections","Content-Length");
- response.assertBodyContains("8.1 Persistent Connections","Resource=R1");
+ assertEquals("8.1 Persistent Connections", HttpStatus.OK_200, response.getStatus());
+ assertTrue("8.1 Persistent Connections", response.get("Content-Length") != null);
+ assertTrue("8.1 Persistent Connections",response.getContent().contains("Resource=R1"));
StringBuffer req2 = new StringBuffer();
req2.append("GET /tests/R1.txt HTTP/1.1\n");
@@ -654,19 +654,19 @@
req2.append("Connection: close\n");
req2.append("\n");
- responses = http.requests(req2);
+ List<HttpTester.Response> responses = http.requests(req2);
Assert.assertEquals("Response Count",2,responses.size()); // Should not have a R3 response.
response = responses.get(0); // response 1
- response.assertStatusOK("8.1 Persistent Connections");
- response.assertHeaderExists("8.1 Persistent Connections","Content-Length");
- response.assertBodyContains("8.1 Peristent Connections","Resource=R1");
+ assertEquals("8.1 Persistent Connections", HttpStatus.OK_200, response.getStatus());
+ assertTrue("8.1 Persistent Connections",response.get("Content-Length") != null);
+ assertTrue("8.1 Peristent Connections", response.getContent().contains("Resource=R1"));
response = responses.get(1); // response 2
- response.assertStatusOK("8.1.2.2 Persistent Connections / Pipeline");
- response.assertHeaderExists("8.1.2.2 Persistent Connections / Pipeline","Content-Length");
- response.assertHeader("8.1.2.2 Persistent Connections / Pipeline","Connection","close");
- response.assertBodyContains("8.1.2.2 Peristent Connections / Pipeline","Resource=R2");
+ assertEquals("8.1.2.2 Persistent Connections / Pipeline", HttpStatus.OK_200, response.getStatus());
+ assertTrue("8.1.2.2 Persistent Connections / Pipeline", response.get("Content-Length") != null);
+ assertEquals("8.1.2.2 Persistent Connections / Pipeline","close", response.get("Connection"));
+ assertTrue("8.1.2.2 Peristent Connections / Pipeline", response.getContent().contains("Resource=R2"));
}
/**
@@ -688,9 +688,9 @@
req2.append("\n");
req2.append("12345678\n");
- response = http.request(req2);
+ HttpTester.Response response = http.request(req2);
- response.assertStatus("8.2.3 expect failure",HttpStatus.EXPECTATION_FAILED_417);
+ assertEquals("8.2.3 expect failure",HttpStatus.EXPECTATION_FAILED_417, response.getStatus());
}
/**
@@ -715,9 +715,9 @@
// Should only expect 1 response.
// The existence of 2 responses usually means a bad "HTTP/1.1 100" was received.
- response = http.request(req3);
+ HttpTester.Response response = http.request(req3);
- response.assertStatusOK("8.2.3 expect 100");
+ assertEquals("8.2.3 expect 100", HttpStatus.OK_200, response.getStatus());
}
@@ -748,19 +748,19 @@
req3.append("\n");
req3.append("87654321"); // Body
- List<HttpResponseTester> responses = http.requests(req3);
+ List<HttpTester.Response> responses = http.requests(req3);
// System.err.println(responses);
- response=responses.get(0);
+ HttpTester.Response response=responses.get(0);
// System.err.println(response.getRawResponse());
- response.assertStatus("8.2.3 ignored no 100",302);
+ assertEquals("8.2.3 ignored no 100",302, response.getStatus());
response=responses.get(1);
// System.err.println(response.getRawResponse());
- response.assertStatus("8.2.3 ignored no 100",200);
- response.assertBody("87654321\n");
+ assertEquals("8.2.3 ignored no 100",200, response.getStatus());
+ assertTrue(response.getContent().contains("87654321\n"));
}
/**
@@ -788,14 +788,14 @@
http.send(sock,req4);
http.setTimeoutMillis(2000);
- response = http.readAvailable(sock);
- response.assertStatus("8.2.3 expect 100",HttpStatus.CONTINUE_100);
+ HttpTester.Response response = http.readAvailable(sock);
+ assertEquals("8.2.3 expect 100",HttpStatus.CONTINUE_100,response.getStatus());
http.send(sock,"654321\n"); // Now send the data
response = http.read(sock);
- response.assertStatusOK("8.2.3 expect 100");
- response.assertBody("8.2.3 expect 100","654321\n");
+ assertEquals("8.2.3 expect 100", HttpStatus.OK_200, response.getStatus());
+ assertTrue("8.2.3 expect 100",response.getContent().contains("654321\n"));
}
finally
{
@@ -825,20 +825,20 @@
req1.append("Host: localhost\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatusOK("9.2 OPTIONS");
- response.assertHeaderExists("9.2 OPTIONS","Allow");
+ assertEquals("9.2 OPTIONS", HttpStatus.OK_200, response.getStatus());
+ assertTrue("9.2 OPTIONS",response.get("Allow") != null);
// Header expected ...
// Allow: GET, HEAD, POST, PUT, DELETE, MOVE, OPTIONS, TRACE
- String allow = response.getHeader("Allow");
+ String allow = response.get("Allow");
String expectedMethods[] =
{ "GET", "HEAD", "POST", "PUT", "DELETE", "MOVE", "OPTIONS", "TRACE" };
for (String expectedMethod : expectedMethods)
{
assertThat(allow,containsString(expectedMethod));
}
- response.assertHeader("9.2 OPTIONS","Content-Length","0"); // Required if no response body.
+ assertEquals("9.2 OPTIONS","0", response.get("Content-Length")); // Required if no response body.
}
}
@@ -870,15 +870,15 @@
req2.append("Connection: close\n"); // Close this second request
req2.append("\n");
- responses = http.requests(req2);
+ List<HttpTester.Response> responses = http.requests(req2);
Assert.assertEquals("Response Count",2,responses.size()); // Should have 2 responses
- response = responses.get(0); // Only interested in first response
- response.assertHeaderExists("9.2 OPTIONS","Allow");
+ HttpTester.Response response = responses.get(0); // Only interested in first response
+ assertTrue("9.2 OPTIONS", response.get("Allow") != null);
// Header expected ...
// Allow: GET, HEAD, POST, TRACE, OPTIONS
- String allow = response.getHeader("Allow");
+ String allow = response.get("Allow");
String expectedMethods[] =
{ "GET", "HEAD", "POST", "OPTIONS", "TRACE" };
for (String expectedMethod : expectedMethods)
@@ -886,7 +886,7 @@
assertThat(allow,containsString(expectedMethod));
}
- response.assertHeader("9.2 OPTIONS","Content-Length","0"); // Required if no response body.
+ assertEquals("9.2 OPTIONS","0", response.get("Content-Length")); // Required if no response body.
}
/**
@@ -905,12 +905,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatusOK("9.4 GET / Response Code");
- response.assertHeader("9.4 GET / Content Type","Content-Type","text/plain");
- response.assertHeader("9.4 HEAD / Content Type","Content-Length","25");
- response.assertBody("9.4 GET / Body","Host=Default\nResource=R1\n");
+ assertEquals("9.4 GET / Response Code", HttpStatus.OK_200, response.getStatus());
+ assertEquals("9.4 GET / Content Type","text/plain", response.get("Content-Type"));
+ assertEquals("9.4 HEAD / Content Type","25", response.get("Content-Length"));
+ assertTrue("9.4 GET / Body", response.getContent().contains("Host=Default\nResource=R1\n"));
/* Test HEAD next. (should have no body) */
@@ -930,7 +930,7 @@
String rawHeadResponse = http.readRaw(sock);
int headResponseLength = rawHeadResponse.length();
// Only interested in the response header from the GET request above.
- String rawGetResponse = response.getRawResponse().toString().substring(0,headResponseLength);
+ String rawGetResponse = response.toString().substring(0,headResponseLength);
// As there is a possibility that the time between GET and HEAD requests
// can cross the second mark. (eg: GET at 11:00:00.999 and HEAD at 11:00:01.001)
@@ -968,12 +968,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- HttpResponseTester response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatusOK("9.8 TRACE / Response Code");
- response.assertHeader("9.8 TRACE / Content Type","Content-Type","message/http");
- response.assertBodyContains("9.8 TRACE / echo","TRACE /rfc2616-webapp/httpmethods HTTP/1.1");
- response.assertBodyContains("9.8 TRACE / echo","Host: localhost");
+ assertEquals("9.8 TRACE / Response Code", HttpStatus.OK_200, response.getStatus());
+ assertEquals("9.8 TRACE / Content Type", "message/http", response.get("Content-Type"));
+ assertTrue("9.8 TRACE / echo", response.getContent().contains("TRACE /rfc2616-webapp/httpmethods HTTP/1.1"));
+ assertTrue("9.8 TRACE / echo", response.getContent().contains("Host: localhost"));
}
/**
@@ -996,10 +996,10 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- boolean noRangeHasContentLocation = response.hasHeader("Content-Location");
- boolean noRangeHasETag = response.hasHeader("ETag");
+ boolean noRangeHasContentLocation = (response.get("Content-Location") != null);
+ boolean noRangeHasETag = (response.get("ETag") != null);
// now try again for the same resource but this time WITH range header
@@ -1012,7 +1012,7 @@
response = http.request(req2);
- response.assertStatus("10.2.7 Partial Content",HttpStatus.PARTIAL_CONTENT_206);
+ assertEquals("10.2.7 Partial Content",HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
// (point 1) A 206 response MUST contain either a Content-Range header
// field (section 14.16) indicating the range included with this
@@ -1021,28 +1021,28 @@
// in the response, its value MUST match the actual number of OCTETs
// transmitted in the message-body.
- if (response.hasHeader("Content-Range"))
+ if (response.get("Content-Range") != null)
{
- response.assertHeader("10.2.7 Partial Content / Response / Content Range","Content-Range","bytes 1-3/27");
+ assertEquals("10.2.7 Partial Content / Response / Content Range","bytes 1-3/27",response.get("Content-Range"));
}
- if (response.hasHeader("Content-Length"))
+ if (response.get("Content-Length") != null)
{
- response.assertHeader("10.2.7 Patial Content / Response / Content Length","Content-Length","3");
+ assertEquals("10.2.7 Patial Content / Response / Content Length","3", response.get("Content-Length"));
}
// (point 2) A 206 response MUST contain a Date header
- response.assertHeaderExists("10.2.7 Partial Content / Response / Date","Date");
+ assertTrue("10.2.7 Partial Content / Response / Date", response.get("Date") != null);
// (point 3) A 206 response MUST contain ETag and/or Content-Location,
// if the header would have been sent in a 200 response to the same request
if (noRangeHasContentLocation)
{
- response.assertHeaderExists("10.2.7 Partial Content / Content-Location","Content-Location");
+ assertTrue("10.2.7 Partial Content / Content-Location", response.get("Content-Location") != null);
}
if (noRangeHasETag)
{
- response.assertHeaderExists("10.2.7 Partial Content / Content-Location","ETag");
+ assertTrue("10.2.7 Partial Content / Content-Location", response.get("ETag") != null);
}
// (point 4) A 206 response MUST contain Expires, Cache-Control, and/or Vary,
@@ -1052,7 +1052,7 @@
// TODO: Not sure how to test this condition.
// Test the body sent
- response.assertBody("10.2.7 Partial Content","BCD"); // should only have bytes 1-3
+ assertTrue("10.2.7 Partial Content",response.getContent().contains("BCD")); // should only have bytes 1-3
}
/**
@@ -1074,11 +1074,11 @@
req1.append("Connection: Close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
specId = "10.3 Redirection HTTP/1.0 - basic";
- response.assertStatus(specId,HttpStatus.FOUND_302);
- response.assertHeader(specId,"Location",serverURI + "/tests/");
+ assertEquals(specId,HttpStatus.FOUND_302, response.getStatus());
+ assertEquals(specId,serverURI + "/tests/", response.get("Location"));
}
/**
@@ -1101,20 +1101,19 @@
req2.append("Connection: close\n");
req2.append("\n");
- responses = http.requests(req2);
+ List<HttpTester.Response> responses = http.requests(req2);
Assert.assertEquals("Response Count",2,responses.size());
- response = responses.get(0);
+ HttpTester.Response response = responses.get(0);
String specId = "10.3 Redirection HTTP/1.1 - basic (response 1)";
- response.assertStatus(specId,HttpStatus.FOUND_302);
- response.assertHeader(specId,"Location",server.getScheme() + "://localhost/tests/");
+ assertEquals(specId,HttpStatus.FOUND_302, response.getStatus());
+ assertEquals(specId,server.getScheme() + "://localhost/tests/", response.get("Location"));
response = responses.get(1);
specId = "10.3 Redirection HTTP/1.1 - basic (response 2)";
- response.assertStatus(specId,HttpStatus.FOUND_302);
- response.assertHeader(specId,"Location",server.getScheme() + "://localhost/tests/");
- response.assertHeader(specId,"Connection","close");
-
+ assertEquals(specId,HttpStatus.FOUND_302, response.getStatus());
+ assertEquals(specId,server.getScheme() + "://localhost/tests/", response.get("Location"));
+ assertEquals(specId,"close", response.get("Connection"));
}
/**
@@ -1133,11 +1132,11 @@
req3.append("Connection: close\n");
req3.append("\n");
- response = http.request(req3);
+ HttpTester.Response response = http.request(req3);
String specId = "10.3 Redirection HTTP/1.0 w/content";
- response.assertStatus(specId,HttpStatus.FOUND_302);
- response.assertHeader(specId,"Location",server.getScheme() + "://localhost/tests/R1.txt");
+ assertEquals(specId,HttpStatus.FOUND_302, response.getStatus());
+ assertEquals(specId,server.getScheme() + "://localhost/tests/R1.txt", response.get("Location"));
}
/**
@@ -1156,13 +1155,13 @@
req4.append("Connection: close\n");
req4.append("\n");
- response = http.request(req4);
+ HttpTester.Response response = http.request(req4);
String specId = "10.3 Redirection HTTP/1.1 w/content";
- response.assertStatus(specId,HttpStatus.FOUND_302);
- response.assertHeader(specId,"Location",server.getScheme() + "://localhost/tests/R2.txt");
- response.assertHeader(specId,"Connection","close");
- response.assertHeaderNotPresent(specId,"Content-Length");
+ assertEquals(specId,HttpStatus.FOUND_302, response.getStatus());
+ assertEquals(specId,server.getScheme() + "://localhost/tests/R2.txt", response.get("Location"));
+ assertEquals(specId,"close", response.get("Connection"));
+ assertTrue(specId,response.get("Content-Length") == null);
}
/**
@@ -1184,11 +1183,11 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
specId = "14.3 Accept-Encoding Header";
- response.assertStatusOK(specId);
- response.assertHeader(specId,"Content-Encoding","gzip");
- response.assertHeader(specId,"Content-Type","text/html");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertEquals(specId,"gzip", response.get("Content-Encoding"));
+ assertEquals(specId,"text/html", response.get("Content-Type"));
}
/**
@@ -1210,10 +1209,10 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatusOK();
- response.assertBody(ALPHA);
+ assertEquals(HttpStatus.OK_200, response.getStatus());
+ assertTrue(response.getContent().contains(ALPHA));
}
@@ -1229,12 +1228,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial Range: '" + rangedef + "'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
- response.assertHeader(msg,"Content-Range","bytes " + expectedRange);
- response.assertBody(msg,expectedBody);
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
+ assertEquals(msg,"bytes " + expectedRange, response.get("Content-Range"));
+ assertTrue(msg,response.getContent().contains(expectedBody));
}
/**
@@ -1288,12 +1287,12 @@
req1.append("\n");
http.setTimeoutMillis(60000);
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial Range (Mixed): 'bytes=a-b,5-8'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
- response.assertHeader(msg,"Content-Range","bytes 5-8/27");
- response.assertBody(msg,alpha.substring(5,8 + 1));
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
+ assertEquals(msg,"bytes 5-8/27", response.get("Content-Range"));
+ assertTrue(msg,response.getContent().contains(alpha.substring(5,8 + 1)));
}
/**
@@ -1328,12 +1327,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial Range (Mixed): 'bytes=a-b,bytes=5-8'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
- response.assertHeader(msg,"Content-Range","bytes 5-8/27");
- response.assertBody(msg,alpha.substring(5,8 + 1));
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
+ assertEquals(msg,"bytes 5-8/27", response.get("Content-Range"));
+ assertTrue(msg,response.getContent().contains(alpha.substring(5,8 + 1)));
}
/**
@@ -1369,12 +1368,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial Range (Mixed): 'bytes=a-b' 'bytes=5-8'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
- response.assertHeader(msg,"Content-Range","bytes 5-8/27");
- response.assertBody(msg,alpha.substring(5,8 + 1));
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
+ assertEquals(msg,"bytes 5-8/27", response.get("Content-Range"));
+ assertTrue(msg,response.getContent().contains(alpha.substring(5,8 + 1)));
}
/**
@@ -1385,8 +1384,6 @@
@Test
public void test14_23_Http10_NoHostHeader() throws Exception
{
- HttpResponseTester response;
-
// HTTP/1.0 OK with no host
StringBuffer req1 = new StringBuffer();
@@ -1394,8 +1391,8 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
- response.assertStatusOK("14.23 HTTP/1.0 - No Host");
+ HttpTester.Response response = http.request(req1);
+ assertEquals("14.23 HTTP/1.0 - No Host", HttpStatus.OK_200, response.getStatus());
}
/**
@@ -1413,8 +1410,8 @@
req2.append("Connection: close\n");
req2.append("\n");
- response = http.request(req2);
- response.assertStatus("14.23 HTTP/1.1 - No Host",HttpStatus.BAD_REQUEST_400);
+ HttpTester.Response response = http.request(req2);
+ assertEquals("14.23 HTTP/1.1 - No Host",HttpStatus.BAD_REQUEST_400, response.getStatus());
}
/**
@@ -1433,8 +1430,8 @@
req3.append("Connection: close\n");
req3.append("\n");
- response = http.request(req3);
- response.assertStatusOK("14.23 HTTP/1.1 - Valid Host");
+ HttpTester.Response response = http.request(req3);
+ assertEquals("14.23 HTTP/1.1 - Valid Host", HttpStatus.OK_200, response.getStatus());
}
/**
@@ -1453,8 +1450,8 @@
req4.append("Connection: close\n");
req4.append("\n");
- response = http.request(req4);
- response.assertStatusOK("14.23 HTTP/1.1 - Empty Host");
+ HttpTester.Response response = http.request(req4);
+ assertEquals("14.23 HTTP/1.1 - Empty Host", HttpStatus.OK_200, response.getStatus());
}
/**
@@ -1476,14 +1473,14 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial (Byte) Range: '" + rangedef + "'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
// It might be strange to see a "Content-Range' response header to a 'Range' request,
// but this is appropriate per the RFC2616 spec.
- response.assertHeader(msg,"Content-Range","bytes " + expectedRange);
- response.assertBody(msg,expectedBody);
+ assertEquals(msg,"bytes " + expectedRange, response.get("Content-Range"));
+ assertTrue(msg,response.getContent().contains(expectedBody));
}
/**
@@ -1532,12 +1529,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial (Byte) Range: '" + rangedef + "'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206, response.getStatus());
- String contentType = response.getHeader("Content-Type");
+ String contentType = response.get("Content-Type");
// RFC states that multiple parts should result in multipart/byteranges Content type.
StringAssert.assertContains(msg + " Content-Type",contentType,"multipart/byteranges");
@@ -1557,20 +1554,20 @@
Assert.assertNotNull(msg + " Should have found boundary in Content-Type header",boundary);
// Find boundary offsets within body
- List<HttpResponseTester> multiparts = response.findBodyMultiparts(boundary);
+ List<HttpTester.Response> multiparts = HttpTesting.getParts(boundary, response);
Assert.assertEquals(msg + " multiparts in body (count)",2,multiparts.size());
// Validate multipart #1
- HttpResponseTester multipart1 = multiparts.get(0);
- multipart1.assertHeader(msg + " Multipart 1","Content-Type","text/plain");
- multipart1.assertHeader(msg + " Multipart 1","Content-Range","bytes 23-23/27");
- multipart1.assertBody(msg + " Multipart 1","X");
+ HttpTester.Response multipart1 = multiparts.get(0);
+ assertEquals(msg + " Multipart 1","text/plain", multipart1.get("Content-Type"));
+ assertEquals(msg + " Multipart 1","bytes 23-23/27", multipart1.get("Content-Range"));
+ assertTrue(msg + " Multipart 1", multipart1.getContent().contains("X"));
// Validate multipart #2
- HttpResponseTester multipart2 = multiparts.get(1);
- multipart2.assertHeader(msg + " Multipart 2","Content-Type","text/plain");
- multipart2.assertHeader(msg + " Multipart 2","Content-Range","bytes 25-26/27");
- multipart2.assertBody(msg + " Multipart 2","Z\n");
+ HttpTester.Response multipart2 = multiparts.get(1);
+ assertEquals(msg + " Multipart 2","text/plain", multipart2.get("Content-Type"));
+ assertEquals(msg + " Multipart 2","bytes 25-26/27", multipart2.get("Content-Range"));
+ assertTrue(msg + " Multipart 2", multipart2.getContent().contains("Z\n"));
}
/**
@@ -1593,12 +1590,12 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
String msg = "Partial (Byte) Range: '" + rangedef + "'";
- response.assertStatus(msg,HttpStatus.PARTIAL_CONTENT_206);
+ assertEquals(msg,HttpStatus.PARTIAL_CONTENT_206,response.getStatus());
- String contentType = response.getHeader("Content-Type");
+ String contentType = response.get("Content-Type");
// RFC states that multiple parts should result in multipart/byteranges Content type.
StringAssert.assertContains(msg + " Content-Type",contentType,"multipart/byteranges");
@@ -1618,26 +1615,26 @@
Assert.assertNotNull(msg + " Should have found boundary in Content-Type header",boundary);
// Find boundary offsets within body
- List<HttpResponseTester> multiparts = response.findBodyMultiparts(boundary);
+ List<HttpTester.Response> multiparts = HttpTesting.getParts(boundary, response);
Assert.assertEquals(msg + " multiparts in body (count)",3,multiparts.size());
// Validate multipart #1
- HttpResponseTester multipart1 = multiparts.get(0);
- multipart1.assertHeader(msg + " Multipart 1","Content-Type","text/plain");
- multipart1.assertHeader(msg + " Multipart 1","Content-Range","bytes 26-26/27");
- multipart1.assertBody(msg + " Multipart 1","\n");
+ HttpTester.Response multipart1 = multiparts.get(0);
+ assertEquals(msg + " Multipart 1", "text/plain", multipart1.get("Content-Type"));
+ assertEquals(msg + " Multipart 1","bytes 26-26/27", multipart1.get("Content-Range"));
+ assertTrue(msg + " Multipart 1",multipart1.getContent().contains("\n"));
// Validate multipart #2
- HttpResponseTester multipart2 = multiparts.get(1);
- multipart2.assertHeader(msg + " Multipart 2","Content-Type","text/plain");
- multipart2.assertHeader(msg + " Multipart 2","Content-Range","bytes 25-26/27");
- multipart2.assertBody(msg + " Multipart 2","Z\n");
+ HttpTester.Response multipart2 = multiparts.get(1);
+ assertEquals(msg + " Multipart 2","text/plain", multipart2.get("Content-Type"));
+ assertEquals(msg + " Multipart 2","bytes 25-26/27", multipart2.get("Content-Range"));
+ assertTrue(msg + " Multipart 2", multipart2.getContent().contains("Z\n"));
// Validate multipart #3
- HttpResponseTester multipart3 = multiparts.get(2);
- multipart3.assertHeader(msg + " Multipart 3","Content-Type","text/plain");
- multipart3.assertHeader(msg + " Multipart 3","Content-Range","bytes 24-26/27");
- multipart3.assertBody(msg + " Multipart 3","YZ\n");
+ HttpTester.Response multipart3 = multiparts.get(2);
+ assertEquals(msg + " Multipart 3","text/plain", multipart3.get("Content-Type"));
+ assertEquals(msg + " Multipart 3","bytes 24-26/27", multipart3.get("Content-Range"));
+ assertTrue(msg + " Multipart 3", multipart3.getContent().contains("YZ\n"));
}
/**
@@ -1671,9 +1668,9 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
- response.assertStatus("BadByteRange: '" + rangedef + "'",HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE_416);
+ assertEquals("BadByteRange: '" + rangedef + "'",HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE_416, response.getStatus());
}
/**
@@ -1714,10 +1711,10 @@
req1.append("Connection: close\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
specId = "14.39 TE Header";
- response.assertStatusOK(specId);
- response.assertHeader(specId,"Transfer-Encoding","gzip");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertEquals(specId,"gzip", response.get("Transfer-Encoding"));
}
}
@@ -1741,9 +1738,9 @@
req2.append("Connection: close\n");
req2.append("\n");
- response = http.request(req2);
+ HttpTester.Response response = http.request(req2);
specId = "14.39 TE Header";
- response.assertStatus(specId,HttpStatus.NOT_IMPLEMENTED_501); // Error on TE (deflate not supported)
+ assertEquals(specId,HttpStatus.NOT_IMPLEMENTED_501, response.getStatus()); // Error on TE (deflate not supported)
}
}
@@ -1755,8 +1752,7 @@
@Test
public void test19_6() throws Exception
{
- List<HttpResponseTester> responses;
- HttpResponseTester response;
+
String specId;
/* Compatibility with HTTP/1.0 */
@@ -1765,10 +1761,10 @@
req1.append("GET /tests/R1.txt HTTP/1.0\n");
req1.append("\n");
- response = http.request(req1);
+ HttpTester.Response response = http.request(req1);
specId = "19.6 Compatibility with HTTP/1.0 - simple request";
- response.assertStatusOK(specId);
- response.assertHeaderNotPresent(specId + " - connection closed not assumed","Connection");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertTrue(specId + " - connection closed not assumed",response.get("Connection") == null);
/* Compatibility with HTTP/1.0 */
@@ -1783,26 +1779,25 @@
req2.append("Connection: close\n"); // Connection closed here
req2.append("\n");
- req2.append("GET /tests/R3.txt HTTP/1.0\n"); // This request should not
- // be handled
+ req2.append("GET /tests/R3.txt HTTP/1.0\n"); // This request should not be handled
req2.append("Host: localhost\n");
req2.append("Connection: close\n");
req2.append("\n");
- responses = http.requests(req2);
+ List<HttpTester.Response> responses = http.requests(req2);
// Since R2 closes the connection, should only get 2 responses (R1 &
// R2), not (R3)
Assert.assertEquals("Response Count",2,responses.size());
response = responses.get(0); // response 1
specId = "19.6.2 Compatibility with previous HTTP - Keep-alive";
- response.assertStatusOK(specId);
- response.assertHeader(specId,"Connection","keep-alive");
- response.assertBodyContains(specId,"Resource=R1");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertEquals(specId,"keep-alive", response.get("Connection"));
+ assertTrue(specId,response.getContent().contains("Resource=R1"));
response = responses.get(1); // response 2
- response.assertStatusOK(specId);
- response.assertBodyContains(specId,"Resource=R2");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertTrue(specId,response.getContent().contains("Resource=R2"));
/* Compatibility with HTTP/1.0 */
@@ -1836,18 +1831,18 @@
specId = "19.6.2 Compatibility with HTTP/1.0- Keep-alive";
response = responses.get(0);
- response.assertStatusOK(specId);
- response.assertHeader(specId,"Connection","keep-alive");
- response.assertBody(specId,"1234567890\n");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertEquals(specId,"keep-alive", response.get("Connection"));
+ assertTrue(specId, response.getContent().contains("1234567890\n"));
response = responses.get(1);
- response.assertStatusOK(specId);
- response.assertHeader(specId,"Connection","keep-alive");
- response.assertBody(specId,"ABCDEFGHIJ\n");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertEquals(specId, "keep-alive", response.get("Connection"));
+ assertTrue(specId,response.getContent().contains("ABCDEFGHIJ\n"));
response = responses.get(2);
- response.assertStatusOK(specId);
- response.assertBody(specId,"Host=Default\nResource=R2\n");
+ assertEquals(specId, HttpStatus.OK_200, response.getStatus());
+ assertTrue(specId,response.getContent().contains("Host=Default\nResource=R2\n"));
}
protected void assertDate(String msg, Calendar expectedTime, long actualTime)
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java
index cf3b035..7b1e911 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java
@@ -120,6 +120,7 @@
for (int i = 0; i < this._xmlConfigurations.size(); i++)
{
URL configURL = this._xmlConfigurations.get(i);
+ System.err.println("configuring: "+configURL);
XmlConfiguration configuration = new XmlConfiguration(configURL);
if (last != null)
{
@@ -176,18 +177,8 @@
_server.start();
// Find the active server port.
- this._serverPort = (-1);
- Connector connectors[] = _server.getConnectors();
- for (int i = 0; i < connectors.length; i++)
- {
- NetworkConnector connector = (NetworkConnector)connectors[i];
- if (connector.getLocalPort() > 0)
- {
- this._serverPort = connector.getLocalPort();
- break;
- }
- }
-
+ this._serverPort = ((NetworkConnector)_server.getConnectors()[0]).getPort();
+ System.err.println("Server Port="+_serverPort);
Assert.assertTrue("Server Port is between 1 and 65535. Actually <" + _serverPort + ">",(1 <= this._serverPort) && (this._serverPort <= 65535));
}
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTester.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTester.java
deleted file mode 100644
index 0145e20..0000000
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTester.java
+++ /dev/null
@@ -1,235 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995-2013 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.test.support.rawhttp;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import javax.servlet.http.Cookie;
-
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.util.BufferUtil;
-
-
-/**
- * Assist in Generating Proper Raw HTTP Requests. If you want ultimate control
- * over the Raw HTTP Request, to test non-standard behavior, or partial HTTP
- * Requests, do not use this class.
- *
- * <pre>
- * HttpRequestTester request = new HttpRequestTester();
- *
- * request.setMethod("GET");
- * request.setURI("/uri");
- * request.setHost("fakehost");
- * request.setConnectionClosed();
- *
- * String rawRequest = request.generate();
- *
- * System.out.println("--raw-request--\n" + rawRequest);
- * </pre>
- *
- * <pre>
- * --raw-request--
- * GET /uri HTTP/1.1
- * Host: fakehost
- * Connection: close
- * </pre>
- */
-public class HttpRequestTester
-{
- private HttpFields fields = new HttpFields();
- private String method;
- private String uri;
- private String version;
- private byte[] content;
- private String charset;
- private String defaultCharset;
- private String contentType;
-
- public HttpRequestTester()
- {
- this("UTF-8");
- }
-
- public HttpRequestTester(String defCharset)
- {
- this.defaultCharset = defCharset;
- }
-
- public String getMethod()
- {
- return method;
- }
-
- public void setHost(String host)
- {
- addHeader("Host",host);
- }
-
- public void setMethod(String method)
- {
- this.method = method;
- }
-
- public String getURI()
- {
- return uri;
- }
-
- public void setURI(String uri)
- {
- this.uri = uri;
- }
-
- public String getVersion()
- {
- return version;
- }
-
- public void setVersion(String version)
- {
- this.version = version;
- }
-
- public String getCharset()
- {
- return charset;
- }
-
- public void setCharset(String charset)
- {
- this.charset = charset;
- }
-
- public String getContentType()
- {
- return contentType;
- }
-
- public void setContentType(String contentType)
- {
- this.contentType = contentType;
- }
-
- public void setConnectionClosed()
- {
- fields.add("Connection","close");
- }
-
- /**
- * @param name
- * @param value
- * @throws IllegalArgumentException
- * @see org.eclipse.jetty.http.HttpFields#add(java.lang.String,
- * java.lang.String)
- */
- public void addHeader(String name, String value) throws IllegalArgumentException
- {
- fields.add(name,value);
- }
-
- /**
- * @param name
- * @param date
- * @see org.eclipse.jetty.http.HttpFields#addDateField(java.lang.String,
- * long)
- */
- public void addDateHeader(String name, long date)
- {
- fields.addDateField(name,date);
- }
-
-
- /**
- * @param cookie
- * @see org.eclipse.jetty.http.HttpFields#addSetCookie(org.eclipse.jetty.http.HttpCookie)
- */
- public void addSetCookie(Cookie cookie)
- {
- fields.addSetCookie(cookie.getName(),cookie.getValue(),cookie.getDomain(),cookie.getPath(),cookie.getMaxAge(),cookie.getComment(),cookie.getSecure(),
- false,cookie.getVersion());
- }
-
- public String generate() throws IOException
- {
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ByteBuffer header = null;
- ByteBuffer chunk = null;
- ByteBuffer content = null;
- HttpVersion httpVersion = null;
- if (version == null)
- {
- httpVersion = HttpVersion.HTTP_1_1;
- }
- else
- {
- httpVersion = httpVersion.fromString(version);
- }
-
- HttpGenerator.RequestInfo info = new HttpGenerator.RequestInfo(httpVersion,fields,0,method,uri);
-
- HttpGenerator generator = new HttpGenerator();
- loop: while(!generator.isEnd())
- {
- HttpGenerator.Result result = generator.generateRequest(info, header, chunk, content, true);
- switch(result)
- {
- case NEED_HEADER:
- header=BufferUtil.allocate(8192);
- continue;
-
- case NEED_CHUNK:
- chunk=BufferUtil.allocate(HttpGenerator.CHUNK_SIZE);
- continue;
-
- case NEED_INFO:
- throw new IllegalStateException();
-
- case FLUSH:
- if (BufferUtil.hasContent(header))
- {
- out.write(BufferUtil.toArray(header));
- BufferUtil.clear(header);
- }
- if (BufferUtil.hasContent(chunk))
- {
- out.write(BufferUtil.toArray(chunk));
- BufferUtil.clear(chunk);
- }
- if (BufferUtil.hasContent(content))
- {
- out.write(BufferUtil.toArray(content));
- BufferUtil.clear(content);
- }
- break;
-
- case SHUTDOWN_OUT:
- break loop;
- }
- }
-
- return out.toString();
- }
-}
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTesterTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTesterTest.java
index e8c9ef2..5d29bc4 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTesterTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpRequestTesterTest.java
@@ -19,7 +19,11 @@
package org.eclipse.jetty.test.support.rawhttp;
import java.io.IOException;
+import java.nio.ByteBuffer;
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.util.BufferUtil;
import org.junit.Assert;
import org.junit.Test;
@@ -28,42 +32,45 @@
@Test
public void testBasicHttp10Request() throws IOException
{
- HttpRequestTester request = new HttpRequestTester();
+ HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET");
request.setURI("/uri");
request.setVersion("HTTP/1.0");
- request.setHost("fakehost");
+ request.put("Host","fakehost");
- String rawRequest = request.generate();
+ ByteBuffer bBuff = request.generate();
StringBuffer expectedRequest = new StringBuffer();
expectedRequest.append("GET /uri HTTP/1.0\r\n");
expectedRequest.append("Host: fakehost\r\n");
expectedRequest.append("\r\n");
- Assert.assertEquals("Basic Request",expectedRequest.toString(),rawRequest);
+ Assert.assertEquals("Basic Request",expectedRequest.toString(),BufferUtil.toString(bBuff));
}
@Test
public void testBasicHttp11Request() throws IOException
{
- HttpRequestTester request = new HttpRequestTester();
+ HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET");
+ request.setVersion(HttpVersion.HTTP_1_1);
request.setURI("/uri");
- request.setHost("fakehost");
- request.setConnectionClosed();
+ request.put("Host","fakehost");
+ request.put("Connection", "close");
+ request.setContent("aaa");
+
- String rawRequest = request.generate();
+ ByteBuffer bBuff = request.generate();
StringBuffer expectedRequest = new StringBuffer();
expectedRequest.append("GET /uri HTTP/1.1\r\n");
expectedRequest.append("Host: fakehost\r\n");
expectedRequest.append("Connection: close\r\n");
- expectedRequest.append("Transfer-Encoding: chunked\r\n");
+ expectedRequest.append("Content-Length: 3\r\n");
expectedRequest.append("\r\n");
- expectedRequest.append("0\r\n");
- expectedRequest.append("\r\n");
+ expectedRequest.append("aaa");
+
- Assert.assertEquals("Basic Request",expectedRequest.toString(),rawRequest);
+ Assert.assertEquals("Basic Request",expectedRequest.toString(),BufferUtil.toString(bBuff));
}
}
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTester.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTester.java
deleted file mode 100644
index 4a4f6dd..0000000
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTester.java
+++ /dev/null
@@ -1,461 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995-2013 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.test.support.rawhttp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Assert;
-
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpHeaders;
-import org.eclipse.jetty.http.HttpParser;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.io.Buffer;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.io.View;
-import org.eclipse.jetty.test.support.StringUtil;
-import org.eclipse.jetty.toolchain.test.StringAssert;
-import org.eclipse.jetty.util.ByteArrayOutputStream2;
-
-/**
- * Assists in testing of HTTP Responses.
- */
-public class HttpResponseTester
-{
- private class PH extends HttpParser.EventHandler
- {
- @Override
- public void content(Buffer ref) throws IOException
- {
- if (content == null)
- content = new ByteArrayOutputStream2();
- content.write(ref.asArray());
- }
-
- @Override
- public void headerComplete() throws IOException
- {
- contentType = fields.get(HttpHeaders.CONTENT_TYPE_BUFFER);
- if (contentType != null)
- {
- String calcCharset = MimeTypes.getCharsetFromContentType(contentType);
- if (calcCharset != null)
- {
- charset = calcCharset;
- }
- }
- }
-
- @Override
- public void messageComplete(long contextLength) throws IOException
- {
- }
-
- @Override
- public void parsedHeader(Buffer name, Buffer value) throws IOException
- {
- fields.add(name,value);
- }
-
- @Override
- public void startRequest(Buffer method, Buffer url, Buffer version) throws IOException
- {
- reset();
- HttpResponseTester.this.method = getString(method);
- HttpResponseTester.this.uri = getString(url);
- HttpResponseTester.this.version = getString(version);
- }
-
- @Override
- public void startResponse(Buffer version, int status, Buffer reason) throws IOException
- {
- reset();
- HttpResponseTester.this.version = getString(version);
- HttpResponseTester.this.status = status;
- HttpResponseTester.this.reason = getString(reason);
- }
- }
-
- public static List<HttpResponseTester> parseMulti(CharSequence rawHTTP) throws IOException
- {
- List<HttpResponseTester> responses = new ArrayList<HttpResponseTester>();
- String parse = rawHTTP.toString();
- while (StringUtil.isNotBlank(parse))
- {
- HttpResponseTester response = new HttpResponseTester();
- parse = response.parse(parse);
- responses.add(response);
- }
-
- return responses;
- }
-
- private HttpFields fields = new HttpFields();
- private CharSequence rawResponse;
- private String method;
- private String uri;
- private String version;
- private int status;
- private String reason;
- private Buffer contentType;
- private ByteArrayOutputStream2 content;
- private String charset;
- private String defaultCharset;
-
- public HttpResponseTester()
- {
- this("UTF-8");
- }
-
- public HttpResponseTester(String defCharset)
- {
- this.defaultCharset = defCharset;
- }
-
- public String getMethod()
- {
- return method;
- }
-
- public String getURI()
- {
- return uri;
- }
-
- public String getVersion()
- {
- return version;
- }
-
- public int getStatus()
- {
- return status;
- }
-
- public CharSequence getRawResponse()
- {
- return rawResponse;
- }
-
- public String getReason()
- {
- return reason;
- }
-
- public String getContentType()
- {
- if (contentType == null)
- {
- return null;
- }
- return contentType.toString();
- }
-
- public ByteArrayOutputStream2 getContentBytes()
- {
- return content;
- }
-
- public String getContent()
- {
- return content.toString();
- }
-
- public String getBody()
- {
- return content.toString();
- }
-
- private byte[] getByteArray(CharSequence str)
- {
- if (charset == null)
- {
- return str.toString().getBytes();
- }
-
- try
- {
- return str.toString().getBytes(charset);
- }
- catch (Exception e)
- {
- return str.toString().getBytes();
- }
- }
-
- private String getString(Buffer buffer)
- {
- return getString(buffer.asArray());
- }
-
- private String getString(byte[] b)
- {
- if (charset == null)
- {
- return new String(b);
- }
-
- try
- {
- return new String(b,charset);
- }
- catch (Exception e)
- {
- return new String(b);
- }
- }
-
- /**
- * @param name
- * @return the header value as a date
- * @see org.eclipse.jetty.http.HttpFields#getDateField(java.lang.String)
- */
- public long getDateHeader(String name)
- {
- return fields.getDateField(name);
- }
-
- /**
- * @param name
- * @return the header value as a long
- * @throws NumberFormatException
- * @see org.eclipse.jetty.http.HttpFields#getLongField(java.lang.String)
- */
- public long getLongHeader(String name) throws NumberFormatException
- {
- return fields.getLongField(name);
- }
-
- /**
- * @param name
- * @return the header value
- * @see org.eclipse.jetty.http.HttpFields#getStringField(java.lang.String)
- */
- public String getHeader(String name)
- {
- return fields.getStringField(name);
- }
-
- public boolean hasHeader(String headerKey)
- {
- return fields.containsKey(headerKey);
- }
-
- /**
- * Parse on HTTP Response
- *
- * @param rawHTTP
- * Raw HTTP to parse
- * @return Any unparsed data in the rawHTTP (eg pipelined requests)
- * @throws IOException
- */
- public String parse(CharSequence rawHTTP) throws IOException
- {
- this.charset = defaultCharset;
- this.rawResponse = rawHTTP;
- ByteArrayBuffer buf = new ByteArrayBuffer(getByteArray(rawHTTP));
- View view = new View(buf);
- HttpParser parser = new HttpParser(view,new PH());
- parser.parse();
- return getString(view.asArray());
- }
-
- public void reset()
- {
- fields.clear();
- method = null;
- uri = null;
- version = null;
- status = 0;
- reason = null;
- content = null;
- }
-
- /**
- * Make sure that status code is "OK"
- */
- public void assertStatusOK()
- {
- assertStatus(HttpStatus.OK_200,"OK");
- }
-
- public void assertStatusOK(String msg)
- {
- assertStatus(msg,HttpStatus.OK_200,"OK");
- }
-
- public void assertStatus(int expectedStatus, String expectedReason)
- {
- Assert.assertEquals("Response.status",expectedStatus,this.status);
- Assert.assertEquals("Response.reason",expectedReason,this.reason);
- }
-
- public void assertStatus(String msg, int expectedStatus, String expectedReason)
- {
- Assert.assertEquals(msg + ": Response.status",expectedStatus,this.status);
- Assert.assertEquals(msg + ": Response.reason",expectedReason,this.reason);
- }
-
- public void assertStatus(String msg, int expectedStatus)
- {
- assertStatus(msg,expectedStatus,HttpStatus.getMessage(expectedStatus));
- }
-
- public void assertContentType(String expectedType)
- {
- assertHeader("Content-Type",expectedType);
- }
-
- private void assertHeader(String headerKey, String expectedValue)
- {
- String actual = fields.getStringField(headerKey);
- Assert.assertNotNull("Response[" + headerKey + "] should not be null",actual);
- Assert.assertEquals("Response[" + headerKey + "]",expectedValue,actual);
- }
-
- public void assertHeader(String msg, String headerKey, String expectedValue)
- {
- String actual = fields.getStringField(headerKey);
- Assert.assertNotNull(msg + ": Response[" + headerKey + "] should not be null, expecting <" + expectedValue + ">",actual);
- Assert.assertEquals(msg + ": Response[" + headerKey + "]",expectedValue,actual);
- }
-
- public void assertBody(String expected)
- {
- Assert.assertNotNull("Response.content should not be null",this.content);
- String actual = this.content.toString();
- Assert.assertEquals("Response.content",expected,actual);
- }
-
- public void assertBody(String msg, String expected)
- {
- Assert.assertNotNull(msg + ": Response.content should not be null",this.content);
- String actual = this.content.toString();
- Assert.assertEquals(msg + ": Response.content",expected,actual);
- }
-
- public void assertNoBody(String msg)
- {
- Assert.assertNull(msg + ": Response.content should be null",this.content);
- }
-
- public void assertBodyContains(String msg, String expectedNeedle)
- {
- StringAssert.assertContains(msg + ": Response Content",this.content.toString(),expectedNeedle);
- }
-
- public void assertHeaderExists(String msg, String expectedHeaderKey)
- {
- Assert.assertTrue(msg + ": header <" + expectedHeaderKey + "> should exist",fields.containsKey(expectedHeaderKey));
- }
-
- public void assertHeaderNotPresent(String msg, String headerKey)
- {
- Assert.assertFalse(msg + ": header <" + headerKey + "> should NOT exist",fields.containsKey(headerKey));
- }
-
- public List<HttpResponseTester> findBodyMultiparts(String boundary) throws IOException
- {
- List<HttpResponseTester> multiparts = new ArrayList<HttpResponseTester>();
-
- BufferedReader buf = new BufferedReader(new StringReader(getBody()));
- String line;
- String startBoundary = "--" + boundary;
- String endBoundary = "--" + boundary + "--";
- HttpResponseTester resp = null;
- boolean parsingHeader = true;
- boolean previousBodyLine = false;
-
- while ((line = buf.readLine()) != null)
- {
- if (line.equals(startBoundary))
- {
- // end of multipart, start a new one.
- if (resp != null)
- {
- multiparts.add(resp);
- }
- resp = new HttpResponseTester();
- parsingHeader = true;
- previousBodyLine = false;
- continue;
- }
-
- if (line.equals(endBoundary))
- {
- if (resp != null)
- {
- multiparts.add(resp);
- }
- break;
- }
-
- if (parsingHeader)
- {
- if (line.equals(""))
- {
- parsingHeader = false;
- continue;
- }
-
- resp.parseHeader(line);
- }
- else
- {
- if (previousBodyLine)
- {
- resp.appendBody("\n");
- }
- resp.appendBody(line);
- previousBodyLine = true;
- }
- }
-
- return multiparts;
- }
-
- public void parseHeader(String line)
- {
- int idx = line.indexOf(":");
- String key = line.substring(0,idx).trim();
- String val = line.substring(idx + 1).trim();
-
- fields.add(key,val);
- }
-
- public void appendBody(String s) throws IOException
- {
- appendBody(s.getBytes());
- }
-
- public void appendBody(byte buf[]) throws IOException
- {
- if (content == null)
- {
- content = new ByteArrayOutputStream2();
- }
-
- content.write(buf);
- }
-}
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java
index 59c97d6..bac0b4a 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java
@@ -25,6 +25,9 @@
import java.io.IOException;
import java.util.List;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpTester;
import org.junit.Assert;
import org.junit.Test;
@@ -45,16 +48,15 @@
rawResponse.append("ABCDEFGHIJKLMNOPQRSTTUVWXYZ\n");
rawResponse.append("\n");
- HttpResponseTester response = new HttpResponseTester();
- response.parse(rawResponse);
+ HttpTester.Response response = HttpTester.parseResponse(rawResponse.toString());
- Assert.assertEquals("Response.version","HTTP/1.1",response.getVersion());
+ Assert.assertEquals("Response.version","HTTP/1.1",response.getVersion().asString());
Assert.assertEquals("Response.status",200,response.getStatus());
Assert.assertEquals("Response.reason","OK",response.getReason());
- Assert.assertEquals("Response[Content-Type]","text/plain",response.getContentType());
- Assert.assertEquals("Response[Content-Length]",28,response.getLongHeader("Content-Length"));
- Assert.assertEquals("Response[Connection]","close",response.getHeader("Connection"));
+ Assert.assertEquals("Response[Content-Type]","text/plain",response.get(HttpHeader.CONTENT_TYPE));
+ Assert.assertEquals("Response[Content-Length]",28,response.getLongField("Content-Length"));
+ Assert.assertEquals("Response[Connection]","close",response.get("Connection"));
String expected = "ABCDEFGHIJKLMNOPQRSTTUVWXYZ\n";
@@ -73,6 +75,7 @@
rawResponse.append("Server: Jetty(7.0.y.z-SNAPSHOT)\n");
rawResponse.append("\n");
rawResponse.append("ABCDEFGHIJKLMNOPQRSTTUVWXYZ\n");
+
rawResponse.append("HTTP/1.1 200 OK\n");
rawResponse.append("Date: Mon, 08 Jun 2009 23:05:26 GMT\n");
rawResponse.append("Content-Type: text/plain\n");
@@ -82,6 +85,7 @@
rawResponse.append("\n");
rawResponse.append("Host=Default\n");
rawResponse.append("Resource=R1\n");
+
rawResponse.append("HTTP/1.1 200 OK\n");
rawResponse.append("Date: Mon, 08 Jun 2009 23:05:26 GMT\n");
rawResponse.append("Content-Type: text/plain\n");
@@ -93,27 +97,32 @@
rawResponse.append("Host=Default\n");
rawResponse.append("Resource=R2\n");
rawResponse.append("\n");
+
+
+ List<HttpTester.Response> responses = HttpTesting.readResponses(rawResponse.toString());
- List<HttpResponseTester> responses = HttpResponseTester.parseMulti(rawResponse);
Assert.assertNotNull("Responses should not be null",responses);
Assert.assertEquals("Responses.size",3,responses.size());
- HttpResponseTester resp1 = responses.get(0);
- resp1.assertStatusOK();
- resp1.assertContentType("text/plain");
- resp1.assertBody("ABCDEFGHIJKLMNOPQRSTTUVWXYZ\n");
- assertThat(resp1.getHeader("Connection"),is(not("close")));
+ HttpTester.Response resp1 = responses.get(0);
+ System.err.println(resp1.toString());
+ Assert.assertEquals(HttpStatus.OK_200, resp1.getStatus());
+ Assert.assertEquals("text/plain", resp1.get("Content-Type"));
+ Assert.assertTrue(resp1.getContent().contains("ABCDEFGHIJKLMNOPQRSTTUVWXYZ\n"));
+ assertThat(resp1.get("Connection"),is(not("close")));
- HttpResponseTester resp2 = responses.get(1);
- resp2.assertStatusOK();
- resp2.assertContentType("text/plain");
- resp2.assertBody("Host=Default\nResource=R1\n");
- assertThat(resp2.getHeader("Connection"),is(not("close")));
+ HttpTester.Response resp2 = responses.get(1);
+ System.err.println(resp2.toString());
+ Assert.assertEquals(HttpStatus.OK_200, resp2.getStatus());
+ Assert.assertEquals("text/plain", resp2.get("Content-Type"));
+ Assert.assertTrue(resp2.getContent().contains("Host=Default\nResource=R1\n"));
+ assertThat(resp2.get("Connection"),is(not("close")));
- HttpResponseTester resp3 = responses.get(2);
- resp3.assertStatusOK();
- resp3.assertContentType("text/plain");
- resp3.assertBody("Host=Default\nResource=R2\n");
- assertThat(resp3.getHeader("Connection"),is("close"));
+ HttpTester.Response resp3 = responses.get(2);
+ System.err.println(resp3.toString());
+ Assert.assertEquals(HttpStatus.OK_200, resp3.getStatus());
+ Assert.assertEquals("text/plain", resp3.get("Content-Type"));
+ Assert.assertTrue(resp3.getContent().contains("Host=Default\nResource=R2\n"));
+ assertThat(resp3.get("Connection"),is("close"));
}
}
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpTesting.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpTesting.java
index 2e05e8b..c81fa3f 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpTesting.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpTesting.java
@@ -18,19 +18,25 @@
package org.eclipse.jetty.test.support.rawhttp;
+import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.StringReader;
import java.io.StringWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
import java.util.List;
-import org.eclipse.jetty.test.support.StringUtil;
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.StringUtil;
/**
* Testing utility for performing RAW HTTP request/response.
@@ -42,6 +48,102 @@
private InetAddress serverHost;
private int serverPort;
private int timeoutMillis = 5000;
+
+
+ public static List<HttpTester.Response> getParts (String boundary, HttpTester.Response response) throws IOException
+ {
+ List<HttpTester.Response> parts = new ArrayList<HttpTester.Response>();
+
+ BufferedReader buf = new BufferedReader(new StringReader(response.getContent()));
+ String line;
+ String startBoundary = "--" + boundary;
+ String endBoundary = "--" + boundary + "--";
+
+ StringBuffer partBuff = null;
+ boolean parsingHeader = true;
+ boolean previousBodyLine = false;
+
+ while ((line = buf.readLine()) != null)
+ {
+ if (line.equals(startBoundary))
+ {
+ // end of multipart, start a new one.
+ if (partBuff != null)
+ {
+ HttpTester.Response part = HttpTester.parseResponse(partBuff.toString());
+ parts.add(part);
+ }
+ partBuff = new StringBuffer();
+ parsingHeader = true;
+ previousBodyLine = false;
+ continue;
+ }
+
+ if (line.equals(endBoundary))
+ {
+ if (partBuff != null)
+ {
+ HttpTester.Response part = HttpTester.parseResponse(partBuff.toString());
+ parts.add(part);
+ }
+ break;
+ }
+
+ if (parsingHeader)
+ {
+ if (line.equals(""))
+ {
+ parsingHeader = false;
+ continue;
+ }
+
+ partBuff.append(line);
+ }
+ else
+ {
+ if (previousBodyLine)
+ {
+ partBuff.append("\n");
+ }
+ partBuff.append(line);
+ previousBodyLine = true;
+ }
+ }
+
+ return parts;
+
+ }
+
+
+
+ public static List<HttpTester.Response> readResponses(ByteBuffer buffer) throws IOException
+ {
+ List<HttpTester.Response> list = new ArrayList<>();
+
+ while(BufferUtil.hasContent(buffer))
+ {
+ HttpTester.Response response = HttpTester.parseResponse(buffer);
+ if (response == null)
+ break;
+ list.add(HttpTester.parseResponse(buffer));
+ }
+ return list;
+ }
+
+ public static List<HttpTester.Response> readResponses(String string) throws IOException
+ {
+ List<HttpTester.Response> list = new ArrayList<>();
+
+ ByteBuffer buffer = BufferUtil.toBuffer(string);
+ while(BufferUtil.hasContent(buffer))
+ {
+ HttpTester.Response response = HttpTester.parseResponse(buffer);
+ if (response == null)
+ break;
+ list.add(response);
+ }
+ return list;
+ }
public HttpTesting(HttpSocket httpSocket, InetAddress host, int port)
{
@@ -115,11 +217,25 @@
* @return the response object
* @throws IOException
*/
- public HttpResponseTester read(Socket sock) throws IOException
+ public HttpTester.Response read(Socket sock) throws IOException
{
- HttpResponseTester response = new HttpResponseTester();
- response.parse(readRaw(sock));
- return response;
+ return HttpTester.parseResponse(readRaw(sock));
+ }
+
+
+ public List<HttpTester.Response> readResponses(Socket sock) throws IOException
+ {
+ List<HttpTester.Response> list = new ArrayList<>();
+ String r = readRaw(sock);
+ ByteBuffer buffer = BufferUtil.toBuffer(r);
+ while(BufferUtil.hasContent(buffer))
+ {
+ HttpTester.Response response = HttpTester.parseResponse(buffer);
+ if (response == null)
+ break;
+ list.add(response);
+ }
+ return list;
}
/**
@@ -130,16 +246,15 @@
* @return the response object
* @throws IOException
*/
- public HttpResponseTester readAvailable(Socket sock) throws IOException
+ public HttpTester.Response readAvailable(Socket sock) throws IOException
{
- HttpResponseTester response = new HttpResponseTester();
+
String rawResponse = readRawAvailable(sock);
if (StringUtil.isBlank(rawResponse))
{
return null;
}
- response.parse(rawResponse);
- return response;
+ return HttpTester.parseResponse(rawResponse);
}
/**
@@ -199,7 +314,7 @@
* @return the response
* @throws IOException
*/
- public HttpResponseTester request(CharSequence rawRequest) throws IOException
+ public HttpTester.Response request(CharSequence rawRequest) throws IOException
{
Socket sock = open();
try
@@ -223,10 +338,10 @@
* @return the response
* @throws IOException
*/
- public HttpResponseTester request(HttpRequestTester request) throws IOException
+ public HttpTester.Response request(HttpTester.Request request) throws IOException
{
- String rawRequest = request.generate();
- return request(rawRequest);
+ ByteBuffer byteBuff = request.generate();
+ return request(BufferUtil.toString(byteBuff));
}
/**
@@ -237,7 +352,7 @@
* @return the responses.
* @throws IOException
*/
- public List<HttpResponseTester> requests(CharSequence rawRequests) throws IOException
+ public List<HttpTester.Response> requests(CharSequence rawRequests) throws IOException
{
Socket sock = open();
try
@@ -247,7 +362,7 @@
// Collect response
String rawResponses = IO.toString(sock.getInputStream());
DEBUG("--raw-response--\n" + rawResponses);
- return HttpResponseTester.parseMulti(rawResponses);
+ return readResponses(rawResponses);
}
finally
{
@@ -255,24 +370,6 @@
}
}
- /**
- * Initiate a multiple HTTP requests, parse the responses
- *
- * @param requests
- * the request objects.
- * @return the response objects.
- * @throws IOException
- */
- public List<HttpResponseTester> requests(List<HttpRequestTester> requests) throws IOException
- {
- StringBuffer rawRequest = new StringBuffer();
- for (HttpRequestTester request : requests)
- {
- rawRequest.append(request.generate());
- }
-
- return requests(rawRequest);
- }
/**
* Send a data (as request) to open socket.
diff --git a/tests/test-integration/src/test/resources/DefaultHandler.xml b/tests/test-integration/src/test/resources/DefaultHandler.xml
index dd6805d..644e7f9 100644
--- a/tests/test-integration/src/test/resources/DefaultHandler.xml
+++ b/tests/test-integration/src/test/resources/DefaultHandler.xml
@@ -12,32 +12,23 @@
<Configure id="Server" class="org.eclipse.jetty.server.Server">
- <!-- =========================================================== -->
- <!-- Server Thread Pool -->
- <!-- =========================================================== -->
- <Set name="ThreadPool">
- <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
- <Set name="minThreads">10</Set>
- <Set name="maxThreads">200</Set>
- </New>
- </Set>
+ <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+ <Set name="secureScheme">https</Set>
+ <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
+ <Set name="outputBufferSize">32768</Set>
+ <Set name="requestHeaderSize">8192</Set>
+ <Set name="responseHeaderSize">8192</Set>
+ <Set name="sendServerVersion">true</Set>
+ <Set name="sendDateHeader">false</Set>
+ <Set name="headerCacheSize">512</Set>
- <!-- =========================================================== -->
- <!-- Set connectors -->
- <!-- =========================================================== -->
+ <!-- Uncomment to enable handling of X-Forwarded- style headers
+ <Call name="addCustomizer">
+ <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
+ </Call>
+ -->
+ </New>
- <Call name="addConnector">
- <Arg>
- <New class="org.eclipse.jetty.server.ServerConnector">
- <Set name="host"><SystemProperty name="jetty.host" /></Set>
- <Set name="port"><SystemProperty name="jetty.port" default="0"/></Set>
- <Set name="idleTimeout">300000</Set>
- <Set name="Acceptors">2</Set>
- <Set name="statsOn">false</Set>
- <!--<Set name="confidentialPort">8443</Set>-->
- </New>
- </Arg>
- </Call>
<!-- =========================================================== -->
<!-- Set handler Collection Structure -->
diff --git a/tests/test-integration/src/test/resources/NIOHttp.xml b/tests/test-integration/src/test/resources/NIOHttp.xml
index 4372a16..793da7a 100644
--- a/tests/test-integration/src/test/resources/NIOHttp.xml
+++ b/tests/test-integration/src/test/resources/NIOHttp.xml
@@ -6,17 +6,27 @@
<!-- =========================================================== -->
<!-- Set connectors -->
<!-- =========================================================== -->
-
+
<Call name="addConnector">
- <Arg>
- <New class="org.eclipse.jetty.server.ServerConnector">
- <Set name="host"><SystemProperty name="jetty.host" /></Set>
- <Set name="port"><SystemProperty name="jetty.port" default="0"/></Set>
- <Set name="idleTimeout">300000</Set>
- <Set name="Acceptors">2</Set>
- <Set name="statsOn">false</Set>
- </New>
- </Arg>
- </Call>
+ <Arg>
+ <New class="org.eclipse.jetty.server.ServerConnector">
+ <Arg name="server"><Ref refid="Server" /></Arg>
+ <Arg name="factories">
+ <Array type="org.eclipse.jetty.server.ConnectionFactory">
+ <Item>
+ <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+ <Arg name="config"><Ref refid="httpConfig" /></Arg>
+ </New>
+ </Item>
+ </Array>
+ </Arg>
+ <Set name="host"><Property name="jetty.host" /></Set>
+ <Set name="port"><Property name="jetty.port" default="8080" /></Set>
+ <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
+ </New>
+ </Arg>
+ </Call>
+
+
</Configure>
diff --git a/tests/test-integration/src/test/resources/NIOHttps.xml b/tests/test-integration/src/test/resources/NIOHttps.xml
index d99d67e..ff42c72 100644
--- a/tests/test-integration/src/test/resources/NIOHttps.xml
+++ b/tests/test-integration/src/test/resources/NIOHttps.xml
@@ -5,21 +5,33 @@
<!-- =========================================================== -->
<!-- Set connectors -->
- <!-- =========================================================== -->
-
- <Call name="addConnector">
- <Arg>
- <New class="org.eclipse.jetty.server.ServerConnector">
- <Set name="host"><SystemProperty name="jetty.host" /></Set>
- <Set name="port"><SystemProperty name="jetty.port" default="0"/></Set>
- <Set name="idleTimeout">300000</Set>
- <Set name="Acceptors">2</Set>
- <Set name="statsOn">false</Set>
- <Set name="keystore"><Property name="test.resourcesdir" default="src/test/resources" />/keystore</Set>
- <Set name="password">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
- <Set name="keyPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
- </New>
- </Arg>
- </Call>
+ <!-- =========================================================== -->
+ <Call id="httpsConnector" name="addConnector">
+ <Arg>
+ <New class="org.eclipse.jetty.server.ServerConnector">
+ <Arg name="server"><Ref refid="Server" /></Arg>
+ <Arg name="factories">
+ <Array type="org.eclipse.jetty.server.ConnectionFactory">
+ <Item>
+ <New class="org.eclipse.jetty.server.SslConnectionFactory">
+ <Arg name="next">http/1.1</Arg>
+ <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
+ </New>
+ </Item>
+ <Item>
+ <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+ <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
+ </New>
+ </Item>
+ </Array>
+ </Arg>
+ <Set name="host"><Property name="jetty.host" /></Set>
+ <Set name="port"><Property name="jetty.https.port" default="8443" /></Set>
+ <Set name="idleTimeout">30000</Set>
+ </New>
+ </Arg>
+ </Call>
+
+
</Configure>
diff --git a/tests/test-integration/src/test/resources/RFC2616Base.xml b/tests/test-integration/src/test/resources/RFC2616Base.xml
index b110e94..3cc7a4b 100644
--- a/tests/test-integration/src/test/resources/RFC2616Base.xml
+++ b/tests/test-integration/src/test/resources/RFC2616Base.xml
@@ -12,38 +12,22 @@
<Configure id="Server" class="org.eclipse.jetty.server.Server">
- <!-- =========================================================== -->
- <!-- Server Thread Pool -->
- <!-- =========================================================== -->
- <Set name="ThreadPool">
- <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
- <Set name="minThreads">10</Set>
- <Set name="maxThreads">200</Set>
- </New>
- </Set>
+ <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+ <Set name="secureScheme">https</Set>
+ <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
+ <Set name="outputBufferSize">32768</Set>
+ <Set name="requestHeaderSize">8192</Set>
+ <Set name="responseHeaderSize">8192</Set>
+ <Set name="sendServerVersion">true</Set>
+ <Set name="sendDateHeader">false</Set>
+ <Set name="headerCacheSize">512</Set>
- <!-- =========================================================== -->
- <!-- No connectors Set Here. -->
- <!-- See: -->
- <!-- BIOHttp.xml -->
- <!-- BIOHttps.xml -->
- <!-- NIOHttp.xml -->
- <!-- NIOHttps.xml -->
- <!-- =========================================================== -->
-
- <!--
- <Call name="addConnector">
- <Arg>
- <New class="org.eclipse.jetty.server.ServerConnector">
- <Set name="host"><SystemProperty name="jetty.host" /></Set>
- <Set name="port"><SystemProperty name="jetty.port" default="0"/></Set>
- <Set name="idleTimeout">300000</Set>
- <Set name="Acceptors">2</Set>
- <Set name="statsOn">false</Set>
- </New>
- </Arg>
- </Call>
- -->
+ <!-- Uncomment to enable handling of X-Forwarded- style headers
+ <Call name="addCustomizer">
+ <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
+ </Call>
+ -->
+ </New>
<!-- =========================================================== -->
<!-- Set handler Collection Structure -->
@@ -88,52 +72,37 @@
</New>
</Set>
- <Call name="addBean">
- <Arg>
- <New class="org.eclipse.jetty.deploy.ContextDeployer">
- <Set name="contexts"><Ref refid="WebappContexts"/></Set>
- <Set name="configurationDir"><Property name="test.resourcesdir" default="src/test/resources"/>/webapp-contexts/RFC2616</Set>
- <Set name="scanInterval">0</Set>
- <Set name="configurationManager">
- <New class="org.eclipse.jetty.deploy.PropertiesConfigurationManager">
- <Set name="file"><Property name="test.targetdir" default="target"/>/testable-jetty-server-config.properties</Set>
- </New>
- </Set>
- </New>
- </Arg>
- </Call>
+ <Call name="addBean">
+ <Arg>
+ <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">
+ <Set name="contexts">
+ <Ref refid="Contexts" />
+ </Set>
+ <Call name="setContextAttribute">
+ <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>
+ <Arg>.*/servlet-api-[^/]*\.jar$</Arg>
+ </Call>
- <!-- =========================================================== -->
- <!-- Configure the webapp deployer. -->
- <!-- A webapp deployer will deploy standard webapps discovered -->
- <!-- in a directory at startup, without the need for additional -->
- <!-- configuration files. It does not support hot deploy or -->
- <!-- non standard contexts (see ContextDeployer above). -->
- <!-- -->
- <!-- This deployer is configured to deploy webapps from the -->
- <!-- $JETTY_HOME/webapps directory -->
- <!-- -->
- <!-- Normally only one type of deployer need be used. -->
- <!-- -->
- <!-- =========================================================== -->
- <!--
- <Call name="addBean">
- <Arg>
- <New class="org.eclipse.jetty.deploy.WebAppDeployer">
- <Set name="contexts"><Ref refid="WebappContexts"/></Set>
- <Set name="webAppDir"><Property name="test.targetdir" default="target"/>/webapps</Set>
- <Set name="parentLoaderPriority">false</Set>
- <Set name="extract">true</Set>
- <Set name="allowDuplicates">false</Set>
- <Set name="defaultsDescriptor"><Property name="test.resourcesdir" default="src/test/resources"/>/webdefault.xml</Set>
- <Call name="setAttribute">
- <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>
- <Arg>.*/jsp-api-[^/]*\.jar$|.*/jsp-[^/]*\.jar$</Arg>
- </Call>
- </New>
- </Arg>
- </Call>
- -->
+ <Call id="webappprovider" name="addAppProvider">
+ <Arg>
+ <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">
+ <Set name="monitoredDirName"><Property name="test.resourcesdir" default="src/test/resources" />/webapps-contexts/RFC2616</Set>
+ <Set name="scanInterval">1</Set>
+ <Set name="extractWars">true</Set>
+ <Set name="configurationManager">
+ <New class="org.eclipse.jetty.deploy.PropertiesConfigurationManager">
+ <Set name="file"><Property name="test.targetdir" default="target"/>/testable-jetty-server-config.properties</Set>
+ </New>
+ </Set>
+ </New>
+ </Arg>
+ </Call>
+
+ </New>
+ </Arg>
+ </Call>
+
+
<!-- =========================================================== -->
<!-- extra options -->
diff --git a/tests/test-integration/src/test/resources/ssl.xml b/tests/test-integration/src/test/resources/ssl.xml
new file mode 100644
index 0000000..84de070
--- /dev/null
+++ b/tests/test-integration/src/test/resources/ssl.xml
@@ -0,0 +1,33 @@
+<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+ <Set name="KeyStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.keystore" default="keystore"/></Set>
+ <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+ <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
+ <Set name="TrustStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.truststore" default="keystore"/></Set>
+ <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+ <Set name="EndpointIdentificationAlgorithm"></Set>
+ <Set name="ExcludeCipherSuites">
+ <Array type="String">
+ <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
+ <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
+ <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
+ <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
+ <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+ <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+ <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
+ </Array>
+ </Set>
+
+ <!-- =========================================================== -->
+ <!-- Create a TLS specific HttpConfiguration based on the -->
+ <!-- common HttpConfiguration defined in jetty.xml -->
+ <!-- Add a SecureRequestCustomizer to extract certificate and -->
+ <!-- session information -->
+ <!-- =========================================================== -->
+ <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+ <Arg><Ref refid="httpConfig"/></Arg>
+ <Call name="addCustomizer">
+ <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
+ </Call>
+ </New>
+
+</Configure>