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 BBBE510C19 for ; Fri, 7 Feb 2014 09:19:08 +0000 (UTC) Received: (qmail 5732 invoked by uid 500); 7 Feb 2014 09:19:07 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 5158 invoked by uid 500); 7 Feb 2014 09:18:57 -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 5125 invoked by uid 99); 7 Feb 2014 09:18:54 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Feb 2014 09:18:54 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Feb 2014 09:18:51 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 24F4823888E4 for ; Fri, 7 Feb 2014 09:18:30 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1565591 - in /httpcomponents/httpcore/trunk/httpcore-nio/src: main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java Date: Fri, 07 Feb 2014 09:18:30 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140207091830.24F4823888E4@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: olegk Date: Fri Feb 7 09:18:29 2014 New Revision: 1565591 URL: http://svn.apache.org/r1565591 Log: Code consistency: tolerate lone LF at the end of the chunk Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java?rev=1565591&r1=1565590&r2=1565591&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java Fri Feb 7 09:18:29 2014 @@ -41,7 +41,6 @@ import org.apache.http.annotation.NotThr import org.apache.http.impl.io.HttpTransportMetricsImpl; import org.apache.http.message.BufferedHeader; import org.apache.http.nio.reactor.SessionInputBuffer; -import org.apache.http.protocol.HTTP; import org.apache.http.util.Args; import org.apache.http.util.CharArrayBuffer; @@ -84,22 +83,24 @@ public class ChunkDecoder extends Abstra } private void readChunkHead() throws IOException { - if (this.endOfChunk) { - if (this.buffer.length() < 2) { - return; - } - final int cr = this.buffer.read(); - final int lf = this.buffer.read(); - if (cr != HTTP.CR || lf != HTTP.LF) { - throw new MalformedChunkCodingException("CRLF expected at end of chunk"); - } - this.endOfChunk = false; - } if (this.lineBuf == null) { this.lineBuf = new CharArrayBuffer(32); } else { this.lineBuf.clear(); } + if (this.endOfChunk) { + if (this.buffer.readLine(this.lineBuf, this.endOfStream)) { + if (!this.lineBuf.isEmpty()) { + throw new MalformedChunkCodingException("CRLF expected at end of chunk"); + } + } else { + if (this.buffer.length() > 2) { + throw new MalformedChunkCodingException("CRLF expected at end of chunk"); + } + return; + } + this.endOfChunk = false; + } if (this.buffer.readLine(this.lineBuf, this.endOfStream)) { int separator = this.lineBuf.indexOf(';'); if (separator < 0) { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java?rev=1565591&r1=1565590&r2=1565591&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java Fri Feb 7 09:18:29 2014 @@ -143,6 +143,28 @@ public class TestChunkDecoder { } @Test + public void testMalformedChunk() throws Exception { + final String s = "5\r\n01234----------------------------------------------------------" + + "-----------------------------------------------------------------------------" + + "-----------------------------------------------------------------------------"; + final ReadableByteChannel channel = new ReadableByteChannelMock( + new String[] {s}, Consts.ASCII); + + final SessionInputBuffer inbuf = new SessionInputBufferImpl(32, 32, Consts.ASCII); + final HttpTransportMetricsImpl metrics = new HttpTransportMetricsImpl(); + final ChunkDecoder decoder = new ChunkDecoder(channel, inbuf, metrics); + + final ByteBuffer dst = ByteBuffer.allocate(1024); + + try { + decoder.read(dst); + Assert.fail("MalformedChunkCodingException should have been thrown"); + } catch (final MalformedChunkCodingException ex) { + // expected + } + } + + @Test public void testIncompleteChunkDecoding() throws Exception { final String[] chunks = { "10;", @@ -211,7 +233,7 @@ public class TestChunkDecoder { @Test public void testMalformedChunkEndingDecoding() throws Exception { - final String s = "5\r\n01234\r\n5\r\n56789\n\r6\r\nabcdef\r\n0\r\n\r\n"; + final String s = "5\r\n01234\r\n5\r\n56789\r\r6\r\nabcdef\r\n0\r\n\r\n"; final ReadableByteChannel channel = new ReadableByteChannelMock( new String[] {s}, Consts.ASCII);