Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2010-09-21 07:20:07 +0000
committerGreg Wilkins2010-09-21 07:20:07 +0000
commita47bc35e2d71d04237c7c2657aa55e7ee4c31e6d (patch)
tree9ed22a54fb4e67986ec67887a680ae975231ba6f
parent4cb511afa49a6b3f56cd9989a5892dfafac784bb (diff)
downloadorg.eclipse.jetty.project-a47bc35e2d71d04237c7c2657aa55e7ee4c31e6d.tar.gz
org.eclipse.jetty.project-a47bc35e2d71d04237c7c2657aa55e7ee4c31e6d.tar.xz
org.eclipse.jetty.project-a47bc35e2d71d04237c7c2657aa55e7ee4c31e6d.zip
JETTY-1265 Reason field option in client response
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@2289 7e9141cc-0065-0410-87d8-b60c137991c4
-rw-r--r--VERSION.txt1
-rw-r--r--jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java81
-rw-r--r--jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java49
3 files changed, 110 insertions, 21 deletions
diff --git a/VERSION.txt b/VERSION.txt
index 61c3e04bd1..5edf53ca0e 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -43,6 +43,7 @@ jetty-7.2-SNAPSHOT
+ JETTY-1256 annotation jars from Orbit
+ JETTY-1261 errant listener usage in StandardDescriptorProcessor
+ JETTY-1263 JDBCSessionIdManager table creation fails on Oracle
+ + JETTY-1265 Reason field option in client response
+ JETTY-1266 Destroy sessions before filters/servlets
+ JETTY-1268 Form Auth saves POST data
+ JETTY-1269 Improve log multithreadedness
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 b3ccf79002..c2f6c153bc 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
@@ -29,10 +29,11 @@ import org.eclipse.jetty.util.log.Log;
public class HttpParser implements Parser
{
// States
- public static final int STATE_START=-13;
- public static final int STATE_FIELD0=-12;
- public static final int STATE_SPACE1=-11;
- public static final int STATE_FIELD1=-10;
+ public static final int STATE_START=-14;
+ public static final int STATE_FIELD0=-13;
+ public static final int STATE_SPACE1=-12;
+ public static final int STATE_STATUS=-11;
+ public static final int STATE_URI=-10;
public static final int STATE_SPACE2=-9;
public static final int STATE_END0=-8;
public static final int STATE_END1=-7;
@@ -352,6 +353,7 @@ public class HttpParser implements Parser
if (ch == HttpTokens.SPACE)
{
_tok0.update(_buffer.markIndex(), _buffer.getIndex() - 1);
+ _responseStatus=HttpVersions.CACHE.get(_tok0)==null?-1:0;
_state=STATE_SPACE1;
continue;
}
@@ -365,7 +367,13 @@ public class HttpParser implements Parser
if (ch > HttpTokens.SPACE || ch<0)
{
_buffer.mark();
- _state=STATE_FIELD1;
+ if (_responseStatus>=0)
+ {
+ _state=STATE_STATUS;
+ _responseStatus=ch-'0';
+ }
+ else
+ _state=STATE_URI;
}
else if (ch < HttpTokens.SPACE)
{
@@ -373,7 +381,34 @@ public class HttpParser implements Parser
}
break;
- case STATE_FIELD1:
+ case STATE_STATUS:
+ if (ch == HttpTokens.SPACE)
+ {
+ _tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1);
+ _state=STATE_SPACE2;
+ continue;
+ }
+ else if (ch>='0' && ch<='9')
+ {
+ _responseStatus=_responseStatus*10+(ch-'0');
+ continue;
+ }
+ else if (ch < HttpTokens.SPACE && ch>=0)
+ {
+ _handler.startResponse(HttpMethods.CACHE.lookup(_tok0), _responseStatus, null);
+ _eol=ch;
+ _state=STATE_HEADER;
+ _tok0.setPutIndex(_tok0.getIndex());
+ _tok1.setPutIndex(_tok1.getIndex());
+ _multiLineValue=null;
+ continue;
+ }
+ // not a digit, so must be a URI
+ _state=STATE_URI;
+ _responseStatus=-1;
+ break;
+
+ case STATE_URI:
if (ch == HttpTokens.SPACE)
{
_tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1);
@@ -400,28 +435,34 @@ public class HttpParser implements Parser
}
else if (ch < HttpTokens.SPACE)
{
- // HTTP/0.9
- _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1, null);
- _state=STATE_END;
- _handler.headerComplete();
- _handler.messageComplete(_contentPosition);
- return total_filled;
+ if (_responseStatus>0)
+ {
+ _handler.startResponse(HttpMethods.CACHE.lookup(_tok0), _responseStatus, null);
+ _eol=ch;
+ _state=STATE_HEADER;
+ _tok0.setPutIndex(_tok0.getIndex());
+ _tok1.setPutIndex(_tok1.getIndex());
+ _multiLineValue=null;
+ }
+ else
+ {
+ // HTTP/0.9
+ _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1, null);
+ _state=STATE_END;
+ _handler.headerComplete();
+ _handler.messageComplete(_contentPosition);
+ return total_filled;
+ }
}
break;
case STATE_FIELD2:
if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)
{
-
- // TODO - we really should know if we are parsing request or response!
- final Buffer method = HttpMethods.CACHE.lookup(_tok0);
- if (method==_tok0 && _tok1.length()==3 && Character.isDigit(_tok1.peek()))
- {
- _responseStatus = BufferUtil.toInt(_tok1);
+ if (_responseStatus>0)
_handler.startResponse(HttpVersions.CACHE.lookup(_tok0), _responseStatus,_buffer.sliceFromMark());
- }
else
- _handler.startRequest(method, _tok1,HttpVersions.CACHE.lookup(_buffer.sliceFromMark()));
+ _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1,HttpVersions.CACHE.lookup(_buffer.sliceFromMark()));
_eol=ch;
_state=STATE_HEADER;
_tok0.setPutIndex(_tok0.getIndex());
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java
index 70a2462115..6f89e560a5 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java
@@ -429,6 +429,53 @@ public class HttpParserTest
assertTrue(messageCompleted);
}
+
+ @Test
+ public void testResponseParse3() throws Exception
+ {
+ StringEndPoint io=new StringEndPoint();
+ io.setInput(
+ "HTTP/1.1 200\015\012"
+ + "Content-Length: 10\015\012"
+ + "Content-Type: text/plain\015\012"
+ + "\015\012"
+ + "0123456789\015\012");
+ ByteArrayBuffer buffer= new ByteArrayBuffer(4096);
+ SimpleBuffers buffers=new SimpleBuffers(buffer,null);
+
+ Handler handler = new Handler();
+ HttpParser parser= new HttpParser(buffers,io, handler);
+ parser.parse();
+ assertEquals("HTTP/1.1", f0);
+ assertEquals("200", f1);
+ assertEquals(null, f2);
+ assertEquals(_content.length(), 10);
+ assertTrue(headerCompleted);
+ assertTrue(messageCompleted);
+ }
+ @Test
+ public void testResponseParse4() throws Exception
+ {
+ StringEndPoint io=new StringEndPoint();
+ io.setInput(
+ "HTTP/1.1 200 \015\012"
+ + "Content-Length: 10\015\012"
+ + "Content-Type: text/plain\015\012"
+ + "\015\012"
+ + "0123456789\015\012");
+ ByteArrayBuffer buffer= new ByteArrayBuffer(4096);
+ SimpleBuffers buffers=new SimpleBuffers(buffer,null);
+
+ Handler handler = new Handler();
+ HttpParser parser= new HttpParser(buffers,io, handler);
+ parser.parse();
+ assertEquals("HTTP/1.1", f0);
+ assertEquals("200", f1);
+ assertEquals(null, f2);
+ assertEquals(_content.length(), 10);
+ assertTrue(headerCompleted);
+ assertTrue(messageCompleted);
+ }
private String _content;
private String f0;
private String f1;
@@ -509,7 +556,7 @@ public class HttpParserTest
request=false;
f0 = version.toString();
f1 = Integer.toString(status);
- f2 = reason.toString();
+ f2 = reason==null?null:reason.toString();
fields=new HttpFields();
hdr= new String[9];

Back to the top