From 4473572b6d29b4eb7081271ff965f7b411c6fb95 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Wed, 23 May 2012 18:04:50 +0200 Subject: [PATCH] jetty-9 more progress with RFC2616 tests --- .../org/eclipse/jetty/http/HttpGenerator.java | 20 +- .../org/eclipse/jetty/http/HttpParser.java | 6 +- .../jetty/http/HttpGeneratorClientTest.java | 12 +- .../jetty/http/HttpGeneratorServerTest.java | 88 +++- .../eclipse/jetty/io/AbstractEndPoint.java | 2 +- .../java/org/eclipse/jetty/io/EndPoint.java | 3 +- .../org/eclipse/jetty/io/ReadInterest.java | 1 - .../org/eclipse/jetty/server/HttpChannel.java | 1 + .../eclipse/jetty/server/HttpConnection.java | 61 ++- .../jetty/server/LocalHttpConnector.java | 30 +- .../jetty/server/handler/ContextHandler.java | 2 +- .../jetty/server/LocalHttpConnectorTest.java | 75 ++++ .../org/eclipse/jetty/server/LocalServer.java | 19 - .../org/eclipse/jetty/server/RFC2616Test.java | 422 ++++++++++++------ .../org/eclipse/jetty/server/RequestTest.java | 4 +- .../eclipse/jetty/server/ResponseTest.java | 43 +- .../jetty/util/thread/QueuedThreadPool.java | 6 +- 17 files changed, 548 insertions(+), 247 deletions(-) create mode 100644 jetty-server/src/test/java/org/eclipse/jetty/server/LocalHttpConnectorTest.java delete mode 100644 jetty-server/src/test/java/org/eclipse/jetty/server/LocalServer.java diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java index be53c8f22c9..adc27f8f1e8 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java @@ -36,8 +36,8 @@ public class HttpGenerator // states public enum Action { FLUSH, COMPLETE, PREPARE }; - public enum State { START, COMMITTING, COMMITTING_COMPLETING, COMMITTED, COMPLETING, END }; - public enum Result { NEED_CHUNK,NEED_COMMIT,NEED_BUFFER,FLUSH,FLUSH_CONTENT,OK,SHUTDOWN_OUT}; + public enum State { START, COMMITTING, COMMITTING_COMPLETING, COMMITTED, COMPLETING, COMPLETING_1XX, END }; + public enum Result { NEED_CHUNK,NEED_INFO,NEED_HEADER,NEED_BUFFER,FLUSH,FLUSH_CONTENT,OK,SHUTDOWN_OUT}; // other statics public static final int CHUNK_SIZE = 12; @@ -279,12 +279,12 @@ public class HttpGenerator case COMMITTING_COMPLETING: { if (info==null) - return Result.NEED_COMMIT; + return Result.NEED_INFO; if (info instanceof RequestInfo) { if (header==null || header.capacity()<=CHUNK_SIZE) - return Result.NEED_COMMIT; + return Result.NEED_HEADER; if(info.getHttpVersion()==HttpVersion.HTTP_0_9) { @@ -313,7 +313,7 @@ public class HttpGenerator // yes we need a response header if (header==null || header.capacity()<=CHUNK_SIZE) - return Result.NEED_COMMIT; + return Result.NEED_HEADER; // Are we persistent by default? if (_persistent==null) @@ -330,8 +330,8 @@ public class HttpGenerator if (status!=101 ) { header.put(HttpTokens.CRLF); - _state = State.START; - return Result.OK; + _state=State.COMPLETING_1XX; + return Result.FLUSH; } } else if (status==204 || status==304) @@ -419,6 +419,10 @@ public class HttpGenerator return result; + case COMPLETING_1XX: + reset(); + return Result.OK; + case END: if (!_persistent) result=Result.SHUTDOWN_OUT; @@ -964,7 +968,7 @@ public class HttpGenerator _head = head; } - boolean isInformational() + public boolean isInformational() { return _status>=100 && _status<200; } diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java index 8bae5c9bcef..113d986b925 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java @@ -1112,8 +1112,8 @@ public class HttpParser /* ------------------------------------------------------------------------------- */ public void close() { - if (_state!=State.END) - throw new IllegalStateException(toString()); + if (_state!=State.END && _state!=State.CLOSED) + LOG.warn("Closing {}",this); _persistent=false; reset(); } @@ -1134,6 +1134,8 @@ public class HttpParser { this._state=state; _endOfContent=EndOfContent.UNKNOWN_CONTENT; + if (state==State.CLOSED) + _persistent=false; } /* ------------------------------------------------------------------------------- */ diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java index 9c2754a0392..b4853848dc1 100644 --- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java +++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java @@ -52,7 +52,7 @@ public class HttpGeneratorClientTest HttpGenerator.Result result=gen.generate(null,null,null,null,null,Action.COMPLETE); assertEquals(HttpGenerator.State.COMMITTING_COMPLETING,gen.getState()); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); Info info = new Info("GET","/index.html"); info.getHttpFields().add("Host","something"); info.getHttpFields().add("User-Agent","test"); @@ -105,7 +105,7 @@ public class HttpGeneratorClientTest assertTrue(BufferUtil.isEmpty(content1)); result=gen.generate(null,null,null,buffer,null,Action.COMPLETE); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING_COMPLETING,gen.getState()); Info info = new Info("POST","/index.html"); @@ -158,7 +158,7 @@ public class HttpGeneratorClientTest assertEquals(0,content0.remaining()); result=gen.generate(null,null,null,buffer,content1,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); assertEquals("Hello World! The",BufferUtil.toString(buffer)); assertEquals(43,content1.remaining()); @@ -257,7 +257,7 @@ public class HttpGeneratorClientTest HttpGenerator.Result result=gen.generate(null,null,null,null,content0,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); Info info = new Info("POST","/index.html"); @@ -338,7 +338,7 @@ public class HttpGeneratorClientTest assertEquals(0,content0.remaining()); result=gen.generate(null,null,null,buffer,content1,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); assertEquals("Hello World! The",BufferUtil.toString(buffer)); assertEquals(43,content1.remaining()); @@ -419,7 +419,7 @@ public class HttpGeneratorClientTest HttpGenerator.Result result=gen.generate(null,null,null,null,content0,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); Info info = new Info("POST","/index.html",59); diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java index d39de010a8d..b3263169a30 100644 --- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java +++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java @@ -189,8 +189,11 @@ public class HttpGeneratorServerTest switch(result) { - case NEED_COMMIT: + case NEED_INFO: info=new HttpGenerator.ResponseInfo(HttpVersion.fromVersion(version),_fields,_contentLength,_code,reason,_head); + break; + + case NEED_HEADER: header=BufferUtil.allocate(2048); break; @@ -369,7 +372,7 @@ public class HttpGeneratorServerTest HttpGenerator.Result result=gen.generate(null,null,null,null,null,Action.COMPLETE); assertEquals(HttpGenerator.State.COMMITTING_COMPLETING,gen.getState()); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1,new HttpFields(),-1,200,null,false); info.getHttpFields().add("Last-Modified",HttpFields.__01Jan1970); @@ -412,7 +415,7 @@ public class HttpGeneratorServerTest assertEquals(0,content0.remaining()); result=gen.generate(null,null,null,buffer,content1,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); assertEquals("Hello World! The",BufferUtil.toString(buffer)); assertEquals(43,content1.remaining()); @@ -517,7 +520,7 @@ public class HttpGeneratorServerTest assertEquals(0,content0.remaining()); result=gen.generate(null,null,null,buffer,content1,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); assertEquals("Hello World! The",BufferUtil.toString(buffer)); assertEquals(43,content1.remaining()); @@ -594,7 +597,7 @@ public class HttpGeneratorServerTest HttpGenerator.Result result=gen.generate(null,null,null,null,content0,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1,new HttpFields(),59,200,null,false); @@ -648,7 +651,7 @@ public class HttpGeneratorServerTest HttpGenerator.Result result=gen.generate(null,null,null,null,content0,null); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING,gen.getState()); ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1,new HttpFields(),-1,200,null,false); @@ -730,7 +733,78 @@ public class HttpGeneratorServerTest assertTrue(BufferUtil.isEmpty(content1)); result=gen.generate(null,null,null,buffer,null,Action.COMPLETE); - assertEquals(HttpGenerator.Result.NEED_COMMIT,result); + assertEquals(HttpGenerator.Result.NEED_INFO,result); + assertEquals(HttpGenerator.State.COMMITTING_COMPLETING,gen.getState()); + + ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1,new HttpFields(),-1,200,null,false); + info.getHttpFields().add("Last-Modified",HttpFields.__01Jan1970); + result=gen.generate(info,header,null,buffer,null,null); + assertEquals(HttpGenerator.Result.FLUSH,result); + assertEquals(HttpGenerator.State.COMPLETING,gen.getState()); + + String head = BufferUtil.toString(header); + BufferUtil.clear(header); + body+=BufferUtil.toString(buffer); + BufferUtil.clear(buffer); + + result=gen.generate(info,null,null,buffer,null,null); + assertEquals(HttpGenerator.Result.OK,result); + assertEquals(HttpGenerator.State.END,gen.getState()); + + assertThat(head,containsString("HTTP/1.1 200 OK")); + assertThat(head,containsString("Last-Modified: Thu, 01 Jan 1970 00?00?00 GMT")); + assertThat(head,containsString("Content-Length: 58")); + assertTrue(head.endsWith("\r\n\r\n")); + + assertEquals("Hello World. The quick brown fox jumped over the lazy dog.",body); + + assertEquals(58,gen.getContentPrepared()); + } + + @Test + public void test100ThenResponseWithSmallContent() throws Exception + { + String body=""; + ByteBuffer header=BufferUtil.allocate(4096); + ByteBuffer buffer=BufferUtil.allocate(8096); + ByteBuffer content=BufferUtil.toBuffer("Hello World"); + ByteBuffer content1=BufferUtil.toBuffer(". The quick brown fox jumped over the lazy dog."); + HttpGenerator gen = new HttpGenerator(); + + HttpGenerator.Result + + result=gen.generate(HttpGenerator.CONTINUE_100_INFO,null,null,null,null,Action.COMPLETE); + assertEquals(HttpGenerator.Result.NEED_HEADER,result); + assertEquals(HttpGenerator.State.COMMITTING_COMPLETING,gen.getState()); + + result=gen.generate(HttpGenerator.CONTINUE_100_INFO,header,null,null,null,Action.COMPLETE); + assertEquals(HttpGenerator.Result.FLUSH,result); + assertEquals(HttpGenerator.State.COMPLETING_1XX,gen.getState()); + assertThat(BufferUtil.toString(header),Matchers.startsWith("HTTP/1.1 100 Continue")); + BufferUtil.clear(header); + + result=gen.generate(null,null,null,null,null,null); + assertEquals(HttpGenerator.Result.OK,result); + assertEquals(HttpGenerator.State.START,gen.getState()); + + result=gen.generate(null,null,null,null,content,null); + assertEquals(HttpGenerator.Result.NEED_BUFFER,result); + assertEquals(HttpGenerator.State.START,gen.getState()); + + result=gen.generate(null,null,null,buffer,content,null); + assertEquals(HttpGenerator.Result.OK,result); + assertEquals(HttpGenerator.State.START,gen.getState()); + assertEquals("Hello World",BufferUtil.toString(buffer)); + assertTrue(BufferUtil.isEmpty(content)); + + result=gen.generate(null,null,null,buffer,content1,null); + assertEquals(HttpGenerator.Result.OK,result); + assertEquals(HttpGenerator.State.START,gen.getState()); + assertEquals("Hello World. The quick brown fox jumped over the lazy dog.",BufferUtil.toString(buffer)); + assertTrue(BufferUtil.isEmpty(content1)); + + result=gen.generate(null,null,null,buffer,null,Action.COMPLETE); + assertEquals(HttpGenerator.Result.NEED_INFO,result); assertEquals(HttpGenerator.State.COMMITTING_COMPLETING,gen.getState()); ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1,new HttpFields(),-1,200,null,false); diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java index a7edf3368d9..93bc60b8687 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java @@ -32,7 +32,7 @@ public abstract class AbstractEndPoint implements EndPoint } @Override - public void setMaxIdleTime(int timeMs) throws IOException + public void setMaxIdleTime(int timeMs) { _maxIdleTime=timeMs; } diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java index 15789ea8d2c..ef0a72a4a9b 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java @@ -121,9 +121,8 @@ public interface EndPoint /* ------------------------------------------------------------ */ /** Set the max idle time. * @param timeMs the max idle time in MS. Timeout <= 0 implies an infinite timeout - * @throws IOException if the timeout cannot be set. */ - void setMaxIdleTime(int timeMs) throws IOException; + void setMaxIdleTime(int timeMs); diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ReadInterest.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ReadInterest.java index 0c21b69f6b9..e0aae7a29b7 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ReadInterest.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ReadInterest.java @@ -43,7 +43,6 @@ public abstract class ReadInterest } } - /* ------------------------------------------------------------ */ public void readable() { diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java index b691b01b268..5f33b57221c 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java @@ -328,6 +328,7 @@ public abstract class HttpChannel if (_state.isInitial()) { _request.setDispatcherType(DispatcherType.REQUEST); + _request.setPathInfo(_uri.getPath()); getHttpConnector().customize(_request); getServer().handle(this); } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java index 3f03281c2ed..e417fc38402 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java @@ -467,10 +467,15 @@ public class HttpConnection extends AbstractAsyncConnection switch(result) { - case NEED_COMMIT: + case NEED_INFO: if (_info==null) _info=_channel.getEventHandler().commit(); LOG.debug("{} Gcommit {}",this,_info); + if (_responseHeader==null) + _responseHeader=_bufferPool.acquire(_connector.getResponseHeaderSize(),false); + continue; + + case NEED_HEADER: _responseHeader=_bufferPool.acquire(_connector.getResponseHeaderSize(),false); continue; @@ -541,7 +546,6 @@ public class HttpConnection extends AbstractAsyncConnection LOG.debug("{} commit {}",this,_info); - // TODO review the locks with a mind that other threads may read and write synchronized (_lock) { try @@ -558,16 +562,20 @@ public class HttpConnection extends AbstractAsyncConnection LOG.debug("{} commit: {} ({},{},{})@{}", this, result, - BufferUtil.toSummaryString(_responseHeader), + BufferUtil.toDetailString(_responseHeader), BufferUtil.toSummaryString(_responseBuffer), BufferUtil.toSummaryString(content), _generator.getState()); switch(result) { - case NEED_COMMIT: - if (_info==null) - _info=_channel.getEventHandler().commit(); + case NEED_INFO: + _info=_channel.getEventHandler().commit(); + if (_responseHeader==null) + _responseHeader=_bufferPool.acquire(_connector.getResponseHeaderSize(),false); + break; + + case NEED_HEADER: _responseHeader=_bufferPool.acquire(_connector.getResponseHeaderSize(),false); break; @@ -606,6 +614,8 @@ public class HttpConnection extends AbstractAsyncConnection break loop; case OK: + if (_info!=null && _info.isInformational()) + _info=null; break loop; } } @@ -731,24 +741,45 @@ public class HttpConnection extends AbstractAsyncConnection } } + @Override + public int available() + { + int available=super.available(); + if (available==0 && _parser.isInContent() && BufferUtil.hasContent(_requestBuffer)) + return 1; + return available; + } + @Override public void consumeAll() { - while (true) + // Consume content only if the connection is persistent + if (!_generator.isPersistent()) { + _parser.setState(HttpParser.State.CLOSED); synchronized (_inputQ.lock()) { _inputQ.clear(); } - if (_parser.isComplete() || _parser.isClosed()) - return; - try + } + else + { + while (true) { - blockForContent(); - } - catch(IOException e) - { - LOG.warn(e); + synchronized (_inputQ.lock()) + { + _inputQ.clear(); + } + if (_parser.isComplete() || _parser.isClosed()) + return; + try + { + blockForContent(); + } + catch(IOException e) + { + LOG.warn(e); + } } } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalHttpConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalHttpConnector.java index d043f53ba26..ef5c31eebe4 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalHttpConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalHttpConnector.java @@ -26,6 +26,7 @@ import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; +import org.omg.CORBA._PolicyStub; public class LocalHttpConnector extends HttpConnector { @@ -52,19 +53,24 @@ public class LocalHttpConnector extends HttpConnector public ByteBuffer getResponses(ByteBuffer requestsBuffer) throws Exception { - int phase=_executor._phaser.getPhase(); + LOG.debug("getResponses"); + Phaser phaser=_executor._phaser; + int phase = phaser.register(); // the corresponding arrival will be done by the acceptor thread when it takes LocalEndPoint request = new LocalEndPoint(); request.setInput(requestsBuffer); _connects.add(request); - _executor._phaser.awaitAdvance(phase); + phaser.awaitAdvance(phase); return request.takeOutput(); } - public void executeRequest(String rawRequest) + public LocalEndPoint executeRequest(String rawRequest) { + Phaser phaser=_executor._phaser; + int phase = phaser.register(); // the corresponding arrival will be done by the acceptor thread when it takes LocalEndPoint endp = new LocalEndPoint(); endp.setInput(BufferUtil.toBuffer(rawRequest,StringUtil.__UTF8_CHARSET)); _connects.add(endp); + return endp; } @Override @@ -72,12 +78,10 @@ public class LocalHttpConnector extends HttpConnector { LOG.debug("accepting {}",acceptorID); LocalEndPoint endp = _connects.take(); - _executor._phaser.register(); HttpConnection connection=new HttpConnection(this,endp,getServer()); endp.setAsyncConnection(connection); - LOG.debug("accepted {} {}",endp,connection); connection.onOpen(); - _executor._phaser.arriveAndDeregister(); + _executor._phaser.arriveAndDeregister(); // arrive for the register done in getResponses } @@ -109,7 +113,7 @@ public class LocalHttpConnector extends HttpConnector @Override protected boolean onAdvance(int phase, int registeredParties) { - return super.onAdvance(phase,registeredParties); + return false; } }; @@ -123,6 +127,7 @@ public class LocalHttpConnector extends HttpConnector public void execute(final Runnable task) { _phaser.register(); + LOG.debug("{} execute {} {}",this,task,_phaser); _executor.execute(new Runnable() { @Override @@ -141,17 +146,26 @@ public class LocalHttpConnector extends HttpConnector } } - private class LocalEndPoint extends AsyncByteArrayEndPoint + public class LocalEndPoint extends AsyncByteArrayEndPoint { LocalEndPoint() { setGrowOutput(true); + setMaxIdleTime(LocalHttpConnector.this.getMaxIdleTime()); } LocalEndPoint(CountDownLatch onCloseLatch) { this(); } + + public void addInput(String s) + { + // TODO this is a busy wait + while(getIn()==null || BufferUtil.hasContent(getIn())) + Thread.yield(); + setInput(BufferUtil.toBuffer(s,StringUtil.__UTF8_CHARSET)); + } } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index 6bbbb3bd637..d19bb5c59d5 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -939,7 +939,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server. target = URIUtil.compactPath(target); if (!checkContext(target,baseRequest,response)) return; - + if (target.length() > _contextPath.length()) { if (_contextPath.length() > 1) diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/LocalHttpConnectorTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/LocalHttpConnectorTest.java new file mode 100644 index 00000000000..1873be41c5d --- /dev/null +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/LocalHttpConnectorTest.java @@ -0,0 +1,75 @@ +package org.eclipse.jetty.server; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; + +import org.eclipse.jetty.util.log.Log; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class LocalHttpConnectorTest +{ + private Server _server; + private LocalHttpConnector _connector; + + @Before + public void init() throws Exception + { + _server = new Server(); + _connector = new LocalHttpConnector(); + _server.addConnector(_connector); + _server.setHandler(new DumpHandler()); + _server.start(); + //_server.dumpStdErr(); + } + + @After + public void tini() throws Exception + { + _server.stop(); + _server=null; + _connector=null; + } + + @Test + public void testOneGET() throws Exception + { + String response=_connector.getResponses("GET /R1 HTTP/1.0\r\n\r\n"); + + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("pathInfo=/R1")); + + } + + @Test + public void testTwoGETs() throws Exception + { + String response=_connector.getResponses( + "GET /R1 HTTP/1.1\r\n"+ + "Host: localhost\r\n"+ + "\r\n"+ + "GET /R2 HTTP/1.0\r\n\r\n"); + + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("pathInfo=/R1")); + + response=response.substring(response.indexOf("")+8); + + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("pathInfo=/R2")); + + } + + @Test + public void testGETandGET() throws Exception + { + String response=_connector.getResponses("GET /R1 HTTP/1.0\r\n\r\n"); + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("pathInfo=/R1")); + + response=_connector.getResponses("GET /R2 HTTP/1.0\r\n\r\n"); + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("pathInfo=/R2")); + } +} diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/LocalServer.java b/jetty-server/src/test/java/org/eclipse/jetty/server/LocalServer.java deleted file mode 100644 index 853ebaee1f9..00000000000 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/LocalServer.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.eclipse.jetty.server; - -public class LocalServer -{ - - public static void main(String[] s) throws Exception - { - Server server = new Server(); - LocalHttpConnector connector = new LocalHttpConnector(); - server.addConnector(connector); - server.setHandler(new DumpHandler()); - server.start(); - server.dumpStdErr(); - - System.err.println(connector.getResponses("GET / HTTP/1.0\r\n\r\n")); - - server.stop(); - } -} diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RFC2616Test.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RFC2616Test.java index 19ac63b7b62..ece368c097b 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/RFC2616Test.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RFC2616Test.java @@ -19,6 +19,8 @@ */ package org.eclipse.jetty.server; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -29,7 +31,10 @@ import java.util.List; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.util.log.Log; +import org.hamcrest.Matchers; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -46,6 +51,7 @@ public class RFC2616Test { server = new Server(); connector = new LocalHttpConnector(); + connector.setMaxIdleTime(10000); server.addConnector(connector); ContextHandler vcontext=new ContextHandler(); @@ -102,66 +108,136 @@ public class RFC2616Test } @Test - public void test3_6() + public void test3_6_a() throws Exception { String response=null; - try - { - int offset=0; + int offset=0; - // Chunk last - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked,identity\n"+"Content-Type: text/plain\n" - +"\015\012"+"5;\015\012"+"123\015\012\015\012"+"0;\015\012\015\012"); - checkContains(response,offset,"HTTP/1.1 400 Bad","Chunked last"); + // Chunk last + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked,identity\n"+ + "Content-Type: text/plain\n"+ + "\015\012"+ + "5;\015\012"+ + "123\015\012\015\012"+ + "0;\015\012\015\012"); + checkContains(response,offset,"HTTP/1.1 400 Bad","Chunked last"); + } + + @Test + public void test3_6_b() throws Exception + { + String response=null; + int offset=0; - // Chunked - offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked\n"+"Content-Type: text/plain\n"+"\n"+"2;\n" - +"12\n"+"3;\n"+"345\n"+"0;\n\n"+ + // Chunked + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked\n"+ + "Content-Type: text/plain\n"+ + "\n"+ + "2;\n"+ + "12\n"+ + "3;\n"+ + "345\n"+ + "0;\n\n"+ - "GET /R2 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked\n"+"Content-Type: text/plain\n"+"\n"+"4;\n"+"6789\n"+"5;\n"+"abcde\n" - +"0;\n\n"+ + "GET /R2 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked\n"+ + "Content-Type: text/plain\n"+ + "\n"+ + "4;\n"+ + "6789\n"+ + "5;\n"+ + "abcde\n"+ + "0;\n\n"+ - "GET /R3 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); - offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); - offset=checkContains(response,offset,"12345","3.6.1 Chunking"); - offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); - offset=checkContains(response,offset,"6789abcde","3.6.1 Chunking"); - offset=checkContains(response,offset,"/R3","3.6.1 Chunking"); + "GET /R3 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Connection: close\n"+ + "\n"); + offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); + offset=checkContains(response,offset,"12345","3.6.1 Chunking"); + offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); + offset=checkContains(response,offset,"6789abcde","3.6.1 Chunking"); + offset=checkContains(response,offset,"/R3","3.6.1 Chunking"); - // Chunked - offset=0; - response=connector.getResponses("POST /R1 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked\n"+"Content-Type: text/plain\n"+"\n"+"3;\n" - +"fgh\n"+"3;\n"+"Ijk\n"+"0;\n\n"+ + } + + @Test + public void test3_6_c() throws Exception + { + String response=null; + int offset=0; - "POST /R2 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked\n"+"Content-Type: text/plain\n"+"\n"+"4;\n"+"lmno\n"+"5;\n"+"Pqrst\n" - +"0;\n\n"+ + response=connector.getResponses( + "POST /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked\n"+ + "Content-Type: text/plain\n"+ + "\n"+ + "3;\n"+ + "fgh\n"+ + "3;\n"+ + "Ijk\n"+ + "0;\n\n"+ - "GET /R3 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); - checkNotContained(response,"HTTP/1.1 100","3.6.1 Chunking"); - offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); - offset=checkContains(response,offset,"fghIjk","3.6.1 Chunking"); - offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); - offset=checkContains(response,offset,"lmnoPqrst","3.6.1 Chunking"); - offset=checkContains(response,offset,"/R3","3.6.1 Chunking"); + "POST /R2 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked\n"+ + "Content-Type: text/plain\n"+ + "\n"+ + "4;\n"+ + "lmno\n"+ + "5;\n"+ + "Pqrst\n"+ + "0;\n\n"+ - // Chunked and keep alive - offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked\n"+"Content-Type: text/plain\n" - +"Connection: keep-alive\n"+"\n"+"3;\n"+"123\n"+"3;\n"+"456\n"+"0;\n\n"+ + "GET /R3 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Connection: close\n"+ + "\n"); + checkNotContained(response,"HTTP/1.1 100","3.6.1 Chunking"); + offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); + offset=checkContains(response,offset,"fghIjk","3.6.1 Chunking"); + offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); + offset=checkContains(response,offset,"lmnoPqrst","3.6.1 Chunking"); + offset=checkContains(response,offset,"/R3","3.6.1 Chunking"); + + } + + @Test + public void test3_6_d() throws Exception + { + String response=null; + int offset=0; + + // Chunked and keep alive + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked\n"+ + "Content-Type: text/plain\n"+ + "Connection: keep-alive\n"+ + "\n"+ + "3;\n"+ + "123\n"+ + "3;\n"+ + "456\n"+ + "0;\n\n"+ + + "GET /R2 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Connection: close\n"+ + "\n"); + offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking")+10; + offset=checkContains(response,offset,"123456","3.6.1 Chunking"); + offset=checkContains(response,offset,"/R2","3.6.1 Chunking")+10; - "GET /R2 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); - offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking")+10; - offset=checkContains(response,offset,"123456","3.6.1 Chunking"); - offset=checkContains(response,offset,"/R2","3.6.1 Chunking")+10; - } - catch (Exception e) - { - e.printStackTrace(); - assertTrue(false); - if (response!=null) - System.err.println(response); - } } @Test @@ -189,69 +265,111 @@ public class RFC2616Test } @Test - public void test4_4() + public void test4_4_2() throws Exception { - try - { String response; int offset=0; // 2 // If _content length not used, second request will not be read. - offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: identity\n"+"Content-Type: text/plain\n" - +"Content-Length: 5\n"+"\n"+"123\015\012"+ + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: identity\n"+ + "Content-Type: text/plain\n"+ + "Content-Length: 5\n"+ + "\n"+ + "123\015\012"+ - "GET /R2 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); + "GET /R2 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: other\n"+ + "Connection: close\n"+ + "\n"); offset=checkContains(response,offset,"HTTP/1.1 200 OK","2. identity")+10; offset=checkContains(response,offset,"/R1","2. identity")+3; offset=checkContains(response,offset,"HTTP/1.1 200 OK","2. identity")+10; offset=checkContains(response,offset,"/R2","2. identity")+3; - - // 3 - // _content length is ignored, as chunking is used. If it is - // not ignored, the second request wont be seen. - offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Transfer-Encoding: chunked\n"+"Content-Type: text/plain\n" - +"Content-Length: 100\n"+"\n"+"3;\n"+"123\n"+"3;\n"+"456\n"+"0;\n"+"\n"+ - - "GET /R2 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"Content-Type: text/plain\n"+"Content-Length: 6\n"+"\n"+"123456"); - offset=checkContains(response,offset,"HTTP/1.1 200 OK","3. ignore c-l")+1; - offset=checkContains(response,offset,"/R1","3. ignore c-l")+1; - offset=checkContains(response,offset,"123456","3. ignore c-l")+1; - offset=checkContains(response,offset,"HTTP/1.1 200 OK","3. ignore c-l")+1; - offset=checkContains(response,offset,"/R2","3. _content-length")+1; - offset=checkContains(response,offset,"123456","3. _content-length")+1; - - // No _content length - assertTrue("Skip 411 checks as IE breaks this rule",true); - // offset=0; connector.reopen(); - // response=connector.getResponses("GET /R2 HTTP/1.1\n"+ - // "Host: localhost\n"+ - // "Content-Type: text/plain\n"+ - // "Connection: close\n"+ - // "\n"+ - // "123456"); - // offset=checkContains(response,offset, - // "HTTP/1.1 411 ","411 length required")+10; - // offset=0; connector.reopen(); - // response=connector.getResponses("GET /R2 HTTP/1.0\n"+ - // "Content-Type: text/plain\n"+ - // "\n"+ - // "123456"); - // offset=checkContains(response,offset, - // "HTTP/1.0 411 ","411 length required")+10; - - } - catch (Exception e) - { - e.printStackTrace(); - assertTrue(false); - } } @Test - public void test5_2() throws Exception + public void test4_4_3() throws Exception + { + String response; + int offset=0; + // 3 + // _content length is ignored, as chunking is used. If it is + // not ignored, the second request wont be seen. + offset=0; + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Transfer-Encoding: chunked\n"+ + "Content-Type: text/plain\n"+ + "Content-Length: 100\n"+ + "\n"+ + "3;\n"+ + "123\n"+ + "3;\n"+ + "456\n"+ + "0;\n"+ + "\n"+ + + "GET /R2 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Connection: close\n"+ + "Content-Type: text/plain\n"+ + "Content-Length: 6\n"+ + "\n"+ + "abcdef"); + offset=checkContains(response,offset,"HTTP/1.1 200 OK","3. ignore c-l")+1; + offset=checkContains(response,offset,"/R1","3. ignore c-l")+1; + offset=checkContains(response,offset,"123456","3. ignore c-l")+1; + offset=checkContains(response,offset,"HTTP/1.1 200 OK","3. ignore c-l")+1; + offset=checkContains(response,offset,"/R2","3. _content-length")+1; + offset=checkContains(response,offset,"abcdef","3. _content-length")+1; + } + + @Test + public void test4_4_4() throws Exception + { + // No _content length + assertTrue("Skip 411 checks as IE breaks this rule",true); + // offset=0; connector.reopen(); + // response=connector.getResponses("GET /R2 HTTP/1.1\n"+ + // "Host: localhost\n"+ + // "Content-Type: text/plain\n"+ + // "Connection: close\n"+ + // "\n"+ + // "123456"); + // offset=checkContains(response,offset, + // "HTTP/1.1 411 ","411 length required")+10; + // offset=0; connector.reopen(); + // response=connector.getResponses("GET /R2 HTTP/1.0\n"+ + // "Content-Type: text/plain\n"+ + // "\n"+ + // "123456"); + // offset=checkContains(response,offset, + // "HTTP/1.0 411 ","411 length required")+10; + + } + + @Test + public void test5_2_1() throws Exception + { + String response; + int offset=0; + + // Default Host + offset=0; + response=connector.getResponses("GET http://VirtualHost:8888/path/R1 HTTP/1.1\n"+"Host: wronghost\n"+"\n"); + offset=checkContains(response,offset,"HTTP/1.1 200","Default host")+1; + offset=checkContains(response,offset,"Virtual Dump","virtual host")+1; + offset=checkContains(response,offset,"pathInfo=/path/R1","Default host")+1; + } + + @Test + public void test5_2_2() throws Exception { String response; int offset=0; @@ -259,10 +377,23 @@ public class RFC2616Test // Default Host offset=0; response=connector.getResponses("GET /path/R1 HTTP/1.1\n"+"Host: localhost\n"+"\n"); - offset=checkContains(response,offset,"HTTP/1.1 200","Default host")+1; offset=checkContains(response,offset,"Dump HttpHandler","Default host")+1; offset=checkContains(response,offset,"pathInfo=/path/R1","Default host")+1; + + // Virtual Host + offset=0; + response=connector.getResponses("GET /path/R2 HTTP/1.1\n"+"Host: VirtualHost\n"+"\n"); + offset=checkContains(response,offset,"HTTP/1.1 200","Default host")+1; + offset=checkContains(response,offset,"Virtual Dump","virtual host")+1; + offset=checkContains(response,offset,"pathInfo=/path/R2","Default host")+1; + } + + @Test + public void test5_2() throws Exception + { + String response; + int offset=0; // Virtual Host offset=0; @@ -319,38 +450,39 @@ public class RFC2616Test } @Test - public void test8_2() throws Exception + public void test10_4_18() throws Exception { String response; int offset=0; - // No Expect 100 - offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+ - "Host: localhost\n"+ - "Content-Type: text/plain\n"+ - "Content-Length: 8\n"+ - "\n",true); - - assertTrue("8.2.3 no expect 100",response==null || response.length()==0); - response=connector.getResponses("GET /R1 HTTP/1.1\n"+ - "Host: localhost\n"+ - "Content-Type: text/plain\n"+ - "Content-Length: 8\n"+ - "\n"+ - "AbCdEf\015\012",true); - offset=checkContains(response,offset,"HTTP/1.1 200","8.2.3 no expect 100")+1; - offset=checkContains(response,offset,"AbCdEf","8.2.3 no expect 100")+1; - + // Expect Failure offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Expect: unknown\n"+"Content-Type: text/plain\n"+"Content-Length: 8\n" - +"\n"); + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Expect: unknown\n"+ + "Content-Type: text/plain\n"+ + "Content-Length: 8\n"+ + "\n"); offset=checkContains(response,offset,"HTTP/1.1 417","8.2.3 expect failure")+1; + } + @Test + public void test8_2_3_dash5() throws Exception + { + String response; + int offset=0; // Expect with body offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Expect: 100-continue\n"+"Content-Type: text/plain\n" - +"Content-Length: 8\n"+"Connection: close\n"+"\n"+"123456\015\012"); + response=connector.getResponses( + "GET /R1 HTTP/1.1\n"+ + "Host: localhost\n"+ + "Expect: 100-continue\n"+ + "Content-Type: text/plain\n"+ + "Content-Length: 8\n"+ + "Connection: close\n"+ + "\n"+ + "123456\015\012"); checkNotContained(response,offset,"HTTP/1.1 100 ","8.2.3 expect 100"); offset=checkContains(response,offset,"HTTP/1.1 200 OK","8.2.3 expect with body")+1; } @@ -358,23 +490,27 @@ public class RFC2616Test @Test public void test8_2_3() throws Exception { - String response; int offset=0; // Expect 100 - response=connector.getResponses("GET /R1 HTTP/1.1\n"+ + LocalHttpConnector.LocalEndPoint endp =connector.executeRequest("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Connection: close\n"+ "Expect: 100-continue\n"+ "Content-Type: text/plain\n"+ "Content-Length: 8\n"+ - "\n",true); - offset=checkContains(response,offset,"HTTP/1.1 100 ","8.2.3 expect 100")+1; - checkNotContained(response,offset,"HTTP/1.1 200","8.2.3 expect 100"); - /* can't test this with localconnector. - response=connector.getResponses("654321\015\012"); - offset=checkContains(response,offset,"HTTP/1.1 200","8.2.3 expect 100")+1; - offset=checkContains(response,offset,"654321","8.2.3 expect 100")+1; - */ + "\n"); + Thread.sleep(200); + String infomational= endp.takeOutputString(); + offset=checkContains(infomational,offset,"HTTP/1.1 100 ","8.2.3 expect 100")+1; + checkNotContained(infomational,offset,"HTTP/1.1 200","8.2.3 expect 100"); + + endp.addInput("654321\015\012"); + + Thread.sleep(200); + String response= endp.takeOutputString(); + offset=0; + offset=checkContains(response,offset,"HTTP/1.1 200","8.2.3 expect 100")+1; + offset=checkContains(response,offset,"654321","8.2.3 expect 100")+1; } @Test @@ -390,7 +526,7 @@ public class RFC2616Test "Expect: 100-continue\n"+ "Content-Type: text/plain\n"+ "Content-Length: 8\n"+ - "\n",true); + "\n"); checkNotContained(response,offset,"HTTP/1.1 100","8.2.3 expect 100"); offset=checkContains(response,offset,"HTTP/1.1 401 ","8.2.3 expect 100")+1; offset=checkContains(response,offset,"Connection: close","8.2.3 expect 100")+1; @@ -819,24 +955,16 @@ public class RFC2616Test private int checkContains(String s, int offset, String c, String test) { - int o=s.indexOf(c,offset); - if (o0 && !MimeTypes.FORM_ENCODED.equals(request.getContentType())) + if (request.getContentLength()>0 && !MimeTypes.Type.FORM_ENCODED.asString().equals(request.getContentType())) _content=IO.toString(request.getInputStream()); if (_checker!=null && _checker.check(request,response)) diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java index 1bc2b3e0580..d5128666b90 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java @@ -33,7 +33,6 @@ import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSessionContext; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpURI; @@ -78,7 +77,7 @@ public class ResponseTest @Test public void testContentType() throws Exception { - AbstractHttpConnection connection = new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer()); + TestHttpChannel connection = new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer()); Response response = connection.getResponse(); assertEquals(null,response.getContentType()); @@ -133,7 +132,7 @@ public class ResponseTest public void testLocale() throws Exception { - AbstractHttpConnection connection = new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer()); + TestHttpChannel connection = new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer()); Request request = connection.getRequest(); Response response = connection.getResponse(); ContextHandler context = new ContextHandler(); @@ -157,7 +156,7 @@ public class ResponseTest @Test public void testContentTypeCharacterEncoding() throws Exception { - AbstractHttpConnection connection = new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer()); + TestHttpChannel connection = new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer()); Response response = connection.getResponse(); @@ -189,7 +188,7 @@ public class ResponseTest @Test public void testCharacterEncodingContentType() throws Exception { - Response response = new Response(new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer())); + Response response = new Response(new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer())); response.setCharacterEncoding("utf-8"); response.setContentType("foo/bar"); @@ -218,7 +217,7 @@ public class ResponseTest @Test public void testContentTypeWithCharacterEncoding() throws Exception { - Response response = new Response(new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer())); + Response response = new Response(new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer())); response.setCharacterEncoding("utf16"); response.setContentType("foo/bar; charset=utf-8"); @@ -247,7 +246,7 @@ public class ResponseTest @Test public void testContentTypeWithOther() throws Exception { - Response response = new Response(new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer())); + Response response = new Response(new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer())); response.setContentType("foo/bar; other=xyz"); assertEquals("foo/bar; other=xyz",response.getContentType()); @@ -270,7 +269,7 @@ public class ResponseTest @Test public void testContentTypeWithCharacterEncodingAndOther() throws Exception { - Response response = new Response(new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer())); + Response response = new Response(new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer())); response.setCharacterEncoding("utf16"); response.setContentType("foo/bar; charset=utf-8 other=xyz"); @@ -310,7 +309,7 @@ public class ResponseTest response.sendError(500, "Database Error"); assertEquals(500, response.getStatus()); assertEquals("Database Error", response.getReason()); - assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL)); + assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL.asString())); response=newResponse(); @@ -323,14 +322,14 @@ public class ResponseTest response.sendError(406, "Super Nanny"); assertEquals(406, response.getStatus()); assertEquals("Super Nanny", response.getReason()); - assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL)); + assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL.asString())); } @Test public void testEncodeRedirect() throws Exception { - AbstractHttpConnection connection=new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer()); + TestHttpChannel connection=new TestHttpChannel(connector,new ByteArrayEndPoint(), connector.getServer()); Response response = new Response(connection); Request request = connection.getRequest(); request.setServerName("myhost"); @@ -395,7 +394,7 @@ public class ResponseTest for (int i=1;i