[prev in list] [next in list] [prev in thread] [next in thread] 

List:       httpcomponents-commits
Subject:    svn commit: r1742948 - in /httpcomponents/httpcore/trunk/httpcore5-h2/src: main/java/org/apache/hc/c
From:       olegk () apache ! org
Date:       2016-05-09 13:31:45
Message-ID: 20160509133146.134853A043C () svn01-us-west ! apache ! org
[Download RAW message or body]

Author: olegk
Date: Mon May  9 13:31:45 2016
New Revision: 1742948

URL: http://svn.apache.org/viewvc?rev=1742948&view=rev
Log:
RFC 7540: frame input / output buffer implementations

Added:
    httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java \
                (contents, props changed)
      - copied, changed from r1742947, \
httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionInputBufferImpl.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputBuffer.java
                
      - copied, changed from r1742947, \
httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java \
(with props)  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java \
(with props)  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java \
                (contents, props changed)
      - copied, changed from r1742947, \
httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestFrameInOutBuffers.java
                
      - copied, changed from r1742947, \
httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java \
                (contents, props changed)
      - copied, changed from r1742947, \
httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java
 Removed:
    httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionInputBufferImpl.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/io/SessionInputBuffer.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/io/SessionOutputBuffer.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java
 Modified:
    httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2ConnectionException.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2StreamException.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/DefaultFrameFactory.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/FrameFactory.java
  httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/WritableByteChannelMock.java


Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2ConnectionException.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/H2ConnectionException.java?rev=1742948&r1=1742947&r2=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2ConnectionException.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2ConnectionException.java \
Mon May  9 13:31:45 2016 @@ -26,37 +26,29 @@
  */
 package org.apache.hc.core5.http2;
 
-import org.apache.hc.core5.http.ProtocolException;
+import java.io.IOException;
+
 import org.apache.hc.core5.util.Args;
 
-public class H2ConnectionException extends ProtocolException {
+public class H2ConnectionException extends IOException {
 
     private static final long serialVersionUID = -2014204317155428658L;
 
     private final int code;
-    private final long streamId;
 
-    public H2ConnectionException(final H2Error error, final long streamId, final \
String message) { +    public H2ConnectionException(final H2Error error, final String \
message) {  super(message);
         Args.notNull(error, "H2 Error code may not be null");
-        Args.positive(streamId, "H2 stream id may not be negative or zero");
         this.code = error.getCode();
-        this.streamId = streamId;
     }
 
-    public H2ConnectionException(final int code, final long streamId, final String \
message) { +    public H2ConnectionException(final int code, final String message) {
         super(message);
-        Args.positive(streamId, "H2 stream id may not be negative or zero");
         this.code = code;
-        this.streamId = streamId;
     }
 
     public int getCode() {
         return code;
     }
 
-    public long getStreamId() {
-        return streamId;
-    }
-
 };

Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2StreamException.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/H2StreamException.java?rev=1742948&r1=1742947&r2=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2StreamException.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/H2StreamException.java \
Mon May  9 13:31:45 2016 @@ -26,10 +26,11 @@
  */
 package org.apache.hc.core5.http2;
 
-import org.apache.hc.core5.http.ProtocolException;
+import java.io.IOException;
+
 import org.apache.hc.core5.util.Args;
 
-public class H2StreamException extends ProtocolException {
+public class H2StreamException extends IOException {
 
     private static final long serialVersionUID = 6321637486572232180L;
 

Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/DefaultFrameFactory.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/frame/DefaultFrameFactory.java?rev=1742948&r1=1742947&r2=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/DefaultFrameFactory.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/DefaultFrameFactory.java \
Mon May  9 13:31:45 2016 @@ -33,22 +33,24 @@ import org.apache.hc.core5.util.Args;
 
 public class DefaultFrameFactory extends FrameFactory {
 
-    public Frame<ByteBuffer> createHeaders(final int streamId, final ByteBuffer \
content, final boolean endHeaders, final boolean endStream) { +    public static \
final FrameFactory INSTANCE = new DefaultFrameFactory(); +
+    public Frame<ByteBuffer> createHeaders(final int streamId, final ByteBuffer \
payload, final boolean endHeaders, final boolean endStream) {  \
                Args.positive(streamId, "Stream id");
         final int flags = (endHeaders ? FrameFlag.END_HEADERS.value : 0) | \
                (endStream ? FrameFlag.END_STREAM.value : 0);
-        return new ByteBufferFrame(FrameType.HEADERS.getValue(), flags, streamId, \
content); +        return new ByteBufferFrame(FrameType.HEADERS.getValue(), flags, \
streamId, payload);  }
 
-    public Frame<ByteBuffer> createContinuation(final int streamId, final ByteBuffer \
content, final boolean endHeaders) { +    public Frame<ByteBuffer> \
createContinuation(final int streamId, final ByteBuffer payload, final boolean \
endHeaders) {  Args.positive(streamId, "Stream id");
         final int flags = (endHeaders ? FrameFlag.END_HEADERS.value : 0);
-        return new ByteBufferFrame(FrameType.CONTINUATION.getValue(), flags, \
streamId, content); +        return new \
ByteBufferFrame(FrameType.CONTINUATION.getValue(), flags, streamId, payload);  }
 
-    public Frame<ByteBuffer> createData(final int streamId, final ByteBuffer \
content, final boolean endStream) { +    public Frame<ByteBuffer> createData(final \
int streamId, final ByteBuffer payload, final boolean endStream) {  \
Args.positive(streamId, "Stream id");  final int flags = (endStream ? \
                FrameFlag.END_STREAM.value : 0);
-        return new ByteBufferFrame(FrameType.DATA.getValue(), flags, streamId, \
content); +        return new ByteBufferFrame(FrameType.DATA.getValue(), flags, \
streamId, payload);  }
 
 }

Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/FrameFactory.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/frame/FrameFactory.java?rev=1742948&r1=1742947&r2=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/FrameFactory.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/frame/FrameFactory.java \
Mon May  9 13:31:45 2016 @@ -59,18 +59,16 @@ public abstract class FrameFactory {
         return new ByteBufferFrame(FrameType.RST_STREAM.getValue(), 0, streamId, \
payload);  }
 
-    public Frame<ByteBuffer> createPing(final byte[] opaqueData) {
+    public Frame<ByteBuffer> createPing(final ByteBuffer opaqueData) {
         Args.notNull(opaqueData, "Opaque data");
-        Args.check(opaqueData.length == 8, "Opaque data length must be equal 8");
-        final ByteBuffer payload = ByteBuffer.wrap(opaqueData);
-        return new ByteBufferFrame(FrameType.PING.getValue(), 0, 0, payload);
+        Args.check(opaqueData.remaining() == 8, "Opaque data length must be equal \
8"); +        return new ByteBufferFrame(FrameType.PING.getValue(), 0, 0, \
opaqueData);  }
 
-    public Frame<ByteBuffer> createPingAck(final byte[] opaqueData) {
+    public Frame<ByteBuffer> createPingAck(final ByteBuffer opaqueData) {
         Args.notNull(opaqueData, "Opaque data");
-        Args.check(opaqueData.length == 8, "Opaque data length must be equal 8");
-        final ByteBuffer payload = ByteBuffer.wrap(opaqueData);
-        return new ByteBufferFrame(FrameType.PING.getValue(), FrameFlag.ACK.value, \
0, payload); +        Args.check(opaqueData.remaining() == 8, "Opaque data length \
must be equal 8"); +        return new ByteBufferFrame(FrameType.PING.getValue(), \
FrameFlag.ACK.value, 0, opaqueData);  }
 
     public Frame<ByteBuffer> createGoAway(final int lastStream, final H2Error error, \
final String message) { @@ -84,10 +82,10 @@ public abstract class FrameFactory {
         return new ByteBufferFrame(FrameType.GOAWAY.getValue(), 0, 0, payload);
     }
 
-    public abstract Frame<ByteBuffer> createHeaders(int streamId, ByteBuffer \
content, boolean endHeaders, boolean endStream); +    public abstract \
Frame<ByteBuffer> createHeaders(int streamId, ByteBuffer payload, boolean endHeaders, \
boolean endStream);  
-    public abstract Frame<ByteBuffer> createContinuation(int streamId, ByteBuffer \
content, boolean endHeaders); +    public abstract Frame<ByteBuffer> \
createContinuation(int streamId, ByteBuffer payload, boolean endHeaders);  
-    public abstract Frame<ByteBuffer> createData(int streamId, ByteBuffer content, \
boolean endStream); +    public abstract Frame<ByteBuffer> createData(int streamId, \
ByteBuffer payload, boolean endStream);  
 }

Copied: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java \
(from r1742947, httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionInputBufferImpl.java)
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java?p2=httpcomponents/httpcor \
e/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer. \
java&p1=httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/h \
ttp2/impl/io/SessionInputBufferImpl.java&r1=1742947&r2=1742948&rev=1742948&view=diff \
                ==============================================================================
                
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionInputBufferImpl.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java \
Mon May  9 13:31:45 2016 @@ -33,7 +33,6 @@ import java.nio.ByteBuffer;
 
 import org.apache.hc.core5.annotation.NotThreadSafe;
 import org.apache.hc.core5.http.ConnectionClosedException;
-import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http2.H2ConnectionException;
 import org.apache.hc.core5.http2.H2CorruptFrameException;
 import org.apache.hc.core5.http2.H2Error;
@@ -43,15 +42,15 @@ import org.apache.hc.core5.http2.frame.F
 import org.apache.hc.core5.http2.frame.FrameFlag;
 import org.apache.hc.core5.http2.impl.BasicHttp2TransportMetrics;
 import org.apache.hc.core5.http2.io.Http2TransportMetrics;
-import org.apache.hc.core5.http2.io.SessionInputBuffer;
 import org.apache.hc.core5.util.Args;
 
 /**
+ * Frame input buffer for HTTP/2 blocking connections.
  *
  * @since 5.0
  */
 @NotThreadSafe
-public class SessionInputBufferImpl implements SessionInputBuffer {
+public final class FrameInputBuffer {
 
     private final BasicHttp2TransportMetrics metrics;
     private final int maxFramePayloadSize;
@@ -60,24 +59,28 @@ public class SessionInputBufferImpl impl
     private int off;
     private int dataLen;
 
-    SessionInputBufferImpl(final BasicHttp2TransportMetrics metrics, final int \
bufferLen, final int maxFramePayloadSize) { +    FrameInputBuffer(final \
BasicHttp2TransportMetrics metrics, final int bufferLen, final int \
maxFramePayloadSize) {  Args.notNull(metrics, "HTTP2 transport metrcis");
-        Args.positive(maxFramePayloadSize, "Buffer size");
+        Args.positive(maxFramePayloadSize, "Maximum payload size");
         this.metrics = metrics;
         this.maxFramePayloadSize = maxFramePayloadSize;
         this.buffer = new byte[bufferLen];
         this.dataLen = 0;
     }
 
-    public SessionInputBufferImpl(final BasicHttp2TransportMetrics metrics, final \
                int maxFramePayloadSize) {
-        this(metrics, FrameConsts.HEAD_LEN + maxFramePayloadSize + \
FrameConsts.MAX_PADDING + 1, maxFramePayloadSize); +    public FrameInputBuffer(final \
BasicHttp2TransportMetrics metrics, final int maxFramePayloadSize) { +        \
this(metrics, FrameConsts.HEAD_LEN + maxFramePayloadSize, maxFramePayloadSize);  }
 
-    public SessionInputBufferImpl(final int maxFramePayloadSize) {
+    public FrameInputBuffer(final int maxFramePayloadSize) {
         this(new BasicHttp2TransportMetrics(), maxFramePayloadSize);
     }
 
-    private void fillBuffer(final InputStream instream, final int requiredLen)throws \
IOException { +    boolean hasData() {
+        return this.dataLen > 0;
+    }
+
+    void fillBuffer(final InputStream instream, final int requiredLen) throws \
IOException {  while (dataLen < requiredLen) {
             if (off > 0) {
                 System.arraycopy(buffer, off, buffer, 0, dataLen);
@@ -97,39 +100,42 @@ public class SessionInputBufferImpl impl
         }
     }
 
-    public Frame<ByteBuffer> readFrame(final InputStream instream) throws \
ProtocolException, IOException { +    public Frame<ByteBuffer> read(final InputStream \
instream) throws IOException {  
         fillBuffer(instream, FrameConsts.HEAD_LEN);
-        int payloadOff = FrameConsts.HEAD_LEN;
+        final int payloadOff = FrameConsts.HEAD_LEN;
 
         final int payloadLen = (buffer[off] & 0xff) << 16 | (buffer[off + 1] & 0xff) \
<< 8 | (buffer[off + 2] & 0xff);  final int type = buffer[off + 3] & 0xff;
         final int flags = buffer[off + 4] & 0xff;
-        final int streamId = (buffer[off + 5] & 0xff) << 24 | (buffer[off + 6] & \
0xff << 16) | (buffer[off + 7] & 0xff) << 8 | (buffer[off + 8] & 0xff); +        \
final int streamId = Math.abs(buffer[off + 5] & 0xff) << 24 | (buffer[off + 6] & 0xff \
<< 16) | (buffer[off + 7] & 0xff) << 8 | (buffer[off + 8] & 0xff);  if (payloadLen > \
                maxFramePayloadSize) {
-            throw new H2ConnectionException(H2Error.FRAME_SIZE_ERROR, streamId, \
                "Frame size exceeds maximum");
-        }
-
-        final int padding;
-        if ((flags & FrameFlag.PADDED.getValue()) == 0) {
-            padding = 0;
-        } else {
-            fillBuffer(instream, FrameConsts.HEAD_LEN + 1);
-            payloadOff = FrameConsts.HEAD_LEN + 1;
-            padding = buffer[off + 9] & 0xff;
+            throw new H2ConnectionException(H2Error.FRAME_SIZE_ERROR, "Frame size \
exceeds maximum");  }
 
-        final int frameLen = payloadOff + payloadLen + padding;
+        final int frameLen = payloadOff + payloadLen;
         fillBuffer(instream, frameLen);
 
         final ByteBuffer payload;
         if (payloadLen > 0) {
-            payload = ByteBuffer.wrap(buffer, off + payloadOff, \
payloadLen).asReadOnlyBuffer(); +            if ((flags & \
FrameFlag.PADDED.getValue()) == 0) { +                payload = \
ByteBuffer.wrap(buffer, off + payloadOff, payloadLen); +            } else {
+                if (payloadLen == 0) {
+                    throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, \
"Inconsistent padding"); +                }
+                final int padding = buffer[off + FrameConsts.HEAD_LEN] & 0xff;
+                if (payloadLen < padding + 1) {
+                    throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, \
"Inconsistent padding"); +                }
+                payload = ByteBuffer.wrap(buffer, off + payloadOff + 1, payloadLen - \
padding - 1); +            }
         } else {
             payload = null;
         }
 
-        final ByteBufferFrame frame = new ByteBufferFrame(type, flags, streamId, \
payload); +        final ByteBufferFrame frame = new ByteBufferFrame(type, flags & \
~FrameFlag.PADDED.getValue(), streamId, +                payload != null ? \
payload.asReadOnlyBuffer() : null);  
         off += frameLen;
         dataLen -= frameLen;

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java
                
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameInputBuffer.java
                
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputBuffer.java \
(from r1742947, httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java)
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/impl/io/FrameOutputBuffer.java?p2=httpcomponents/httpco \
re/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputBuffe \
r.java&p1=httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5 \
/http2/impl/io/SessionOutputBufferImpl.java&r1=1742947&r2=1742948&rev=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputBuffer.java \
Mon May  9 13:31:45 2016 @@ -32,7 +32,6 @@ import java.io.OutputStream;
 import java.nio.ByteBuffer;
 
 import org.apache.hc.core5.annotation.NotThreadSafe;
-import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http2.H2ConnectionException;
 import org.apache.hc.core5.http2.H2Error;
 import org.apache.hc.core5.http2.frame.Frame;
@@ -40,35 +39,34 @@ import org.apache.hc.core5.http2.frame.F
 import org.apache.hc.core5.http2.frame.FrameFlag;
 import org.apache.hc.core5.http2.impl.BasicHttp2TransportMetrics;
 import org.apache.hc.core5.http2.io.Http2TransportMetrics;
-import org.apache.hc.core5.http2.io.SessionOutputBuffer;
 import org.apache.hc.core5.util.Args;
 
 /**
- * Session output buffer for HTTP/2 blocking connections.
+ * Frame output buffer for HTTP/2 blocking connections.
  *
  * @since 5.0
  */
 @NotThreadSafe
-public class SessionOutputBufferImpl implements SessionOutputBuffer {
+public final class FrameOutputBuffer {
 
     private final BasicHttp2TransportMetrics metrics;
     private final int maxFramePayloadSize;
     private final byte[] buffer;
 
-    public SessionOutputBufferImpl(final BasicHttp2TransportMetrics metrics, final \
int maxFramePayloadSize) { +    public FrameOutputBuffer(final \
BasicHttp2TransportMetrics metrics, final int maxFramePayloadSize) {  super();
         Args.notNull(metrics, "HTTP2 transport metrcis");
-        Args.positive(maxFramePayloadSize, "Buffer size");
+        Args.positive(maxFramePayloadSize, "Maximum payload size");
         this.metrics = metrics;
         this.maxFramePayloadSize = maxFramePayloadSize;
         this.buffer = new byte[FrameConsts.HEAD_LEN + maxFramePayloadSize + \
FrameConsts.MAX_PADDING + 1];  }
 
-    public SessionOutputBufferImpl(final int maxFramePayloadSize) {
+    public FrameOutputBuffer(final int maxFramePayloadSize) {
         this(new BasicHttp2TransportMetrics(), maxFramePayloadSize);
     }
 
-    public void write(final Frame<ByteBuffer> frame, final OutputStream outstream) \
throws ProtocolException, IOException { +    public void write(final \
Frame<ByteBuffer> frame, final OutputStream outstream) throws IOException {  if \
(frame == null) {  return;
         }
@@ -78,7 +76,7 @@ public class SessionOutputBufferImpl imp
         final ByteBuffer payload = frame.getPayload();
         final int payloadLen = payload != null ? payload.remaining() : 0;
         if (payload != null && payload.remaining() > maxFramePayloadSize) {
-            throw new H2ConnectionException(H2Error.FRAME_SIZE_ERROR, streamId, \
"Frame size exceeds maximum"); +            throw new \
H2ConnectionException(H2Error.FRAME_SIZE_ERROR, "Frame size exceeds maximum");  }
         buffer[0] = (byte) (payloadLen >> 16 & 0xff);
         buffer[1] = (byte) (payloadLen >> 8 & 0xff);

Added: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java?rev=1742948&view=auto \
                ==============================================================================
                
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java \
                (added)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java \
Mon May  9 13:31:45 2016 @@ -0,0 +1,105 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.hc.core5.http2.impl.io;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+
+import org.apache.hc.core5.annotation.NotThreadSafe;
+import org.apache.hc.core5.util.Args;
+
+/**
+ * @since 5.0
+ */
+@NotThreadSafe
+abstract class FrameOutputStream extends OutputStream {
+
+    private final OutputStream outputStream;
+
+    private final byte[] cache;
+    private int cachePosition = 0;
+
+    public FrameOutputStream(final int minChunkSize, final OutputStream \
outputStream) { +        super();
+        this.outputStream = Args.notNull(outputStream, "Output stream");
+        this.cache = new byte[minChunkSize];
+    }
+
+    protected abstract void write(final ByteBuffer src, final boolean endStream, \
final OutputStream outputStream) throws IOException; +
+    private void flushCache(final boolean endStream) throws IOException {
+        if (this.cachePosition > 0) {
+            write(ByteBuffer.wrap(this.cache, 0, this.cachePosition), endStream, \
this.outputStream); +            this.cachePosition = 0;
+        }
+    }
+
+    @Override
+    public void write(final int b) throws IOException {
+        this.cache[this.cachePosition] = (byte) b;
+        this.cachePosition++;
+        if (this.cachePosition == this.cache.length) {
+            flushCache(false);
+        }
+    }
+
+    @Override
+    public void write(final byte[] b) throws IOException {
+        write(b, 0, b.length);
+    }
+
+    @Override
+    public void write(final byte[] src, final int off, final int len) throws \
IOException { +        if (len >= this.cache.length - this.cachePosition) {
+            flushCache(false);
+            write(ByteBuffer.wrap(src, off, len), false, this.outputStream);
+        } else {
+            System.arraycopy(src, off, cache, this.cachePosition, len);
+            this.cachePosition += len;
+        }
+    }
+
+    @Override
+    public void flush() throws IOException {
+        flushCache(false);
+        this.outputStream.flush();
+    }
+
+    @Override
+    public void close() throws IOException {
+        if (this.cachePosition > 0) {
+            flushCache(true);
+        } else {
+            write(null, true, this.outputStream);
+        }
+        flushCache(true);
+        this.outputStream.flush();
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java
                
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/FrameOutputStream.java
                
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java?rev=1742948&view=auto \
                ==============================================================================
                
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java \
                (added)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java \
Mon May  9 13:31:45 2016 @@ -0,0 +1,164 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.hc.core5.http2.impl.nio;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+
+import org.apache.hc.core5.annotation.NotThreadSafe;
+import org.apache.hc.core5.http.ConnectionClosedException;
+import org.apache.hc.core5.http2.H2ConnectionException;
+import org.apache.hc.core5.http2.H2CorruptFrameException;
+import org.apache.hc.core5.http2.H2Error;
+import org.apache.hc.core5.http2.frame.ByteBufferFrame;
+import org.apache.hc.core5.http2.frame.Frame;
+import org.apache.hc.core5.http2.frame.FrameConsts;
+import org.apache.hc.core5.http2.frame.FrameFlag;
+import org.apache.hc.core5.http2.impl.BasicHttp2TransportMetrics;
+import org.apache.hc.core5.http2.io.Http2TransportMetrics;
+import org.apache.hc.core5.util.Args;
+
+/**
+ * Frame input buffer for HTTP/2 non-blocking connections.
+ *
+ * @since 5.0
+ */
+@NotThreadSafe
+public final class FrameInputBuffer {
+
+    enum State { HEAD_EXPECTED, PAYLOAD_EXPECTED }
+
+    private final BasicHttp2TransportMetrics metrics;
+    private final int maxFramePayloadSize;
+    private final byte[] bytes;
+    private final ByteBuffer buffer;
+
+    private State state;
+    private int payloadLen;
+    private int type;
+    private int flags;
+    private int streamId;
+
+    FrameInputBuffer(final BasicHttp2TransportMetrics metrics, final int bufferLen, \
final int maxFramePayloadSize) { +        Args.notNull(metrics, "HTTP2 transport \
metrcis"); +        Args.positive(maxFramePayloadSize, "Maximum payload size");
+        this.metrics = metrics;
+        this.maxFramePayloadSize = maxFramePayloadSize;
+        this.bytes = new byte[bufferLen];
+        this.buffer = ByteBuffer.wrap(bytes);
+        this.buffer.flip();
+        this.state = State.HEAD_EXPECTED;
+    }
+
+    public FrameInputBuffer(final BasicHttp2TransportMetrics metrics, final int \
maxFramePayloadSize) { +        this(metrics, FrameConsts.HEAD_LEN + \
maxFramePayloadSize, maxFramePayloadSize); +    }
+
+    public FrameInputBuffer(final int maxFramePayloadSize) {
+        this(new BasicHttp2TransportMetrics(), maxFramePayloadSize);
+    }
+
+    public Frame<ByteBuffer> read(final ReadableByteChannel channel) throws \
IOException { +        for (;;) {
+            switch (state) {
+                case HEAD_EXPECTED:
+                    if (buffer.remaining() >= FrameConsts.HEAD_LEN) {
+                        final int lengthAndType = buffer.getInt();
+                        payloadLen = lengthAndType >> 8;
+                        if (payloadLen > maxFramePayloadSize) {
+                            throw new \
H2ConnectionException(H2Error.FRAME_SIZE_ERROR, "Frame size exceeds maximum"); +      \
} +                        type = lengthAndType & 0xff;
+                        flags = buffer.get();
+                        streamId = Math.abs(buffer.getInt());
+                        state = State.PAYLOAD_EXPECTED;
+                    } else {
+                        break;
+                    }
+                case PAYLOAD_EXPECTED:
+                    if (buffer.remaining() >= payloadLen) {
+                        final ByteBuffer payload;
+                        if ((flags & FrameFlag.PADDED.getValue()) == 0) {
+                            if (payloadLen > 0) {
+                                payload = ByteBuffer.wrap(bytes, buffer.position(), \
payloadLen); +                                buffer.position(buffer.position() + \
payloadLen); +                            } else {
+                                payload = null;
+                            }
+                        } else {
+                            if (payloadLen == 0) {
+                                throw new \
H2ConnectionException(H2Error.PROTOCOL_ERROR, "Inconsistent padding"); +              \
} +                            final int padding = buffer.get();
+                            if (payloadLen < padding + 1) {
+                                throw new \
H2ConnectionException(H2Error.PROTOCOL_ERROR, "Inconsistent padding"); +              \
} +                            final int off = buffer.position();
+                            final int len = payloadLen - padding - 1;
+                            payload = ByteBuffer.wrap(bytes, off, len);
+                            buffer.position(buffer.position() - 1 + payloadLen);
+                        }
+                        state = State.HEAD_EXPECTED;
+                        metrics.incrementFramesTransferred();
+                        return new ByteBufferFrame(type, flags & \
~FrameFlag.PADDED.getValue(), streamId, +                                payload != \
null ? payload.asReadOnlyBuffer() : null); +                    }
+            }
+            if (buffer.hasRemaining()) {
+                buffer.compact();
+            } else {
+                buffer.clear();
+            }
+            final int bytesRead = channel.read(buffer);
+            buffer.flip();
+            if (bytesRead > 0) {
+                metrics.incrementBytesTransferred(bytesRead);
+            }
+            if (bytesRead == 0) {
+                break;
+            } else if (bytesRead < 0) {
+                if (state != State.HEAD_EXPECTED || buffer.hasRemaining()) {
+                    throw new H2CorruptFrameException("Corrupt or incomplete HTTP2 \
frame"); +                } else {
+                    throw new ConnectionClosedException("Connection closed");
+                }
+            }
+        }
+        return null;
+    }
+
+    public void reset() {
+        buffer.compact();
+        state = State.HEAD_EXPECTED;
+    }
+
+    public Http2TransportMetrics getMetrics() {
+        return metrics;
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java
                
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameInputBuffer.java
                
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java \
(from r1742947, httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java)
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/ \
java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java?p2=httpcomponents/httpc \
ore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuf \
fer.java&p1=httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/cor \
e5/http2/impl/io/SessionOutputBufferImpl.java&r1=1742947&r2=1742948&rev=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/io/SessionOutputBufferImpl.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java \
Mon May  9 13:31:45 2016 @@ -24,92 +24,97 @@
  * <http://www.apache.org/>.
  *
  */
-
-package org.apache.hc.core5.http2.impl.io;
+package org.apache.hc.core5.http2.impl.nio;
 
 import java.io.IOException;
-import java.io.OutputStream;
 import java.nio.ByteBuffer;
+import java.nio.channels.GatheringByteChannel;
+import java.nio.channels.WritableByteChannel;
 
 import org.apache.hc.core5.annotation.NotThreadSafe;
-import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http2.H2ConnectionException;
 import org.apache.hc.core5.http2.H2Error;
 import org.apache.hc.core5.http2.frame.Frame;
 import org.apache.hc.core5.http2.frame.FrameConsts;
-import org.apache.hc.core5.http2.frame.FrameFlag;
 import org.apache.hc.core5.http2.impl.BasicHttp2TransportMetrics;
 import org.apache.hc.core5.http2.io.Http2TransportMetrics;
-import org.apache.hc.core5.http2.io.SessionOutputBuffer;
 import org.apache.hc.core5.util.Args;
 
 /**
- * Session output buffer for HTTP/2 blocking connections.
+ * Frame output buffer for HTTP/2 non-blocking connections.
  *
  * @since 5.0
  */
 @NotThreadSafe
-public class SessionOutputBufferImpl implements SessionOutputBuffer {
+public final class FrameOutputBuffer {
 
     private final BasicHttp2TransportMetrics metrics;
     private final int maxFramePayloadSize;
-    private final byte[] buffer;
+    private final ByteBuffer buffer;
 
-    public SessionOutputBufferImpl(final BasicHttp2TransportMetrics metrics, final \
                int maxFramePayloadSize) {
-        super();
+    public FrameOutputBuffer(final BasicHttp2TransportMetrics metrics, final int \
maxFramePayloadSize) {  Args.notNull(metrics, "HTTP2 transport metrcis");
-        Args.positive(maxFramePayloadSize, "Buffer size");
+        Args.positive(maxFramePayloadSize, "Maximum payload size");
         this.metrics = metrics;
         this.maxFramePayloadSize = maxFramePayloadSize;
-        this.buffer = new byte[FrameConsts.HEAD_LEN + maxFramePayloadSize + \
FrameConsts.MAX_PADDING + 1]; +        this.buffer = \
ByteBuffer.allocate(FrameConsts.HEAD_LEN + maxFramePayloadSize);  }
 
-    public SessionOutputBufferImpl(final int maxFramePayloadSize) {
+    public FrameOutputBuffer(final int maxFramePayloadSize) {
         this(new BasicHttp2TransportMetrics(), maxFramePayloadSize);
     }
 
-    public void write(final Frame<ByteBuffer> frame, final OutputStream outstream) \
                throws ProtocolException, IOException {
-        if (frame == null) {
-            return;
+    private void writeToChannel(final WritableByteChannel channel, final ByteBuffer \
src) throws IOException { +        final int bytesWritten = channel.write(src);
+        if (bytesWritten > 0) {
+            metrics.incrementBytesTransferred(bytesWritten);
         }
-        final int type = frame.getType();
-        final long streamId = frame.getStreamId();
-        final int flags = frame.getFlags();
+    }
+
+    public void write(final Frame<ByteBuffer> frame, final WritableByteChannel \
channel) throws IOException { +        Args.notNull(frame, "Frame");
+
         final ByteBuffer payload = frame.getPayload();
-        final int payloadLen = payload != null ? payload.remaining() : 0;
         if (payload != null && payload.remaining() > maxFramePayloadSize) {
-            throw new H2ConnectionException(H2Error.FRAME_SIZE_ERROR, streamId, \
                "Frame size exceeds maximum");
-        }
-        buffer[0] = (byte) (payloadLen >> 16 & 0xff);
-        buffer[1] = (byte) (payloadLen >> 8 & 0xff);
-        buffer[2] = (byte) (payloadLen & 0xff);
-
-        buffer[3] = (byte) (type & 0xff);
-        buffer[4] = (byte) (flags & 0xff);
-
-        buffer[5] = (byte) (streamId >> 24 & 0xff);
-        buffer[6] = (byte) (streamId >> 16 & 0xff);
-        buffer[7] = (byte) (streamId >> 8 & 0xff);;
-        buffer[8] = (byte) (streamId & 0xff);
-
-        int frameLen = FrameConsts.HEAD_LEN;
-        int padding = 0;
-        if ((flags & FrameFlag.PADDED.getValue()) > 0) {
-            padding = 16;
-            buffer[9] = (byte) (padding & 0xff);
-            frameLen++;
+            throw new H2ConnectionException(H2Error.FRAME_SIZE_ERROR, "Frame size \
exceeds maximum");  }
+
+        buffer.putInt((payload != null ? payload.remaining() << 8 : 0) | \
(frame.getType() & 0xff)); +        buffer.put((byte) (frame.getFlags() & 0xff));
+        buffer.putInt(frame.getStreamId());
+
         if (payload != null) {
-            payload.get(buffer, frameLen, payload.remaining());
-            frameLen += payloadLen;
+            if (channel instanceof GatheringByteChannel) {
+                buffer.flip();
+                ((GatheringByteChannel) channel).write(new ByteBuffer[]{buffer, \
payload}); +                buffer.compact();
+                if (payload.hasRemaining()) {
+                    buffer.put(payload);
+                }
+            } else {
+                buffer.put(payload);
+            }
         }
-        for (int i = 0; i < padding; i++) {
-            buffer[frameLen++] = 0;
+
+        if (buffer.position() > 0) {
+            buffer.flip();
+            writeToChannel(channel, buffer);
+            buffer.compact();
         }
-        outstream.write(buffer, 0, frameLen);
 
         metrics.incrementFramesTransferred();
-        metrics.incrementBytesTransferred(frameLen);
+    }
+
+    public void flush(final WritableByteChannel channel) throws IOException {
+        if (buffer.position() > 0) {
+            buffer.flip();
+            writeToChannel(channel, buffer);
+            buffer.compact();
+        }
+    }
+
+    public boolean isEmpty() {
+        return buffer.position() == 0;
     }
 
     public Http2TransportMetrics getMetrics() {

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java
                
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/FrameOutputBuffer.java
                
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestFrameInOutBuffers.java \
(from r1742947, httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java)
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/test/ \
java/org/apache/hc/core5/http2/impl/io/TestFrameInOutBuffers.java?p2=httpcomponents/ht \
tpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestFrameInO \
utBuffers.java&p1=httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/ \
hc/core5/http2/impl/io/TestSessionInOutBuffers.java&r1=1742947&r2=1742948&rev=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestFrameInOutBuffers.java \
Mon May  9 13:31:45 2016 @@ -40,23 +40,21 @@ import org.apache.hc.core5.http2.frame.F
 import org.apache.hc.core5.http2.frame.FrameFlag;
 import org.apache.hc.core5.http2.frame.FrameType;
 import org.apache.hc.core5.http2.impl.BasicHttp2TransportMetrics;
-import org.apache.hc.core5.http2.io.SessionInputBuffer;
-import org.apache.hc.core5.http2.io.SessionOutputBuffer;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class TestSessionInOutBuffers {
+public class TestFrameInOutBuffers {
 
     @Test
     public void testReadWriteFrame() throws Exception {
         final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(16 * \
1024); +        final FrameOutputBuffer outbuffer = new FrameOutputBuffer(16 * 1024);
 
         final ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
0, 1,  ByteBuffer.wrap(new byte[]{1,2,3,4,5}));
         outbuffer.write(frame, outputStream);
 
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final byte[] bytes = outputStream.toByteArray();
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
         Assert.assertEquals(FrameConsts.HEAD_LEN + 5, bytes.length);
@@ -64,7 +62,7 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(1, outbuffer.getMetrics().getFramesTransferred());
         Assert.assertEquals(bytes.length, \
outbuffer.getMetrics().getBytesTransferred());  
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame2 = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA.getValue(), frame2.getType());
         Assert.assertEquals(0, frame2.getFlags());
         Assert.assertEquals(1L, frame2.getStreamId());
@@ -83,52 +81,17 @@ public class TestSessionInOutBuffers {
     }
 
     @Test
-    public void testReadWriteFrameWithPadding() throws Exception {
-        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(16 * \
                1024);
-
-        final ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
                FrameFlag.of(FrameFlag.PADDED), 1,
-                ByteBuffer.wrap(new byte[]{1,2,3,4,5}));
-        outbuffer.write(frame, outputStream);
-
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final byte[] bytes = outputStream.toByteArray();
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
-        Assert.assertTrue(bytes.length > FrameConsts.HEAD_LEN + 1 + 5);
-
-        Assert.assertEquals(1, outbuffer.getMetrics().getFramesTransferred());
-        Assert.assertEquals(bytes.length, \
                outbuffer.getMetrics().getBytesTransferred());
-
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
-        Assert.assertEquals(FrameType.DATA.getValue(), frame2.getType());
-        Assert.assertEquals(FrameFlag.PADDED.getValue(), frame2.getFlags());
-        Assert.assertEquals(1L, frame2.getStreamId());
-        final ByteBuffer payload2 = frame2.getPayload();
-        Assert.assertNotNull(payload2);
-        Assert.assertEquals(5, payload2.remaining());
-        Assert.assertEquals(1, payload2.get());
-        Assert.assertEquals(2, payload2.get());
-        Assert.assertEquals(3, payload2.get());
-        Assert.assertEquals(4, payload2.get());
-        Assert.assertEquals(5, payload2.get());
-        Assert.assertEquals(-1, inputStream.read());
-
-        Assert.assertEquals(1, inbuffer.getMetrics().getFramesTransferred());
-        Assert.assertEquals(bytes.length, \
                inbuffer.getMetrics().getBytesTransferred());
-    }
-
-    @Test
     public void testReadFrameMultiple() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(
                 new byte[] {
-                        0,0,5,0,8,0,0,0,8,4,0,1,2,3,4,0,0,0,0,
-                        0,0,5,0,9,0,0,0,8,4,5,6,7,8,9,0,0,0,0
+                        0,0,10,0,8,0,0,0,8,4,0,1,2,3,4,0,0,0,0,
+                        0,0,10,0,9,0,0,0,8,4,5,6,7,8,9,0,0,0,0
                 });
 
-        final Frame<ByteBuffer> frame1 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame1 = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame1.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED), frame1.getFlags());
+        Assert.assertEquals(0, frame1.getFlags());
         Assert.assertEquals(8, frame1.getStreamId());
         final ByteBuffer payload1 = frame1.getPayload();
         Assert.assertNotNull(payload1);
@@ -139,9 +102,9 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(3, payload1.get());
         Assert.assertEquals(4, payload1.get());
 
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame2 = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame2.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED, FrameFlag.END_STREAM), \
frame2.getFlags()); +        Assert.assertEquals(FrameFlag.of(FrameFlag.END_STREAM), \
frame2.getFlags());  Assert.assertEquals(8, frame2.getStreamId());
         final ByteBuffer payload2 = frame2.getPayload();
         Assert.assertNotNull(payload2);
@@ -157,17 +120,17 @@ public class TestSessionInOutBuffers {
 
     @Test
     public void testReadFrameMultipleSmallBuffer() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(new \
BasicHttp2TransportMetrics(), 20, 5); +        final FrameInputBuffer inbuffer = new \
                FrameInputBuffer(new BasicHttp2TransportMetrics(), 20, 10);
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(
                 new byte[] {
-                        0,0,5,0,8,0,0,0,8,4,1,1,1,1,1,0,0,0,0,
+                        0,0,10,0,8,0,0,0,8,4,1,1,1,1,1,0,0,0,0,
                         0,0,5,0,0,0,0,0,8,2,2,2,2,2,
-                        0,0,5,0,9,0,0,0,8,4,3,3,3,3,3,0,0,0,0
+                        0,0,10,0,9,0,0,0,8,4,3,3,3,3,3,0,0,0,0
                 });
 
-        final Frame<ByteBuffer> frame1 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame1 = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame1.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED), frame1.getFlags());
+        Assert.assertEquals(0, frame1.getFlags());
         Assert.assertEquals(8, frame1.getStreamId());
         final ByteBuffer payload1 = frame1.getPayload();
         Assert.assertNotNull(payload1);
@@ -178,7 +141,7 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(1, payload1.get());
         Assert.assertEquals(1, payload1.get());
 
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame2 = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame2.getType()));
         Assert.assertEquals(0, frame2.getFlags());
         Assert.assertEquals(8, frame2.getStreamId());
@@ -191,9 +154,9 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(2, payload2.get());
         Assert.assertEquals(2, payload2.get());
 
-        final Frame<ByteBuffer> frame3 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame3 = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame3.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED, FrameFlag.END_STREAM), \
frame3.getFlags()); +        Assert.assertEquals(FrameFlag.of(FrameFlag.END_STREAM), \
frame3.getFlags());  Assert.assertEquals(8, frame3.getStreamId());
         final ByteBuffer payload3 = frame3.getPayload();
         Assert.assertNotNull(payload3);
@@ -209,19 +172,19 @@ public class TestSessionInOutBuffers {
 
     @Test
     public void testReadFramePartialReads() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final MultiByteArrayInputStream inputStream = new MultiByteArrayInputStream(
                 new byte[] {0,0},
-                new byte[] {5,0,9,0},
+                new byte[] {10,0,9,0},
                 new byte[] {0,0,8},
                 new byte[] {4},
                 new byte[] {1,2,3,4},
                 new byte[] {5,0},
                 new byte[] {0,0,0});
 
-        final Frame<ByteBuffer> frame = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED, FrameFlag.END_STREAM), \
frame.getFlags()); +        Assert.assertEquals(FrameFlag.of(FrameFlag.END_STREAM), \
frame.getFlags());  Assert.assertEquals(8, frame.getStreamId());
         final ByteBuffer payload = frame.getPayload();
         Assert.assertNotNull(payload);
@@ -236,10 +199,10 @@ public class TestSessionInOutBuffers {
 
     @Test
     public void testReadEmptyFrame() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] \
{0,0,0,0,0,0,0,0,0});  
-        final Frame<ByteBuffer> frame = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame = inbuffer.read(inputStream);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame.getType()));
         Assert.assertEquals(0, frame.getFlags());
         Assert.assertEquals(0, frame.getStreamId());
@@ -249,24 +212,24 @@ public class TestSessionInOutBuffers {
 
     @Test(expected = ConnectionClosedException.class)
     public void testReadFrameConnectionClosed() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] \
{});  
-        inbuffer.readFrame(inputStream);
+        inbuffer.read(inputStream);
     }
 
     @Test(expected = H2CorruptFrameException.class)
     public void testReadFrameCorruptFrame() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] \
{0,0});  
-        inbuffer.readFrame(inputStream);
+        inbuffer.read(inputStream);
     }
 
     @Test(expected = H2ConnectionException.class)
     public void testWriteFrameExceedingLimit() throws Exception {
         final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(1024);
+        final FrameOutputBuffer outbuffer = new FrameOutputBuffer(1024);
 
         final ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
0, 1,  ByteBuffer.wrap(new byte[2048]));
@@ -275,11 +238,11 @@ public class TestSessionInOutBuffers {
 
     @Test(expected = H2ConnectionException.class)
     public void testReadFrameExceedingLimit() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
         final ByteArrayInputStream inputStream = new ByteArrayInputStream(
                 new byte[] {0,-128,-128,0,0,0,0,0,1});
 
-        inbuffer.readFrame(inputStream);
+        inbuffer.read(inputStream);
     }
 
 }

Copied: httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java \
(from r1742947, httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java)
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/test/ \
java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java?p2=httpcomponents/h \
ttpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameI \
nOutBuffers.java&p1=httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apach \
e/hc/core5/http2/impl/io/TestSessionInOutBuffers.java&r1=1742947&r2=1742948&rev=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/io/TestSessionInOutBuffers.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java \
Mon May  9 13:31:45 2016 @@ -25,10 +25,8 @@
  *
  */
 
-package org.apache.hc.core5.http2.impl.io;
+package org.apache.hc.core5.http2.impl.nio;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.nio.ByteBuffer;
 
 import org.apache.hc.core5.http.ConnectionClosedException;
@@ -40,31 +38,29 @@ import org.apache.hc.core5.http2.frame.F
 import org.apache.hc.core5.http2.frame.FrameFlag;
 import org.apache.hc.core5.http2.frame.FrameType;
 import org.apache.hc.core5.http2.impl.BasicHttp2TransportMetrics;
-import org.apache.hc.core5.http2.io.SessionInputBuffer;
-import org.apache.hc.core5.http2.io.SessionOutputBuffer;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class TestSessionInOutBuffers {
+public class TestFrameInOutBuffers {
 
     @Test
     public void testReadWriteFrame() throws Exception {
-        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(16 * \
1024); +        final WritableByteChannelMock writableChannel = new \
WritableByteChannelMock(1024); +        final FrameOutputBuffer outbuffer = new \
FrameOutputBuffer(16 * 1024);  
         final ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
0, 1,  ByteBuffer.wrap(new byte[]{1,2,3,4,5}));
-        outbuffer.write(frame, outputStream);
+        outbuffer.write(frame, writableChannel);
 
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final byte[] bytes = outputStream.toByteArray();
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
+        final byte[] bytes = writableChannel.toByteArray();
         Assert.assertEquals(FrameConsts.HEAD_LEN + 5, bytes.length);
 
         Assert.assertEquals(1, outbuffer.getMetrics().getFramesTransferred());
         Assert.assertEquals(bytes.length, \
outbuffer.getMetrics().getBytesTransferred());  
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
+        final ReadableByteChannelMock readableChannel = new \
ReadableByteChannelMock(bytes); +        final Frame<ByteBuffer> frame2 = \
inbuffer.read(readableChannel);  Assert.assertEquals(FrameType.DATA.getValue(), \
frame2.getType());  Assert.assertEquals(0, frame2.getFlags());
         Assert.assertEquals(1L, frame2.getStreamId());
@@ -76,59 +72,46 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(3, payload2.get());
         Assert.assertEquals(4, payload2.get());
         Assert.assertEquals(5, payload2.get());
-        Assert.assertEquals(-1, inputStream.read());
+        Assert.assertEquals(-1, readableChannel.read(ByteBuffer.allocate(1024)));
 
         Assert.assertEquals(1, inbuffer.getMetrics().getFramesTransferred());
         Assert.assertEquals(bytes.length, \
inbuffer.getMetrics().getBytesTransferred());  }
 
     @Test
-    public void testReadWriteFrameWithPadding() throws Exception {
-        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(16 * \
                1024);
-
-        final ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
                FrameFlag.of(FrameFlag.PADDED), 1,
-                ByteBuffer.wrap(new byte[]{1,2,3,4,5}));
-        outbuffer.write(frame, outputStream);
-
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final byte[] bytes = outputStream.toByteArray();
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
-        Assert.assertTrue(bytes.length > FrameConsts.HEAD_LEN + 1 + 5);
-
-        Assert.assertEquals(1, outbuffer.getMetrics().getFramesTransferred());
-        Assert.assertEquals(bytes.length, \
                outbuffer.getMetrics().getBytesTransferred());
-
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
-        Assert.assertEquals(FrameType.DATA.getValue(), frame2.getType());
-        Assert.assertEquals(FrameFlag.PADDED.getValue(), frame2.getFlags());
-        Assert.assertEquals(1L, frame2.getStreamId());
-        final ByteBuffer payload2 = frame2.getPayload();
-        Assert.assertNotNull(payload2);
-        Assert.assertEquals(5, payload2.remaining());
-        Assert.assertEquals(1, payload2.get());
-        Assert.assertEquals(2, payload2.get());
-        Assert.assertEquals(3, payload2.get());
-        Assert.assertEquals(4, payload2.get());
-        Assert.assertEquals(5, payload2.get());
-        Assert.assertEquals(-1, inputStream.read());
-
-        Assert.assertEquals(1, inbuffer.getMetrics().getFramesTransferred());
-        Assert.assertEquals(bytes.length, \
inbuffer.getMetrics().getBytesTransferred()); +    public void \
testPartialFrameWrite() throws Exception { +        final WritableByteChannelMock \
writableChannel = new WritableByteChannelMock(1024, FrameConsts.HEAD_LEN + 10); +     \
final FrameOutputBuffer outbuffer = new FrameOutputBuffer(16 * 1024); +        final \
ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
FrameFlag.END_STREAM.getValue(), 5, +                ByteBuffer.wrap(new \
byte[]{'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'})); +
+        outbuffer.write(frame, writableChannel);
+        Assert.assertArrayEquals(new byte[] \
{0,0,16,0,1,0,0,0,5,48,49,50,51,52,53,54,55,56,57}, +                \
writableChannel.toByteArray()); +
+        Assert.assertFalse(outbuffer.isEmpty());
+        outbuffer.flush(writableChannel);
+        Assert.assertArrayEquals(new byte[] \
{0,0,16,0,1,0,0,0,5,48,49,50,51,52,53,54,55,56,57}, +                \
writableChannel.toByteArray()); +
+        writableChannel.flush();
+        outbuffer.flush(writableChannel);
+        Assert.assertArrayEquals(new byte[] \
{0,0,16,0,1,0,0,0,5,48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102}, +            \
writableChannel.toByteArray());  }
 
     @Test
     public void testReadFrameMultiple() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
+        final ReadableByteChannelMock readableChannel = new ReadableByteChannelMock(
                 new byte[] {
-                        0,0,5,0,8,0,0,0,8,4,0,1,2,3,4,0,0,0,0,
-                        0,0,5,0,9,0,0,0,8,4,5,6,7,8,9,0,0,0,0
+                        0,0,10,0,8,0,0,0,8,4,0,1,2,3,4,0,0,0,0,
+                        0,0,10,0,9,0,0,0,8,4,5,6,7,8,9,0,0,0,0
                 });
 
-        final Frame<ByteBuffer> frame1 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame1 = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame1.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED), frame1.getFlags());
+        Assert.assertEquals(0, frame1.getFlags());
         Assert.assertEquals(8, frame1.getStreamId());
         final ByteBuffer payload1 = frame1.getPayload();
         Assert.assertNotNull(payload1);
@@ -139,9 +122,9 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(3, payload1.get());
         Assert.assertEquals(4, payload1.get());
 
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame2 = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame2.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED, FrameFlag.END_STREAM), \
frame2.getFlags()); +        Assert.assertEquals(FrameFlag.of(FrameFlag.END_STREAM), \
frame2.getFlags());  Assert.assertEquals(8, frame2.getStreamId());
         final ByteBuffer payload2 = frame2.getPayload();
         Assert.assertNotNull(payload2);
@@ -152,22 +135,22 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(8, payload2.get());
         Assert.assertEquals(9, payload2.get());
 
-        Assert.assertEquals(-1, inputStream.read());
+        Assert.assertEquals(-1, readableChannel.read(ByteBuffer.allocate(1024)));
     }
 
     @Test
     public void testReadFrameMultipleSmallBuffer() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(new \
                BasicHttp2TransportMetrics(), 20, 5);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(new \
BasicHttp2TransportMetrics(), 20, 10); +        final ReadableByteChannelMock \
readableChannel = new ReadableByteChannelMock(  new byte[] {
-                        0,0,5,0,8,0,0,0,8,4,1,1,1,1,1,0,0,0,0,
+                        0,0,10,0,8,0,0,0,8,4,1,1,1,1,1,0,0,0,0,
                         0,0,5,0,0,0,0,0,8,2,2,2,2,2,
-                        0,0,5,0,9,0,0,0,8,4,3,3,3,3,3,0,0,0,0
+                        0,0,10,0,9,0,0,0,8,4,3,3,3,3,3,0,0,0,0
                 });
 
-        final Frame<ByteBuffer> frame1 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame1 = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame1.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED), frame1.getFlags());
+        Assert.assertEquals(0, frame1.getFlags());
         Assert.assertEquals(8, frame1.getStreamId());
         final ByteBuffer payload1 = frame1.getPayload();
         Assert.assertNotNull(payload1);
@@ -178,7 +161,7 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(1, payload1.get());
         Assert.assertEquals(1, payload1.get());
 
-        final Frame<ByteBuffer> frame2 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame2 = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame2.getType()));
         Assert.assertEquals(0, frame2.getFlags());
         Assert.assertEquals(8, frame2.getStreamId());
@@ -191,9 +174,9 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(2, payload2.get());
         Assert.assertEquals(2, payload2.get());
 
-        final Frame<ByteBuffer> frame3 = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame3 = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame3.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED, FrameFlag.END_STREAM), \
frame3.getFlags()); +        Assert.assertEquals(FrameFlag.of(FrameFlag.END_STREAM), \
frame3.getFlags());  Assert.assertEquals(8, frame3.getStreamId());
         final ByteBuffer payload3 = frame3.getPayload();
         Assert.assertNotNull(payload3);
@@ -204,24 +187,24 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(3, payload3.get());
         Assert.assertEquals(3, payload3.get());
 
-        Assert.assertEquals(-1, inputStream.read());
+        Assert.assertEquals(-1, readableChannel.read(ByteBuffer.allocate(1024)));
     }
 
     @Test
     public void testReadFramePartialReads() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final MultiByteArrayInputStream inputStream = new MultiByteArrayInputStream(
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
+        final ReadableByteChannelMock readableChannel = new ReadableByteChannelMock(
                 new byte[] {0,0},
-                new byte[] {5,0,9,0},
+                new byte[] {10,0,9,0},
                 new byte[] {0,0,8},
                 new byte[] {4},
                 new byte[] {1,2,3,4},
                 new byte[] {5,0},
                 new byte[] {0,0,0});
 
-        final Frame<ByteBuffer> frame = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame.getType()));
-        Assert.assertEquals(FrameFlag.of(FrameFlag.PADDED, FrameFlag.END_STREAM), \
frame.getFlags()); +        Assert.assertEquals(FrameFlag.of(FrameFlag.END_STREAM), \
frame.getFlags());  Assert.assertEquals(8, frame.getStreamId());
         final ByteBuffer payload = frame.getPayload();
         Assert.assertNotNull(payload);
@@ -231,15 +214,17 @@ public class TestSessionInOutBuffers {
         Assert.assertEquals(3, payload.get());
         Assert.assertEquals(4, payload.get());
         Assert.assertEquals(5, payload.get());
-        Assert.assertEquals(-1, inputStream.read());
+
+        Assert.assertEquals(-1, readableChannel.read(ByteBuffer.allocate(1024)));
     }
 
     @Test
     public void testReadEmptyFrame() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] \
{0,0,0,0,0,0,0,0,0}); +        final FrameInputBuffer inbuffer = new \
FrameInputBuffer(16 * 1024); +        final ReadableByteChannelMock readableChannel = \
new ReadableByteChannelMock( +                new byte[] {0,0,0,0,0,0,0,0,0});
 
-        final Frame<ByteBuffer> frame = inbuffer.readFrame(inputStream);
+        final Frame<ByteBuffer> frame = inbuffer.read(readableChannel);
         Assert.assertEquals(FrameType.DATA, FrameType.valueOf(frame.getType()));
         Assert.assertEquals(0, frame.getFlags());
         Assert.assertEquals(0, frame.getStreamId());
@@ -249,37 +234,40 @@ public class TestSessionInOutBuffers {
 
     @Test(expected = ConnectionClosedException.class)
     public void testReadFrameConnectionClosed() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] \
{}); +        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
+        final ReadableByteChannelMock readableChannel = new \
ReadableByteChannelMock(new byte[] {});  
-        inbuffer.readFrame(inputStream);
+        Assert.assertEquals(null, inbuffer.read(readableChannel));
+        inbuffer.read(readableChannel);
     }
 
     @Test(expected = H2CorruptFrameException.class)
     public void testReadFrameCorruptFrame() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] \
{0,0}); +        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
+        final ReadableByteChannelMock readableChannel = new \
ReadableByteChannelMock(new byte[] {0,0});  
-        inbuffer.readFrame(inputStream);
+        Assert.assertEquals(null, inbuffer.read(readableChannel));
+        inbuffer.read(readableChannel);
     }
 
     @Test(expected = H2ConnectionException.class)
     public void testWriteFrameExceedingLimit() throws Exception {
-        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(1024);
+        final WritableByteChannelMock writableChannel = new \
WritableByteChannelMock(1024); +        final FrameOutputBuffer outbuffer = new \
FrameOutputBuffer(1024);  
         final ByteBufferFrame frame = new ByteBufferFrame(FrameType.DATA.getValue(), \
0, 1,  ByteBuffer.wrap(new byte[2048]));
-        outbuffer.write(frame, outputStream);
+        outbuffer.write(frame, writableChannel);
     }
 
     @Test(expected = H2ConnectionException.class)
     public void testReadFrameExceedingLimit() throws Exception {
-        final SessionInputBuffer inbuffer = new SessionInputBufferImpl(16 * 1024);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(
+        final FrameInputBuffer inbuffer = new FrameInputBuffer(16 * 1024);
+        final ReadableByteChannelMock readableChannel = new ReadableByteChannelMock(
                 new byte[] {0,-128,-128,0,0,0,0,0,1});
 
-        inbuffer.readFrame(inputStream);
+        Assert.assertEquals(null, inbuffer.read(readableChannel));
+        inbuffer.read(readableChannel);
     }
 
 }

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java
                
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/TestFrameInOutBuffers.java
                
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/WritableByteChannelMock.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/test/ \
java/org/apache/hc/core5/http2/impl/nio/WritableByteChannelMock.java?rev=1742948&r1=1742947&r2=1742948&view=diff
 ==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/WritableByteChannelMock.java \
                (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/nio/WritableByteChannelMock.java \
Mon May  9 13:31:45 2016 @@ -108,8 +108,16 @@ public class WritableByteChannelMock \
imp  
     public ByteBuffer asReadOnly() {
         final ByteBuffer dup = this.buf.duplicate();
-        dup.reset();
+        dup.flip();
         return dup.asReadOnlyBuffer();
     }
 
+    public byte[] toByteArray() {
+        final ByteBuffer dup = this.buf.duplicate();
+        dup.flip();
+        final byte[] bytes = new byte[dup.remaining()];
+        dup.get(bytes);
+        return bytes;
+    }
+
 }
\ No newline at end of file


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic