Return-Path: X-Original-To: apmail-hc-commits-archive@www.apache.org Delivered-To: apmail-hc-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6F16017EBD for ; Sat, 30 May 2015 15:45:06 +0000 (UTC) Received: (qmail 15807 invoked by uid 500); 30 May 2015 15:45:06 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 15765 invoked by uid 500); 30 May 2015 15:45:06 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 15755 invoked by uid 99); 30 May 2015 15:45:06 -0000 Received: from eris.apache.org (HELO hades.apache.org) (140.211.11.105) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 30 May 2015 15:45:06 +0000 Received: from hades.apache.org (localhost [127.0.0.1]) by hades.apache.org (ASF Mail Server at hades.apache.org) with ESMTP id 3173FAC035B for ; Sat, 30 May 2015 15:45:06 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1682617 - in /httpcomponents/httpcore/trunk: httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/ httpcore/src/main/java/org/apache/http/impl/io/ httpcore/src/main/java/org/apache/http/message/ httpcore/src/test/java/org/apache/http... Date: Sat, 30 May 2015 15:45:05 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20150530154506.3173FAC035B@hades.apache.org> Author: olegk Date: Sat May 30 15:45:05 2015 New Revision: 1682617 URL: http://svn.apache.org/r1682617 Log: RFC 7230: reject headers containing whitespaces between the header field name and colon in strict mode (when parsing request messages on the server side) Added: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLaxLineParser.java - copied, changed from r1682616, httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpRequestParserFactory.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpResponseParserFactory.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpRequestParserFactory.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpResponseParserFactory.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicLineParser.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BufferedHeader.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/io/TestMessageParser.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicLineParser.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBufferedHeader.java Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpRequestParserFactory.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpRequestParserFactory.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpRequestParserFactory.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpRequestParserFactory.java Sat May 30 15:45:05 2015 @@ -54,8 +54,7 @@ public class DefaultHttpRequestParserFac final HttpRequestFactory requestFactory) { super(); this.lineParser = lineParser != null ? lineParser : LazyLineParser.INSTANCE; - this.requestFactory = requestFactory != null ? requestFactory - : DefaultHttpRequestFactory.INSTANCE; + this.requestFactory = requestFactory != null ? requestFactory : DefaultHttpRequestFactory.INSTANCE; } public DefaultHttpRequestParserFactory() { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpResponseParserFactory.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpResponseParserFactory.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpResponseParserFactory.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/DefaultHttpResponseParserFactory.java Sat May 30 15:45:05 2015 @@ -32,7 +32,7 @@ import org.apache.http.HttpResponseFacto import org.apache.http.annotation.Immutable; import org.apache.http.config.MessageConstraints; import org.apache.http.impl.DefaultHttpResponseFactory; -import org.apache.http.message.LazyLineParser; +import org.apache.http.message.LazyLaxLineParser; import org.apache.http.message.LineParser; import org.apache.http.nio.NHttpMessageParser; import org.apache.http.nio.NHttpMessageParserFactory; @@ -53,9 +53,8 @@ public class DefaultHttpResponseParserFa public DefaultHttpResponseParserFactory(final LineParser lineParser, final HttpResponseFactory responseFactory) { super(); - this.lineParser = lineParser != null ? lineParser : LazyLineParser.INSTANCE; - this.responseFactory = responseFactory != null ? responseFactory - : DefaultHttpResponseFactory.INSTANCE; + this.lineParser = lineParser != null ? lineParser : LazyLaxLineParser.INSTANCE; + this.responseFactory = responseFactory != null ? responseFactory : DefaultHttpResponseFactory.INSTANCE; } public DefaultHttpResponseParserFactory() { Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpRequestParserFactory.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpRequestParserFactory.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpRequestParserFactory.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpRequestParserFactory.java Sat May 30 15:45:05 2015 @@ -54,8 +54,7 @@ public class DefaultHttpRequestParserFac final HttpRequestFactory requestFactory) { super(); this.lineParser = lineParser != null ? lineParser : LazyLineParser.INSTANCE; - this.requestFactory = requestFactory != null ? requestFactory - : DefaultHttpRequestFactory.INSTANCE; + this.requestFactory = requestFactory != null ? requestFactory : DefaultHttpRequestFactory.INSTANCE; } public DefaultHttpRequestParserFactory() { Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpResponseParserFactory.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpResponseParserFactory.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpResponseParserFactory.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/DefaultHttpResponseParserFactory.java Sat May 30 15:45:05 2015 @@ -34,7 +34,7 @@ import org.apache.http.config.MessageCon import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.io.HttpMessageParser; import org.apache.http.io.HttpMessageParserFactory; -import org.apache.http.message.LazyLineParser; +import org.apache.http.message.LazyLaxLineParser; import org.apache.http.message.LineParser; /** @@ -53,9 +53,8 @@ public class DefaultHttpResponseParserFa public DefaultHttpResponseParserFactory(final LineParser lineParser, final HttpResponseFactory responseFactory) { super(); - this.lineParser = lineParser != null ? lineParser : LazyLineParser.INSTANCE; - this.responseFactory = responseFactory != null ? responseFactory - : DefaultHttpResponseFactory.INSTANCE; + this.lineParser = lineParser != null ? lineParser : LazyLaxLineParser.INSTANCE; + this.responseFactory = responseFactory != null ? responseFactory : DefaultHttpResponseFactory.INSTANCE; } public DefaultHttpResponseParserFactory() { Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicLineParser.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicLineParser.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicLineParser.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicLineParser.java Sat May 30 15:45:05 2015 @@ -195,7 +195,10 @@ public class BasicLineParser implements final ParserCursor cursor = new ParserCursor(0, buffer.length()); this.tokenParser.skipWhiteSpace(buffer, cursor); final String name = this.tokenParser.parseToken(buffer, cursor, COLON); - if (TextUtils.isEmpty(name) || cursor.atEnd()) { + if (cursor.getPos() == cursor.getLowerBound() || cursor.getPos() == cursor.getUpperBound() || + buffer.charAt(cursor.getPos()) != ':' || + TextUtils.isEmpty(name) || + TokenParser.isWhitespace(buffer.charAt(cursor.getPos() - 1))) { throw new ParseException("Invalid header: " + buffer.toString()); } final String value = buffer.substringTrimmed(cursor.getPos() + 1, cursor.getUpperBound()); Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BufferedHeader.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BufferedHeader.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BufferedHeader.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BufferedHeader.java Sat May 30 15:45:05 2015 @@ -72,11 +72,17 @@ public class BufferedHeader implements F * @throws ParseException in case of a parse error */ public BufferedHeader(final CharArrayBuffer buffer) throws ParseException { + this(buffer, true); + } + BufferedHeader(final CharArrayBuffer buffer, final boolean strict) throws ParseException { super(); Args.notNull(buffer, "Char array buffer"); final int colon = buffer.indexOf(':'); - if (colon == -1) { + if (colon <= 0) { + throw new ParseException("Invalid header: " + buffer.toString()); + } + if (strict && TokenParser.isWhitespace(buffer.charAt(colon - 1))) { throw new ParseException("Invalid header: " + buffer.toString()); } final String s = buffer.substringTrimmed(0, colon); Copied: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLaxLineParser.java (from r1682616, httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java) URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLaxLineParser.java?p2=httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLaxLineParser.java&p1=httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java&r1=1682616&r2=1682617&rev=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLaxLineParser.java Sat May 30 15:45:05 2015 @@ -38,19 +38,26 @@ import org.apache.http.util.CharArrayBuf * header values. Header value is parsed only if accessed with * {@link org.apache.http.Header#getValue()} or {@link org.apache.http.Header#getElements()} * methods. + *

+ * This parser unlike {@link BasicLineParser} and {@link LazyLineParser} + * will not reject headers containing whitespaces between the header field + * name and colon. + *

+ * This parser should be used to parse response messages on the client server + * or to parse both request and response messages by an intermediary (proxy). * * @since 5.0 */ @Immutable -public class LazyLineParser extends BasicLineParser { +public class LazyLaxLineParser extends BasicLineParser { - public final static LazyLineParser INSTANCE = new LazyLineParser(); + public final static LazyLaxLineParser INSTANCE = new LazyLaxLineParser(); @Override public Header parseHeader(final CharArrayBuffer buffer) throws ParseException { Args.notNull(buffer, "Char array buffer"); - return new BufferedHeader(buffer); + return new BufferedHeader(buffer, false); } } Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/LazyLineParser.java Sat May 30 15:45:05 2015 @@ -38,6 +38,8 @@ import org.apache.http.util.CharArrayBuf * header values. Header value is parsed only if accessed with * {@link org.apache.http.Header#getValue()} or {@link org.apache.http.Header#getElements()} * methods. + *

+ * This parser should be used to parse request messages on the server server. * * @since 5.0 */ @@ -50,7 +52,7 @@ public class LazyLineParser extends Basi public Header parseHeader(final CharArrayBuffer buffer) throws ParseException { Args.notNull(buffer, "Char array buffer"); - return new BufferedHeader(buffer); + return new BufferedHeader(buffer, true); } } Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/io/TestMessageParser.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/io/TestMessageParser.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/io/TestMessageParser.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/io/TestMessageParser.java Sat May 30 15:45:05 2015 @@ -59,15 +59,14 @@ public class TestMessageParser { public void testBasicHeaderParsing() throws Exception { final String s = "header1: stuff\r\n" + - "header2 : stuff \r\n" + + "header2: stuff \r\n" + "header3: stuff\r\n" + " and more stuff\r\n" + "\t and even more stuff\r\n" + " \r\n" + "\r\n"; final SessionInputBuffer receiver = new SessionInputBufferMock(s, Consts.ASCII); - final Header[] headers = AbstractMessageParser.parseHeaders - (receiver, -1, -1, null); + final Header[] headers = AbstractMessageParser.parseHeaders(receiver, -1, -1, null); Assert.assertNotNull(headers); Assert.assertEquals(3, headers.length); Assert.assertEquals("header1", headers[0].getName()); @@ -80,15 +79,13 @@ public class TestMessageParser { @Test public void testParsingHeader() throws Exception { - final String s = - "header1 : stuff; param1 = value1; param2 = \"value 2\" \r\n" + - "\r\n"; + final String s = "header1: stuff; param1 = value1; param2 = \"value 2\" \r\n" + + "\r\n"; final SessionInputBuffer receiver = new SessionInputBufferMock(s, Consts.ASCII); - final Header[] headers = AbstractMessageParser.parseHeaders - (receiver, -1, -1, null); + final Header[] headers = AbstractMessageParser.parseHeaders(receiver, -1, -1, null); Assert.assertNotNull(headers); Assert.assertEquals(1, headers.length); - Assert.assertEquals("header1 : stuff; param1 = value1; param2 = \"value 2\" ", headers[0].toString()); + Assert.assertEquals("header1: stuff; param1 = value1; param2 = \"value 2\" ", headers[0].toString()); final HeaderElement[] elements = headers[0].getElements(); Assert.assertNotNull(elements); Assert.assertEquals(1, elements.length); @@ -131,10 +128,9 @@ public class TestMessageParser { public void testParsingMalformedFirstHeader() throws Exception { final String s = " header1: stuff\r\n" + - "header2 : stuff \r\n"; + "header2: stuff \r\n"; final SessionInputBuffer receiver = new SessionInputBufferMock(s, Consts.ASCII); - final Header[] headers = AbstractMessageParser.parseHeaders - (receiver, -1, -1, null); + final Header[] headers = AbstractMessageParser.parseHeaders(receiver, -1, -1, null); Assert.assertNotNull(headers); Assert.assertEquals(2, headers.length); Assert.assertEquals("header1", headers[0].getName()); @@ -147,8 +143,7 @@ public class TestMessageParser { public void testEmptyDataStream() throws Exception { final String s = ""; final SessionInputBuffer receiver = new SessionInputBufferMock(s, Consts.ASCII); - final Header[] headers = AbstractMessageParser.parseHeaders - (receiver, -1, -1, null); + final Header[] headers = AbstractMessageParser.parseHeaders(receiver, -1, -1, null); Assert.assertNotNull(headers); Assert.assertEquals(0, headers.length); } Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicLineParser.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicLineParser.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicLineParser.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicLineParser.java Sat May 30 15:45:05 2015 @@ -27,6 +27,7 @@ package org.apache.http.message; +import org.apache.http.Header; import org.apache.http.HttpVersion; import org.apache.http.ParseException; import org.apache.http.RequestLine; @@ -349,6 +350,85 @@ public class TestBasicLineParser { Assert.fail("ParseException should have been thrown"); } catch (final ParseException e) { //expected + } + } + + @Test + public void testHeaderParse() throws Exception { + final CharArrayBuffer buf = new CharArrayBuffer(64); + //typical request line + buf.clear(); + buf.append("header: blah"); + Header header = this.parser.parseHeader(buf); + Assert.assertEquals("header", header.getName()); + Assert.assertEquals("blah", header.getValue()); + + //Lots of blanks + buf.clear(); + buf.append(" header: blah "); + header = this.parser.parseHeader(buf); + Assert.assertEquals("header", header.getName()); + Assert.assertEquals("blah", header.getValue()); + } + + @Test + public void testInvalidHeaderParsing() throws Exception { + final CharArrayBuffer buffer = new CharArrayBuffer(16); + buffer.clear(); + buffer.append(""); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buffer.clear(); + buffer.append("blah"); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buffer.clear(); + buffer.append(":"); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buffer.clear(); + buffer.append(" :"); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buffer.clear(); + buffer.append(": blah"); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buffer.clear(); + buffer.append(" : blah"); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buffer.clear(); + buffer.append("header : blah"); + try { + this.parser.parseHeader(buffer); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected } } Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBufferedHeader.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBufferedHeader.java?rev=1682617&r1=1682616&r2=1682617&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBufferedHeader.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBufferedHeader.java Sat May 30 15:45:05 2015 @@ -33,6 +33,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.apache.http.HeaderElement; +import org.apache.http.ParseException; import org.apache.http.util.CharArrayBuffer; import org.junit.Assert; import org.junit.Test; @@ -47,7 +48,7 @@ public class TestBufferedHeader { public void testBasicConstructor() throws Exception { final CharArrayBuffer buf = new CharArrayBuffer(32); buf.append("name: value"); - final BufferedHeader header = new BufferedHeader(buf); + final BufferedHeader header = new BufferedHeader(buf, false); Assert.assertEquals("name", header.getName()); Assert.assertEquals("value", header.getValue()); Assert.assertSame(buf, header.getBuffer()); @@ -55,20 +56,10 @@ public class TestBufferedHeader { } @Test - public void testInvalidName() throws Exception { - try { - new BufferedHeader(null); - Assert.fail("IllegalArgumentException should have been thrown"); - } catch (final IllegalArgumentException ex) { - //expected - } - } - - @Test public void testHeaderElements() throws Exception { final CharArrayBuffer buf = new CharArrayBuffer(32); buf.append("name: element1 = value1, element2; param1 = value1, element3"); - final BufferedHeader header = new BufferedHeader(buf); + final BufferedHeader header = new BufferedHeader(buf, false); final HeaderElement[] elements = header.getElements(); Assert.assertNotNull(elements); Assert.assertEquals(3, elements.length); @@ -85,7 +76,7 @@ public class TestBufferedHeader { public void testSerialization() throws Exception { final CharArrayBuffer buf = new CharArrayBuffer(32); buf.append("name: value"); - final BufferedHeader orig = new BufferedHeader(buf); + final BufferedHeader orig = new BufferedHeader(buf, false); final ByteArrayOutputStream outbuffer = new ByteArrayOutputStream(); final ObjectOutputStream outstream = new ObjectOutputStream(outbuffer); outstream.writeObject(orig); @@ -98,5 +89,66 @@ public class TestBufferedHeader { Assert.assertEquals(orig.getValue(), clone.getValue()); } + @Test + public void testInvalidHeaderParsing() throws Exception { + final CharArrayBuffer buf = new CharArrayBuffer(16); + buf.clear(); + buf.append(""); + try { + new BufferedHeader(buf, false); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buf.clear(); + buf.append("blah"); + try { + new BufferedHeader(buf, false); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buf.clear(); + buf.append(":"); + try { + new BufferedHeader(buf, false); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buf.clear(); + buf.append(" :"); + try { + new BufferedHeader(buf, false); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buf.clear(); + buf.append(": blah"); + try { + new BufferedHeader(buf, false); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buf.clear(); + buf.append(" : blah"); + try { + new BufferedHeader(buf, false); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + buf.clear(); + buf.append("header : blah"); + try { + new BufferedHeader(buf, true); + Assert.fail("ParseException should have been thrown"); + } catch (final ParseException e) { + //expected + } + } + }