Complete low level HTTP2
diff --git a/http2/Http2Frames.ods b/http2/Http2Frames.ods deleted file mode 100644 index c2ca426..0000000 --- a/http2/Http2Frames.ods +++ /dev/null Binary files differ
diff --git a/http2/src/main/java/org/apache/mina/http2/api/BytePartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/api/BytePartialDecoder.java deleted file mode 100644 index 11582de..0000000 --- a/http2/src/main/java/org/apache/mina/http2/api/BytePartialDecoder.java +++ /dev/null
@@ -1,50 +0,0 @@ -/** - * - */ -package org.apache.mina.http2.api; - -import java.nio.ByteBuffer; - -/** - * @author jeffmaury - * - */ -public class BytePartialDecoder implements PartialDecoder<byte[]> { - private int offset; - private byte[] value; - - /** - * Decode an byte array. - * - * @param size the size of the byte array to decode - */ - public BytePartialDecoder(int size) { - this.offset = 0; - this.value = new byte[size]; - } - - public boolean consume(ByteBuffer buffer) { - if (value.length - offset == 0) { - throw new IllegalStateException(); - } - int length = Math.min(buffer.remaining(), value.length - offset); - buffer.get(value, offset, length); - offset += length; - return value.length - offset == 0; - } - - public byte[] getValue() { - if (value.length - offset > 0) { - throw new IllegalStateException(); - } - return value; - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - offset = 0; - } -}
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2Constants.java b/http2/src/main/java/org/apache/mina/http2/api/Http2Constants.java index 3bf58f6..4b7f04c 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2Constants.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2Constants.java
@@ -1,13 +1,29 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.api; import java.nio.charset.Charset; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public final class Http2Constants { /** @@ -21,6 +37,11 @@ * the exclusive bit */ public static final int HTTP2_EXCLUSIVE_MASK = 0x80000000; + + /** + * Length of the HTTP2 header (length, type, flags, streamID) + */ + public static final int HTTP2_HEADER_LENGTH = 9; /* * Frame types @@ -28,52 +49,52 @@ /** * DATA frame */ - public static final int FRAME_TYPE_DATA = 0x00; + public static final short FRAME_TYPE_DATA = 0x00; /** * HEADERS frame */ - public static final int FRAME_TYPE_HEADERS = 0x01; + public static final short FRAME_TYPE_HEADERS = 0x01; /** * PRIORITY frame */ - public static final int FRAME_TYPE_PRIORITY = 0x02; + public static final short FRAME_TYPE_PRIORITY = 0x02; /** * RST_STREAM frame */ - public static final int FRAME_TYPE_RST_STREAM = 0x03; + public static final short FRAME_TYPE_RST_STREAM = 0x03; /** * SETTINGS stream */ - public static final int FRAME_TYPE_SETTINGS = 0x04; + public static final short FRAME_TYPE_SETTINGS = 0x04; /** * PUSH_PROMISE frame */ - public static final int FRAME_TYPE_PUSH_PROMISE = 0x05; + public static final short FRAME_TYPE_PUSH_PROMISE = 0x05; /** * PING frame */ - public static final int FRAME_TYPE_PING = 0x06; + public static final short FRAME_TYPE_PING = 0x06; /** * GOAWAY frame */ - public static final int FRAME_TYPE_GOAWAY = 0x07; + public static final short FRAME_TYPE_GOAWAY = 0x07; /** * WINDOW_UPDATE frame */ - public static final int FRAME_TYPE_WINDOW_UPDATE = 0x08; + public static final short FRAME_TYPE_WINDOW_UPDATE = 0x08; /** * CONTINUATION frame */ - public static final int FRAME_TYPE_CONTINUATION = 0x09; + public static final short FRAME_TYPE_CONTINUATION = 0x09; /* * Flags
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2ContinuationFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2ContinuationFrame.java index 0138d17..ce0a6ef 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2ContinuationFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2ContinuationFrame.java
@@ -19,11 +19,15 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_CONTINUATION; +import static org.apache.mina.http2.api.Http2Constants.EMPTY_BYTE_ARRAY; + +import java.nio.ByteBuffer; + /** - * An SPY data frame + * An HTTP2 continuation frame. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> - * */ public class Http2ContinuationFrame extends Http2Frame { @@ -34,35 +38,42 @@ return headerBlockFragment; } - protected <T extends AbstractHttp2ContinuationFrameBuilder<T,V>, V extends Http2ContinuationFrame> Http2ContinuationFrame(AbstractHttp2ContinuationFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.put(getHeaderBlockFragment()); + } + + protected Http2ContinuationFrame(Http2ContinuationFrameBuilder builder) { super(builder); this.headerBlockFragment = builder.getHeaderBlockFragment(); } - public static abstract class AbstractHttp2ContinuationFrameBuilder<T extends AbstractHttp2ContinuationFrameBuilder<T,V>, V extends Http2ContinuationFrame> extends AbstractHttp2FrameBuilder<T,V> { - private byte[] headerBlockFragment = new byte[0]; + public static class Http2ContinuationFrameBuilder extends AbstractHttp2FrameBuilder<Http2ContinuationFrameBuilder,Http2ContinuationFrame> { + private byte[] headerBlockFragment = EMPTY_BYTE_ARRAY; - @SuppressWarnings("unchecked") - public T headerBlockFragment(byte[] headerBlockFragment) { + public Http2ContinuationFrameBuilder headerBlockFragment(byte[] headerBlockFragment) { this.headerBlockFragment = headerBlockFragment; - return (T) this; + return this; } public byte[] getHeaderBlockFragment() { return headerBlockFragment; } - } - - public static class Builder extends AbstractHttp2ContinuationFrameBuilder<Builder, Http2ContinuationFrame> { @Override public Http2ContinuationFrame build() { - return new Http2ContinuationFrame(this); + if (getLength() == (-1)) { + setLength(getHeaderBlockFragment().length); + } + return new Http2ContinuationFrame(type(FRAME_TYPE_CONTINUATION)); } - public static Builder builder() { - return new Builder(); + public static Http2ContinuationFrameBuilder builder() { + return new Http2ContinuationFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2DataFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2DataFrame.java index 2a4802d..e8de92e 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2DataFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2DataFrame.java
@@ -20,9 +20,14 @@ package org.apache.mina.http2.api; import static org.apache.mina.http2.api.Http2Constants.EMPTY_BYTE_ARRAY; +import static org.apache.mina.http2.api.Http2Constants.FLAGS_PADDING; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_DATA; +import static org.apache.mina.http2.api.Http2Constants.HTTP2_HEADER_LENGTH; + +import java.nio.ByteBuffer; /** - * An SPY data frame + * An HTTP2 data frame * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -40,48 +45,64 @@ return padding; } - protected <T extends AbstractHttp2DataFrameBuilder<T,V>, V extends Http2Frame> Http2DataFrame(AbstractHttp2DataFrameBuilder<T, V> builder) { - super(builder); - this.data = builder.getData(); - this.padding = builder.getPadding(); + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + if (isFlagSet(FLAGS_PADDING)) { + buffer.put((byte) getPadding().length); + } + buffer.put(getData()); + if (isFlagSet(FLAGS_PADDING)) { + buffer.put(getPadding()); + } } - - public static abstract class AbstractHttp2DataFrameBuilder<T extends AbstractHttp2DataFrameBuilder<T,V>, V extends Http2Frame> extends AbstractHttp2FrameBuilder<T,V> { + protected Http2DataFrame(Http2DataFrameBuilder builder) { + super(builder); + data = builder.getData(); + padding = builder.getPadding(); + } + + public static class Http2DataFrameBuilder extends AbstractHttp2FrameBuilder<Http2DataFrameBuilder,Http2DataFrame> { private byte[] data = EMPTY_BYTE_ARRAY; private byte[] padding = EMPTY_BYTE_ARRAY; - @SuppressWarnings("unchecked") - public T data(byte[] data) { + public Http2DataFrameBuilder data(byte[] data) { this.data = data; - return (T) this; + return this; } public byte[] getData() { return data; } - @SuppressWarnings("unchecked") - public T padding(byte[] padding) { + public Http2DataFrameBuilder padding(byte[] padding) { this.padding = padding; - return (T) this; + addFlag(FLAGS_PADDING); + return this; } public byte[] getPadding() { return padding; } -} - - public static class Builder extends AbstractHttp2DataFrameBuilder<Builder, Http2Frame> { @Override - public Http2Frame build() { - return new Http2DataFrame(this); + public Http2DataFrame build() { + if (getLength() == (-1)) { + int length = getData().length; + if (isFlagSet(FLAGS_PADDING)) { + length += getPadding().length + 1; + } + length(length); + } + return new Http2DataFrame(type(FRAME_TYPE_DATA)); } - public static Builder builder() { - return new Builder(); + public static Http2DataFrameBuilder builder() { + return new Http2DataFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2Frame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2Frame.java index 356c2b8..82da9f7 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2Frame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2Frame.java
@@ -19,8 +19,12 @@ */ package org.apache.mina.http2.api; +import java.nio.ByteBuffer; + +import static org.apache.mina.http2.api.Http2Constants.HTTP2_HEADER_LENGTH; + /** - * An SPY data frame + * An HTTP2 frame. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -31,7 +35,7 @@ private final short type; - private final short flags; + private final byte flags; private final int streamID; @@ -43,13 +47,49 @@ return type; } - public short getFlags() { + public byte getFlags() { return flags; } + /** + * Utility method to test if a specific bit is set in the flags. + * + * @param flag the bit to test + * @return + */ + protected boolean isFlagSet(byte flag) { + return (getFlags() & flag) == flag; + } + public int getStreamID() { return streamID; } + + /** + * Serialize the frame to a buffer. + * + * @return the allocated buffer + */ + public ByteBuffer toBuffer() { + ByteBuffer buffer = ByteBuffer.allocateDirect(HTTP2_HEADER_LENGTH + getLength()); + buffer.put((byte) (getLength() >> 16)); + buffer.put((byte) (getLength() >> 8)); + buffer.put((byte) (getLength() )); + buffer.put((byte) getType()); + buffer.put(getFlags()); + buffer.putInt(getStreamID()); + writePayload(buffer); + buffer.flip(); + return buffer; + } + + /** + * Writes the frame specific payload to the allocated buffer. + * Must be implemented by frames implementation. + * + * @param buffer the buffer to write to + */ + public abstract void writePayload(ByteBuffer buffer); protected <T extends AbstractHttp2FrameBuilder<T,V>, V extends Http2Frame> Http2Frame(AbstractHttp2FrameBuilder<T, V> builder) { this.length = builder.getLength(); @@ -59,17 +99,21 @@ } public static abstract class AbstractHttp2FrameBuilder<T extends AbstractHttp2FrameBuilder<T,V>, V extends Http2Frame> { - private int length; + private int length = (-1); private short type; - private short flags; + private byte flags; private int streamID; + public void setLength(int length) { + this.length = length; + } + @SuppressWarnings("unchecked") public T length(int length) { - this.length = length; + setLength(length); return (T) this; } @@ -86,16 +130,39 @@ public short getType() { return type; } + + public void setFlags(byte flags) { + this.flags = flags; + } @SuppressWarnings("unchecked") - public T flags(short flags) { - this.flags = flags; + public T flags(byte flags) { + setFlags(flags); return (T) this; } - public short getFlags() { + public byte getFlags() { return flags; } + + /** + * Utility method for setting a specific bit in the flags. + * + * @param flag the bit to set + */ + protected void addFlag(byte flag) { + setFlags((byte) (getFlags() | flag)); + } + + /** + * Utility method to test if a specific bit is set in the flags. + * + * @param flag the bit to test + * @return + */ + protected boolean isFlagSet(byte flag) { + return (getFlags() & flag) == flag; + } @SuppressWarnings("unchecked") public T streamID(int streamID) {
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2GoAwayFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2GoAwayFrame.java index fbc5ea1..8dcb487 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2GoAwayFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2GoAwayFrame.java
@@ -19,6 +19,11 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_GOAWAY; +import static org.apache.mina.http2.api.Http2Constants.EMPTY_BYTE_ARRAY; + +import java.nio.ByteBuffer; + /** * An SPY data frame * @@ -28,7 +33,7 @@ public class Http2GoAwayFrame extends Http2Frame { private final int lastStreamID; - private final int errorCode; + private final long errorCode; private byte[] data; @@ -36,7 +41,7 @@ return lastStreamID; } - public int getErrorCode() { + public long getErrorCode() { return errorCode; } @@ -44,7 +49,17 @@ return data; } - protected <T extends AbstractHttp2GoAwayFrameBuilder<T,V>, V extends Http2GoAwayFrame> Http2GoAwayFrame(AbstractHttp2GoAwayFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.putInt(getLastStreamID()); + buffer.putInt((int) getErrorCode()); + buffer.put(getData()); + } + + protected Http2GoAwayFrame(Http2GoAwayFrameBuilder builder) { super(builder); this.lastStreamID = builder.getLastStreamID(); this.errorCode = builder.getErrorCode(); @@ -52,53 +67,50 @@ } - public static abstract class AbstractHttp2GoAwayFrameBuilder<T extends AbstractHttp2GoAwayFrameBuilder<T,V>, V extends Http2GoAwayFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2GoAwayFrameBuilder extends AbstractHttp2FrameBuilder<Http2GoAwayFrameBuilder,Http2GoAwayFrame> { private int lastStreamID; - private int errorCode; + private long errorCode; - private byte[] data; + private byte[] data = EMPTY_BYTE_ARRAY; - @SuppressWarnings("unchecked") - public T lastStreamID(int lastStreamID) { + public Http2GoAwayFrameBuilder lastStreamID(int lastStreamID) { this.lastStreamID = lastStreamID; - return (T) this; + return this; } public int getLastStreamID() { return lastStreamID; } - @SuppressWarnings("unchecked") - public T errorCode(int errorCode) { + public Http2GoAwayFrameBuilder errorCode(long errorCode) { this.errorCode = errorCode; - return (T) this; + return this; } - public int getErrorCode() { + public long getErrorCode() { return errorCode; } - @SuppressWarnings("unchecked") - public T data(byte[] data) { + public Http2GoAwayFrameBuilder data(byte[] data) { this.data = data; - return (T) this; + return this; } public byte[] getData() { return data; } - } - - public static class Builder extends AbstractHttp2GoAwayFrameBuilder<Builder, Http2GoAwayFrame> { @Override public Http2GoAwayFrame build() { - return new Http2GoAwayFrame(this); + if (getLength() == (-1)) { + setLength(getData().length + 8); + } + return new Http2GoAwayFrame(type(FRAME_TYPE_GOAWAY)); } - public static Builder builder() { - return new Builder(); + public static Http2GoAwayFrameBuilder builder() { + return new Http2GoAwayFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2Header.java b/http2/src/main/java/org/apache/mina/http2/api/Http2Header.java index c0e5ab8..3ee02ca 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2Header.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2Header.java
@@ -1,5 +1,28 @@ +/* + * 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. + * + */ package org.apache.mina.http2.api; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public enum Http2Header { METHOD(":method"),
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2HeadersFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2HeadersFrame.java index aadb1bc..1dd2bcc 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2HeadersFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2HeadersFrame.java
@@ -19,8 +19,16 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FLAGS_PADDING; +import static org.apache.mina.http2.api.Http2Constants.FLAGS_PRIORITY; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_HEADERS; +import static org.apache.mina.http2.api.Http2Constants.HTTP2_HEADER_LENGTH; +import static org.apache.mina.http2.api.Http2Constants.HTTP2_EXCLUSIVE_MASK; + +import java.nio.ByteBuffer; + /** - * An SPY data frame + * An HTTP2 HEADERS frame * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -33,7 +41,7 @@ private final boolean exclusiveMode; - private final byte weight; + private final short weight; private final byte[] headerBlockFragment; @@ -50,7 +58,7 @@ return exclusiveMode; } - public byte getWeight() { + public short getWeight() { return weight; } @@ -58,7 +66,25 @@ return headerBlockFragment; } - protected <T extends AbstractHttp2HeadersFrameBuilder<T,V>, V extends Http2HeadersFrame> Http2HeadersFrame(AbstractHttp2HeadersFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + if (isFlagSet(FLAGS_PADDING)) { + buffer.put((byte) getPadding().length); + } + if (isFlagSet(FLAGS_PRIORITY)) { + buffer.putInt(getExclusiveMode()?HTTP2_EXCLUSIVE_MASK | getStreamDependencyID():getStreamDependencyID()); + buffer.put((byte) (getWeight() - 1)); + } + buffer.put(getHeaderBlockFragment()); + if (isFlagSet(FLAGS_PADDING)) { + buffer.put(getPadding()); + } + } + + protected Http2HeadersFrame(Http2HeadersFrameBuilder builder) { super(builder); this.padding = builder.getPadding(); this.streamDependencyID = builder.getStreamDependencyID(); @@ -68,78 +94,83 @@ } - public static abstract class AbstractHttp2HeadersFrameBuilder<T extends AbstractHttp2HeadersFrameBuilder<T,V>, V extends Http2HeadersFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2HeadersFrameBuilder extends AbstractHttp2FrameBuilder<Http2HeadersFrameBuilder,Http2HeadersFrame> { private byte[] padding; private int streamDependencyID; - private byte weight; + private short weight; private byte[] headerBlockFragment; private boolean exclusiveMode; - @SuppressWarnings("unchecked") - public T padding(byte[] padding) { + public Http2HeadersFrameBuilder padding(byte[] padding) { this.padding = padding; - return (T) this; + addFlag(FLAGS_PADDING); + return this; } public byte[] getPadding() { return padding; } - @SuppressWarnings("unchecked") - public T streamDependencyID(int streamDependencyID) { + public Http2HeadersFrameBuilder streamDependencyID(int streamDependencyID) { this.streamDependencyID = streamDependencyID; - return (T) this; + addFlag(FLAGS_PRIORITY); + return this; } public int getStreamDependencyID() { return streamDependencyID; } - @SuppressWarnings("unchecked") - public T exclusiveMode(boolean exclusiveMode) { + public Http2HeadersFrameBuilder exclusiveMode(boolean exclusiveMode) { this.exclusiveMode = exclusiveMode; - return (T) this; + addFlag(FLAGS_PRIORITY); + return this; } public boolean getExclusiveMode() { return exclusiveMode; } - @SuppressWarnings("unchecked") - public T weight(byte weight) { + public Http2HeadersFrameBuilder weight(short weight) { this.weight = weight; - return (T) this; + addFlag(FLAGS_PRIORITY); + return this; } - public byte getWeight() { + public short getWeight() { return weight; } - @SuppressWarnings("unchecked") - public T headerBlockFragment(byte[] headerBlockFragment) { + public Http2HeadersFrameBuilder headerBlockFragment(byte[] headerBlockFragment) { this.headerBlockFragment = headerBlockFragment; - return (T) this; + return this; } public byte[] getHeaderBlockFragment() { return headerBlockFragment; } - } - - public static class Builder extends AbstractHttp2HeadersFrameBuilder<Builder, Http2HeadersFrame> { @Override public Http2HeadersFrame build() { - return new Http2HeadersFrame(this); + if (getLength() == (-1)) { + int length = getHeaderBlockFragment().length; + if (isFlagSet(FLAGS_PADDING)) { + length += getPadding().length + 1; + } + if (isFlagSet(FLAGS_PRIORITY)) { + length += 5; + } + length(length); + } + return new Http2HeadersFrame(type(FRAME_TYPE_HEADERS)); } - public static Builder builder() { - return new Builder(); + public static Http2HeadersFrameBuilder builder() { + return new Http2HeadersFrameBuilder(); } - } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2NameValuePair.java b/http2/src/main/java/org/apache/mina/http2/api/Http2NameValuePair.java index 6e8572d..994ccca 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2NameValuePair.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2NameValuePair.java
@@ -1,5 +1,28 @@ +/* + * 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. + * + */ package org.apache.mina.http2.api; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class Http2NameValuePair { private String name; private String value;
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2PingFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2PingFrame.java index c1df709..1bd87e5 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2PingFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2PingFrame.java
@@ -19,6 +19,10 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_PING; + +import java.nio.ByteBuffer; + /** * An SPY data frame * @@ -32,35 +36,42 @@ return data; } - protected <T extends AbstractHttp2PingFrameBuilder<T,V>, V extends Http2PingFrame> Http2PingFrame(AbstractHttp2PingFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.put(getData()); + } + + protected Http2PingFrame(Http2PingFrameBuilder builder) { super(builder); this.data = builder.getData(); } - public static abstract class AbstractHttp2PingFrameBuilder<T extends AbstractHttp2PingFrameBuilder<T,V>, V extends Http2PingFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2PingFrameBuilder extends AbstractHttp2FrameBuilder<Http2PingFrameBuilder,Http2PingFrame> { private byte[] data; - @SuppressWarnings("unchecked") - public T data(byte[] data) { + public Http2PingFrameBuilder data(byte[] data) { this.data = data; - return (T) this; + return this; } public byte[] getData() { return data; } - } - - public static class Builder extends AbstractHttp2PingFrameBuilder<Builder, Http2PingFrame> { @Override public Http2PingFrame build() { - return new Http2PingFrame(this); + if (getLength() == (-1)) { + setLength(getData().length); + } + return new Http2PingFrame(type(FRAME_TYPE_PING)); } - public static Builder builder() { - return new Builder(); + public static Http2PingFrameBuilder builder() { + return new Http2PingFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2PriorityFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2PriorityFrame.java index 5478c69..1f766d3 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2PriorityFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2PriorityFrame.java
@@ -19,8 +19,13 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_PRIORITY; +import static org.apache.mina.http2.api.Http2Constants.HTTP2_EXCLUSIVE_MASK; + +import java.nio.ByteBuffer; + /** - * An SPY data frame + * An HTTP2 PRIORITY frame. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -44,7 +49,16 @@ return weight; } - protected <T extends AbstractHttp2PriorityFrameBuilder<T,V>, V extends Http2PriorityFrame> Http2PriorityFrame(AbstractHttp2PriorityFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.putInt(getExclusiveMode()?HTTP2_EXCLUSIVE_MASK | getStreamDependencyID():getStreamDependencyID()); + buffer.put((byte) (getWeight() - 1)); + } + + protected Http2PriorityFrame(Http2PriorityFrameBuilder builder) { super(builder); this.streamDependencyID = builder.getStreamDependencyID(); this.exclusiveMode = builder.exclusiveMode; @@ -52,54 +66,50 @@ } - public static abstract class AbstractHttp2PriorityFrameBuilder<T extends AbstractHttp2PriorityFrameBuilder<T,V>, V extends Http2PriorityFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2PriorityFrameBuilder extends AbstractHttp2FrameBuilder<Http2PriorityFrameBuilder,Http2PriorityFrame> { private int streamDependencyID; private boolean exclusiveMode; private short weight; - @SuppressWarnings("unchecked") - public T streamDependencyID(int streamDependencyID) { + public Http2PriorityFrameBuilder streamDependencyID(int streamDependencyID) { this.streamDependencyID = streamDependencyID; - return (T) this; + return this; } public int getStreamDependencyID() { return streamDependencyID; } - @SuppressWarnings("unchecked") - public T exclusiveMode(boolean exclusiveMode) { + public Http2PriorityFrameBuilder exclusiveMode(boolean exclusiveMode) { this.exclusiveMode = exclusiveMode; - return (T) this; + return this; } public boolean getExclusiveMode() { return exclusiveMode; } - - @SuppressWarnings("unchecked") - public T weight(short weight) { + public Http2PriorityFrameBuilder weight(short weight) { this.weight = weight; - return (T) this; + return this; } public short getWeight() { return weight; } - } - - public static class Builder extends AbstractHttp2PriorityFrameBuilder<Builder, Http2PriorityFrame> { @Override public Http2PriorityFrame build() { - return new Http2PriorityFrame(this); + if (getLength() == (-1)) { + setLength(5); + } + return new Http2PriorityFrame(type(FRAME_TYPE_PRIORITY)); } - public static Builder builder() { - return new Builder(); + public static Http2PriorityFrameBuilder builder() { + return new Http2PriorityFrameBuilder(); } } -} + }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2PushPromiseFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2PushPromiseFrame.java index a2ab2c7..c28b4f6 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2PushPromiseFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2PushPromiseFrame.java
@@ -20,6 +20,10 @@ package org.apache.mina.http2.api; import static org.apache.mina.http2.api.Http2Constants.EMPTY_BYTE_ARRAY; +import static org.apache.mina.http2.api.Http2Constants.FLAGS_PADDING; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_PUSH_PROMISE; + +import java.nio.ByteBuffer; /** * An SPY data frame @@ -48,60 +52,77 @@ return headerBlockFragment; } - protected <T extends AbstractHttp2PushPromiseFrameBuilder<T,V>, V extends Http2PushPromiseFrame> Http2PushPromiseFrame(AbstractHttp2PushPromiseFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + if (isFlagSet(FLAGS_PADDING)) { + buffer.put((byte) getPadding().length); + } + buffer.putInt(getPromisedStreamID()); + buffer.put(getHeaderBlockFragment()); + if (isFlagSet(FLAGS_PADDING)) { + buffer.put(getPadding()); + } + } + + protected Http2PushPromiseFrame(Http2PushPromiseFrameBuilder builder) { super(builder); this.padding = builder.getPadding(); this.promisedStreamID = builder.getPromisedStreamID(); this.headerBlockFragment = builder.getHeaderBlockFragment(); } - public static abstract class AbstractHttp2PushPromiseFrameBuilder<T extends AbstractHttp2PushPromiseFrameBuilder<T,V>, V extends Http2PushPromiseFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2PushPromiseFrameBuilder extends AbstractHttp2FrameBuilder<Http2PushPromiseFrameBuilder,Http2PushPromiseFrame> { private byte[] padding = EMPTY_BYTE_ARRAY; private int promisedStreamID; private byte[] headerBlockFragment = EMPTY_BYTE_ARRAY; - @SuppressWarnings("unchecked") - public T padding(byte[] padding) { + public Http2PushPromiseFrameBuilder padding(byte[] padding) { this.padding = padding; - return (T) this; + addFlag(FLAGS_PADDING); + return this; } public byte[] getPadding() { return padding; } - @SuppressWarnings("unchecked") - public T promisedStreamID(int promisedStreamID) { + public Http2PushPromiseFrameBuilder promisedStreamID(int promisedStreamID) { this.promisedStreamID = promisedStreamID; - return (T) this; + return this; } public int getPromisedStreamID() { return promisedStreamID; } - @SuppressWarnings("unchecked") - public T headerBlockFragment(byte[] headerBlockFragment) { + public Http2PushPromiseFrameBuilder headerBlockFragment(byte[] headerBlockFragment) { this.headerBlockFragment = headerBlockFragment; - return (T) this; + return this; } public byte[] getHeaderBlockFragment() { return headerBlockFragment; } - } - - public static class Builder extends AbstractHttp2PushPromiseFrameBuilder<Builder, Http2PushPromiseFrame> { @Override public Http2PushPromiseFrame build() { - return new Http2PushPromiseFrame(this); + if (getLength() == (-1)) { + int length = getHeaderBlockFragment().length + 4; + if (isFlagSet(FLAGS_PADDING)) { + length += getPadding().length + 1; + } + setLength(length); + } + return new Http2PushPromiseFrame(type(FRAME_TYPE_PUSH_PROMISE)); } - public static Builder builder() { - return new Builder(); + public static Http2PushPromiseFrameBuilder builder() { + return new Http2PushPromiseFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2RstStreamFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2RstStreamFrame.java index 1536594..b6bcb23 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2RstStreamFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2RstStreamFrame.java
@@ -19,8 +19,11 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_RST_STREAM; + +import java.nio.ByteBuffer; /** - * An SPY data frame + * An HTTP2 RST_STREAM frame. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -32,35 +35,42 @@ return errorCode; } - protected <T extends AbstractHttp2RstStreamFrameBuilder<T,V>, V extends Http2RstStreamFrame> Http2RstStreamFrame(AbstractHttp2RstStreamFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.putInt((int) getErrorCode()); + } + + protected Http2RstStreamFrame(Http2RstStreamFrameBuilder builder) { super(builder); this.errorCode = builder.getErrorCode(); } - public static abstract class AbstractHttp2RstStreamFrameBuilder<T extends AbstractHttp2RstStreamFrameBuilder<T,V>, V extends Http2RstStreamFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2RstStreamFrameBuilder extends AbstractHttp2FrameBuilder<Http2RstStreamFrameBuilder,Http2RstStreamFrame> { private long errorCode; - @SuppressWarnings("unchecked") - public T errorCode(long errorCode) { + public Http2RstStreamFrameBuilder errorCode(long errorCode) { this.errorCode = errorCode; - return (T) this; + return this; } public long getErrorCode() { return errorCode; } - } - - public static class Builder extends AbstractHttp2RstStreamFrameBuilder<Builder, Http2RstStreamFrame> { @Override public Http2RstStreamFrame build() { - return new Http2RstStreamFrame(this); + if (getLength() == (-1)) { + setLength(4); + } + return new Http2RstStreamFrame(type(FRAME_TYPE_RST_STREAM)); } - public static Builder builder() { - return new Builder(); + public static Http2RstStreamFrameBuilder builder() { + return new Http2RstStreamFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2Setting.java b/http2/src/main/java/org/apache/mina/http2/api/Http2Setting.java index acccb65..f78e9aa 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2Setting.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2Setting.java
@@ -1,10 +1,44 @@ +/* + * 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. + * + */ package org.apache.mina.http2.api; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class Http2Setting { private int ID; private long value; + public Http2Setting(int ID, long value) { + this.ID = ID; + this.value = value; + } + + /** + * Default empty constructor + */ + public Http2Setting() { + } + public int getID() { return ID; }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2SettingsFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2SettingsFrame.java index 66c44ba..d72d5ee 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2SettingsFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2SettingsFrame.java
@@ -19,10 +19,13 @@ */ package org.apache.mina.http2.api; +import java.nio.ByteBuffer; import java.util.Collection; +import java.util.Collections; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_SETTINGS; /** - * An SPY data frame + * An HTTP2 SETTINGS frame. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -34,35 +37,44 @@ return settings; } - protected <T extends AbstractHttp2SettingsFrameBuilder<T,V>, V extends Http2SettingsFrame> Http2SettingsFrame(AbstractHttp2SettingsFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + for(Http2Setting setting : getSettings()) { + buffer.putShort((short) setting.getID()); + buffer.putInt((int) setting.getValue()); + } + } + + protected Http2SettingsFrame(Http2SettingsFrameBuilder builder) { super(builder); this.settings = builder.getSettings(); } - - public static abstract class AbstractHttp2SettingsFrameBuilder<T extends AbstractHttp2SettingsFrameBuilder<T,V>, V extends Http2SettingsFrame> extends AbstractHttp2FrameBuilder<T,V> { - private Collection<Http2Setting> settings; + public static class Http2SettingsFrameBuilder extends AbstractHttp2FrameBuilder<Http2SettingsFrameBuilder,Http2SettingsFrame> { + private Collection<Http2Setting> settings = Collections.emptyList(); - @SuppressWarnings("unchecked") - public T settings(Collection<Http2Setting> settings) { + public Http2SettingsFrameBuilder settings(Collection<Http2Setting> settings) { this.settings = settings; - return (T) this; + return this; } public Collection<Http2Setting> getSettings() { return settings; } - } - - public static class Builder extends AbstractHttp2SettingsFrameBuilder<Builder, Http2SettingsFrame> { @Override public Http2SettingsFrame build() { - return new Http2SettingsFrame(this); + if (getLength() == (-1)) { + setLength(getSettings().size() * 6); + } + return new Http2SettingsFrame(type(FRAME_TYPE_SETTINGS)); } - public static Builder builder() { - return new Builder(); + public static Http2SettingsFrameBuilder builder() { + return new Http2SettingsFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2UnknownFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2UnknownFrame.java index 1cdcaef..8714100 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2UnknownFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2UnknownFrame.java
@@ -19,8 +19,10 @@ */ package org.apache.mina.http2.api; +import java.nio.ByteBuffer; + /** - * An SPY data frame + * An HTTP2 unknown frame. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> * @@ -32,35 +34,42 @@ return payload; } - protected <T extends AbstractHttp2UnknownFrameBuilder<T,V>, V extends Http2UnknownFrame> Http2UnknownFrame(AbstractHttp2UnknownFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.put(getPayload()); + } + + protected Http2UnknownFrame(Http2UnknownFrameBuilder builder) { super(builder); this.payload = builder.getPayload(); } - public static abstract class AbstractHttp2UnknownFrameBuilder<T extends AbstractHttp2UnknownFrameBuilder<T,V>, V extends Http2UnknownFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2UnknownFrameBuilder extends AbstractHttp2FrameBuilder<Http2UnknownFrameBuilder,Http2UnknownFrame> { private byte[] payload = new byte[0]; - @SuppressWarnings("unchecked") - public T payload(byte[] payload) { + public Http2UnknownFrameBuilder payload(byte[] payload) { this.payload = payload; - return (T) this; + return this; } public byte[] getPayload() { return payload; } - } - - public static class Builder extends AbstractHttp2UnknownFrameBuilder<Builder, Http2UnknownFrame> { @Override public Http2UnknownFrame build() { + if (getLength() == (-1)) { + setLength(getPayload().length); + } return new Http2UnknownFrame(this); } - public static Builder builder() { - return new Builder(); + public static Http2UnknownFrameBuilder builder() { + return new Http2UnknownFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2WindowUpdateFrame.java b/http2/src/main/java/org/apache/mina/http2/api/Http2WindowUpdateFrame.java index f552aaf..c468d81 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2WindowUpdateFrame.java +++ b/http2/src/main/java/org/apache/mina/http2/api/Http2WindowUpdateFrame.java
@@ -19,6 +19,10 @@ */ package org.apache.mina.http2.api; +import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_WINDOW_UPDATE; + +import java.nio.ByteBuffer; + /** * An SPY data frame * @@ -32,35 +36,42 @@ return windowUpdateIncrement; } - protected <T extends AbstractHttp2WindowUpdateFrameBuilder<T,V>, V extends Http2WindowUpdateFrame> Http2WindowUpdateFrame(AbstractHttp2WindowUpdateFrameBuilder<T, V> builder) { + /* (non-Javadoc) + * @see org.apache.mina.http2.api.Http2Frame#writePayload(java.nio.ByteBuffer) + */ + @Override + public void writePayload(ByteBuffer buffer) { + buffer.putInt(getWindowUpdateIncrement()); + } + + protected Http2WindowUpdateFrame(Http2WindowUpdateFrameBuilder builder) { super(builder); this.windowUpdateIncrement = builder.getWindowUpdateIncrement(); } - public static abstract class AbstractHttp2WindowUpdateFrameBuilder<T extends AbstractHttp2WindowUpdateFrameBuilder<T,V>, V extends Http2WindowUpdateFrame> extends AbstractHttp2FrameBuilder<T,V> { + public static class Http2WindowUpdateFrameBuilder extends AbstractHttp2FrameBuilder<Http2WindowUpdateFrameBuilder,Http2WindowUpdateFrame> { private int windowUpdateIncrement; - @SuppressWarnings("unchecked") - public T windowUpdateIncrement(int windowUpdateIncrement) { + public Http2WindowUpdateFrameBuilder windowUpdateIncrement(int windowUpdateIncrement) { this.windowUpdateIncrement = windowUpdateIncrement; - return (T) this; + return this; } public int getWindowUpdateIncrement() { return windowUpdateIncrement; } - } - - public static class Builder extends AbstractHttp2WindowUpdateFrameBuilder<Builder, Http2WindowUpdateFrame> { @Override public Http2WindowUpdateFrame build() { - return new Http2WindowUpdateFrame(this); + if (getLength() == (-1)) { + setLength(4); + } + return new Http2WindowUpdateFrame(type(FRAME_TYPE_WINDOW_UPDATE)); } - public static Builder builder() { - return new Builder(); + public static Http2WindowUpdateFrameBuilder builder() { + return new Http2WindowUpdateFrameBuilder(); } } }
diff --git a/http2/src/main/java/org/apache/mina/http2/api/IntPartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/api/IntPartialDecoder.java deleted file mode 100644 index 5e6076d..0000000 --- a/http2/src/main/java/org/apache/mina/http2/api/IntPartialDecoder.java +++ /dev/null
@@ -1,62 +0,0 @@ -/** - * - */ -package org.apache.mina.http2.api; - -import java.nio.ByteBuffer; - -/** - * @author jeffmaury - * - */ -public class IntPartialDecoder implements PartialDecoder<Integer> { - private int size; - private int remaining; - private int value; - - /** - * Decode an integer whose size is different from the standard 4. - * - * @param size the size (1,2,3,4) to decode - */ - public IntPartialDecoder(int size) { - this.remaining = size; - this.size = size; - } - - /** - * Decode a 4 bytes integer - */ - public IntPartialDecoder() { - this(4); - } - - public boolean consume(ByteBuffer buffer) { - if (remaining == 0) { - throw new IllegalStateException(); - } - while (remaining > 0 && buffer.hasRemaining()) { - value = (value << 8) + (buffer.get() & 0x00FF); - --remaining; - } - return remaining == 0; - } - - public Integer getValue() { - if (remaining > 0) { - throw new IllegalStateException(); - } - return value; - } - - /* (non-Javadoc) - * @see org.apache.mina.http2.api.PartialDecoder#reset() - */ - @Override - public void reset() { - remaining = size; - value = 0; - } - - -}
diff --git a/http2/src/main/java/org/apache/mina/http2/api/LongPartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/api/LongPartialDecoder.java deleted file mode 100644 index dae0c2f..0000000 --- a/http2/src/main/java/org/apache/mina/http2/api/LongPartialDecoder.java +++ /dev/null
@@ -1,62 +0,0 @@ -/** - * - */ -package org.apache.mina.http2.api; - -import java.nio.ByteBuffer; - -/** - * @author jeffmaury - * - */ -public class LongPartialDecoder implements PartialDecoder<Long> { - private int size; - private int remaining; - private long value; - - /** - * Decode a long integer whose size is different from the standard 8. - * - * @param size the size (1 to 8) to decode - */ - public LongPartialDecoder(int size) { - this.remaining = size; - this.size = size; - } - - /** - * Decode a 8 bytes long integer - */ - public LongPartialDecoder() { - this(8); - } - - public boolean consume(ByteBuffer buffer) { - if (remaining == 0) { - throw new IllegalStateException(); - } - while (remaining > 0 && buffer.hasRemaining()) { - value = (value << 8) + (buffer.get() & 0x00FF); - --remaining; - } - return remaining == 0; - } - - public Long getValue() { - if (remaining > 0) { - throw new IllegalStateException(); - } - return value; - } - - /* (non-Javadoc) - * @see org.apache.mina.http2.api.PartialDecoder#reset() - */ - @Override - public void reset() { - remaining = size; - value = 0; - } - - -}
diff --git a/http2/src/main/java/org/apache/mina/http2/api/PartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/api/PartialDecoder.java deleted file mode 100644 index 070b7ce..0000000 --- a/http2/src/main/java/org/apache/mina/http2/api/PartialDecoder.java +++ /dev/null
@@ -1,34 +0,0 @@ -/** - * - */ -package org.apache.mina.http2.api; - -import java.nio.ByteBuffer; - -/** - * @author jeffmaury - * - */ -public interface PartialDecoder<T> { - /** - * Consume the buffer so as to decode a value. Not all the input buffer - * may be consumed. - * - * @param buffer the input buffer to decode - * @return true if a value is available false if more data is requested - */ - public boolean consume(ByteBuffer buffer); - - /** - * Return the decoded value. - * - * @return the decoded value - */ - public T getValue(); - - /** - * Reset the internal state of the decoder to that new decoding can take place. - */ - public void reset(); - -}
diff --git a/http2/src/main/java/org/apache/mina/http2/api/StreamMessage.java b/http2/src/main/java/org/apache/mina/http2/api/StreamMessage.java deleted file mode 100644 index 41f85b0..0000000 --- a/http2/src/main/java/org/apache/mina/http2/api/StreamMessage.java +++ /dev/null
@@ -1,21 +0,0 @@ -package org.apache.mina.http2.api; - -/** - * Marker interface for messages that are attached to a specific stream. - * That may not be a start of HTTP PDU (request or response) as they are the - * one that creates new streams. - * The use of this interface is not mandatory but not using it will cause - * request and responses to be pipelined. - * - * @author jeffmaury - * - */ -public interface StreamMessage { - - /** - * Return the stream ID the message is attached to. - * - * @return the stream ID - */ - public int getStreamID(); -}
diff --git a/http2/src/main/java/org/apache/mina/http2/codec/Http2ProtocolDecoder.java b/http2/src/main/java/org/apache/mina/http2/codec/Http2ProtocolDecoder.java new file mode 100644 index 0000000..d87060e --- /dev/null +++ b/http2/src/main/java/org/apache/mina/http2/codec/Http2ProtocolDecoder.java
@@ -0,0 +1,47 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.codec; + +import java.nio.ByteBuffer; + +import org.apache.mina.codec.ProtocolDecoder; +import org.apache.mina.http2.api.Http2Frame; +import org.apache.mina.http2.impl.Http2Connection; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2ProtocolDecoder implements ProtocolDecoder<ByteBuffer, Http2Frame, Http2Connection> { + + @Override + public Http2Connection createDecoderState() { + return new Http2Connection(); + } + + @Override + public Http2Frame decode(ByteBuffer input, Http2Connection context) { + return context.decode(input); + } + + @Override + public void finishDecode(Http2Connection context) { + } +}
diff --git a/http2/src/main/java/org/apache/mina/http2/codec/Http2ProtocolEncoder.java b/http2/src/main/java/org/apache/mina/http2/codec/Http2ProtocolEncoder.java new file mode 100644 index 0000000..bd1655c --- /dev/null +++ b/http2/src/main/java/org/apache/mina/http2/codec/Http2ProtocolEncoder.java
@@ -0,0 +1,42 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.codec; + +import java.nio.ByteBuffer; + +import org.apache.mina.codec.StatelessProtocolEncoder; +import org.apache.mina.http2.api.Http2Frame; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2ProtocolEncoder implements StatelessProtocolEncoder<Http2Frame, ByteBuffer> { + + @Override + public Void createEncoderState() { + return null; + } + + @Override + public ByteBuffer encode(Http2Frame message, Void context) { + return message.toBuffer(); + } +}
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/BytePartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/BytePartialDecoder.java new file mode 100644 index 0000000..9153b97 --- /dev/null +++ b/http2/src/main/java/org/apache/mina/http2/impl/BytePartialDecoder.java
@@ -0,0 +1,66 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.impl; + +import java.nio.ByteBuffer; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class BytePartialDecoder implements PartialDecoder<byte[]> { + private int offset; + private byte[] value; + + /** + * Decode an byte array. + * + * @param size the size of the byte array to decode + */ + public BytePartialDecoder(int size) { + this.offset = 0; + this.value = new byte[size]; + } + + public boolean consume(ByteBuffer buffer) { + if (value.length - offset == 0) { + throw new IllegalStateException(); + } + int length = Math.min(buffer.remaining(), value.length - offset); + buffer.get(value, offset, length); + offset += length; + return value.length - offset == 0; + } + + public byte[] getValue() { + if (value.length - offset > 0) { + throw new IllegalStateException(); + } + return value; + } + + /** + * {@inheritDoc} + */ + @Override + public void reset() { + offset = 0; + } +}
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/HeadersEncoder.java b/http2/src/main/java/org/apache/mina/http2/impl/HeadersEncoder.java index 3afb72d..6c51612 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/HeadersEncoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/HeadersEncoder.java
@@ -1,3 +1,22 @@ +/* + * 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. + * + */ package org.apache.mina.http2.impl; import java.io.IOException; @@ -11,6 +30,10 @@ import static org.apache.mina.http2.api.Http2Constants.US_ASCII_CHARSET; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class HeadersEncoder { private final Encoder encoder;
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2Connection.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2Connection.java index 9ec5b4f..584e6f2 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2Connection.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2Connection.java
@@ -1,10 +1,29 @@ +/* + * 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. + * + */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; import org.apache.mina.http2.api.Http2Frame; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; + import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_DATA; import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_HEADERS; import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_PRIORITY; @@ -16,6 +35,10 @@ import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_WINDOW_UPDATE; import static org.apache.mina.http2.api.Http2Constants.FRAME_TYPE_CONTINUATION; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class Http2Connection { private static enum DecoderState {
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2ContinuationFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2ContinuationFrameDecoder.java index 39f6706..d9ca244 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2ContinuationFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2ContinuationFrameDecoder.java
@@ -1,23 +1,38 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2ContinuationFrame.Builder; +import org.apache.mina.http2.api.Http2ContinuationFrame.Http2ContinuationFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2ContinuationFrameDecoder extends Http2FrameDecoder { private BytePartialDecoder decoder; - private Builder builder = new Builder(); + private Http2ContinuationFrameBuilder builder = new Http2ContinuationFrameBuilder(); public Http2ContinuationFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2DataFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2DataFrameDecoder.java index 7a07812..6763e55 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2DataFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2DataFrameDecoder.java
@@ -1,20 +1,34 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2DataFrame.Builder; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.api.Http2DataFrame.Http2DataFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; import static org.apache.mina.http2.api.Http2Constants.FLAGS_PADDING; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2DataFrameDecoder extends Http2FrameDecoder { @@ -30,7 +44,7 @@ private int padLength; - private Builder builder = new Builder(); + private Http2DataFrameBuilder builder = new Http2DataFrameBuilder(); public Http2DataFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2FrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2FrameDecoder.java index e59c41e..003bd53 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2FrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2FrameDecoder.java
@@ -1,16 +1,31 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import org.apache.mina.http2.api.Http2Frame; import org.apache.mina.http2.api.Http2Frame.AbstractHttp2FrameBuilder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public abstract class Http2FrameDecoder implements PartialDecoder<Http2Frame> { private Http2FrameHeader header;
diff --git a/http2/src/main/java/org/apache/mina/http2/api/Http2FrameHeadePartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2FrameHeadePartialDecoder.java similarity index 74% rename from http2/src/main/java/org/apache/mina/http2/api/Http2FrameHeadePartialDecoder.java rename to http2/src/main/java/org/apache/mina/http2/impl/Http2FrameHeadePartialDecoder.java index 059f193..41e8817 100644 --- a/http2/src/main/java/org/apache/mina/http2/api/Http2FrameHeadePartialDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2FrameHeadePartialDecoder.java
@@ -1,14 +1,31 @@ -/** - * +/* + * 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. + * */ -package org.apache.mina.http2.api; +package org.apache.mina.http2.impl; import java.nio.ByteBuffer; import static org.apache.mina.http2.api.Http2Constants.HTTP2_31BITS_MASK; + /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2FrameHeadePartialDecoder implements PartialDecoder<Http2FrameHeadePartialDecoder.Http2FrameHeader> { public static class Http2FrameHeader {
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2GoAwayFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2GoAwayFrameDecoder.java index 86187b2..e00007f 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2GoAwayFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2GoAwayFrameDecoder.java
@@ -1,20 +1,34 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2GoAwayFrame.Builder; -import org.apache.mina.http2.api.IntPartialDecoder; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.api.Http2GoAwayFrame.Http2GoAwayFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; import static org.apache.mina.http2.api.Http2Constants.HTTP2_31BITS_MASK; + /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2GoAwayFrameDecoder extends Http2FrameDecoder { @@ -28,7 +42,7 @@ private PartialDecoder<?> decoder; - private Builder builder = new Builder(); + private Http2GoAwayFrameBuilder builder = new Http2GoAwayFrameBuilder(); public Http2GoAwayFrameDecoder(Http2FrameHeader header) { super(header); @@ -48,11 +62,11 @@ if (decoder.consume(buffer)) { builder.lastStreamID(((IntPartialDecoder)decoder).getValue() & HTTP2_31BITS_MASK); state = State.CODE; - decoder.reset(); + decoder = new LongPartialDecoder(4); } case CODE: if (decoder.consume(buffer)) { - builder.errorCode(((IntPartialDecoder)decoder).getValue()); + builder.errorCode(((LongPartialDecoder)decoder).getValue()); if (getHeader().getLength() > 8) { state = State.EXTRA; decoder = new BytePartialDecoder(getHeader().getLength() - 8);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2HeadersFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2HeadersFrameDecoder.java index 72a89c3..d1deb9d 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2HeadersFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2HeadersFrameDecoder.java
@@ -1,15 +1,28 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2HeadersFrame.Builder; -import org.apache.mina.http2.api.IntPartialDecoder; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.api.Http2HeadersFrame.Http2HeadersFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; import static org.apache.mina.http2.api.Http2Constants.FLAGS_PADDING; import static org.apache.mina.http2.api.Http2Constants.FLAGS_PRIORITY; @@ -17,8 +30,8 @@ import static org.apache.mina.http2.api.Http2Constants.HTTP2_EXCLUSIVE_MASK; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2HeadersFrameDecoder extends Http2FrameDecoder { @@ -36,7 +49,7 @@ private int padLength; - private Builder builder = new Builder(); + private Http2HeadersFrameBuilder builder = new Http2HeadersFrameBuilder(); public Http2HeadersFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2PingFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2PingFrameDecoder.java index 4098d49..c894c98 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2PingFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2PingFrameDecoder.java
@@ -1,34 +1,41 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2PingFrame.Builder; + +import org.apache.mina.http2.api.Http2PingFrame.Http2PingFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2PingFrameDecoder extends Http2FrameDecoder { - - private static enum State { - DATA, - EXTRA - } - - private State state; - private BytePartialDecoder decoder; - private Builder builder = new Builder(); + private Http2PingFrameBuilder builder = new Http2PingFrameBuilder(); public Http2PingFrameDecoder(Http2FrameHeader header) { super(header); - decoder = new BytePartialDecoder(8); - state = State.DATA; + decoder = new BytePartialDecoder(header.getLength()); initBuilder(builder); } @@ -37,25 +44,9 @@ */ @Override public boolean consume(ByteBuffer buffer) { - while ((getValue() == null) && buffer.remaining() > 0) { - switch (state) { - case DATA: - if (decoder.consume(buffer)) { - builder.data(decoder.getValue()); - if (getHeader().getLength() > 8) { - state = State.EXTRA; - decoder = new BytePartialDecoder(getHeader().getLength() - 8); - } else { - setValue(builder.build()); - } - } - break; - case EXTRA: - if (decoder.consume(buffer)) { - setValue(builder.build()); - } - break; - } + if (decoder.consume(buffer)) { + builder.data(decoder.getValue()); + setValue(builder.build()); } return getValue() != null; }
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2PriorityFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2PriorityFrameDecoder.java index 8fd1036..3dbdfd2 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2PriorityFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2PriorityFrameDecoder.java
@@ -1,22 +1,35 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2PriorityFrame.Builder; -import org.apache.mina.http2.api.IntPartialDecoder; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.api.Http2PriorityFrame.Http2PriorityFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; import static org.apache.mina.http2.api.Http2Constants.HTTP2_31BITS_MASK; import static org.apache.mina.http2.api.Http2Constants.HTTP2_EXCLUSIVE_MASK; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2PriorityFrameDecoder extends Http2FrameDecoder { @@ -30,7 +43,7 @@ private PartialDecoder<?> decoder; - private Builder builder = new Builder(); + private Http2PriorityFrameBuilder builder = new Http2PriorityFrameBuilder(); public Http2PriorityFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2ProtocolDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2ProtocolDecoder.java deleted file mode 100644 index 8217166..0000000 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2ProtocolDecoder.java +++ /dev/null
@@ -1,30 +0,0 @@ -/** - * - */ -package org.apache.mina.http2.impl; - -import java.nio.ByteBuffer; - -import org.apache.mina.codec.ProtocolDecoder; -import org.apache.mina.http2.api.Http2Frame; - -/** - * @author jeffmaury - * - */ -public class Http2ProtocolDecoder implements ProtocolDecoder<ByteBuffer, Http2Frame, Http2Connection> { - - @Override - public Http2Connection createDecoderState() { - return new Http2Connection(); - } - - @Override - public Http2Frame decode(ByteBuffer input, Http2Connection context) { - return context.decode(input); - } - - @Override - public void finishDecode(Http2Connection context) { - } -}
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2PushPromiseFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2PushPromiseFrameDecoder.java index 34863ce..077e7da 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2PushPromiseFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2PushPromiseFrameDecoder.java
@@ -1,22 +1,35 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2PushPromiseFrame.Builder; -import org.apache.mina.http2.api.IntPartialDecoder; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.api.Http2PushPromiseFrame.Http2PushPromiseFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; import static org.apache.mina.http2.api.Http2Constants.FLAGS_PADDING; import static org.apache.mina.http2.api.Http2Constants.HTTP2_31BITS_MASK; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2PushPromiseFrameDecoder extends Http2FrameDecoder { @@ -33,7 +46,7 @@ private int padLength; - private Builder builder = new Builder(); + private Http2PushPromiseFrameBuilder builder = new Http2PushPromiseFrameBuilder(); public Http2PushPromiseFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2RstStreamFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2RstStreamFrameDecoder.java index e16b0bc..f64175c 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2RstStreamFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2RstStreamFrameDecoder.java
@@ -1,22 +1,32 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2RstStreamFrame.Builder; -import org.apache.mina.http2.api.IntPartialDecoder; -import org.apache.mina.http2.api.LongPartialDecoder; -import org.apache.mina.http2.api.PartialDecoder; - -import static org.apache.mina.http2.api.Http2Constants.HTTP2_31BITS_MASK; +import org.apache.mina.http2.api.Http2RstStreamFrame.Http2RstStreamFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2RstStreamFrameDecoder extends Http2FrameDecoder { @@ -29,7 +39,7 @@ private PartialDecoder<?> decoder; - private Builder builder = new Builder(); + private Http2RstStreamFrameBuilder builder = new Http2RstStreamFrameBuilder(); public Http2RstStreamFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2SettingsFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2SettingsFrameDecoder.java index 6213c66..ab3166b 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2SettingsFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2SettingsFrameDecoder.java
@@ -1,5 +1,21 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; @@ -7,14 +23,13 @@ import java.util.ArrayList; import java.util.Collection; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2SettingsFrame.Builder; import org.apache.mina.http2.api.Http2Setting; -import org.apache.mina.http2.api.LongPartialDecoder; +import org.apache.mina.http2.api.Http2SettingsFrame.Http2SettingsFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2SettingsFrameDecoder extends Http2FrameDecoder { @@ -22,7 +37,7 @@ private LongPartialDecoder decoder = new LongPartialDecoder(6); - private Builder builder = new Builder(); + private Http2SettingsFrameBuilder builder = new Http2SettingsFrameBuilder(); private Collection<Http2Setting> settings = new ArrayList<Http2Setting>(); @@ -42,7 +57,7 @@ remaining--; Http2Setting setting = new Http2Setting(); setting.setID((int) ((decoder.getValue() & 0x00FFFF00000000L) >> 32)); - setting.setValue(decoder.getValue() & 0x00FFFFFFFFL); + setting.setValue((decoder.getValue() & 0x00FFFFFFFFL)); settings.add(setting); decoder.reset(); if (remaining == 0) {
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2UnknownFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2UnknownFrameDecoder.java index f19e55f..df64cfc 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2UnknownFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2UnknownFrameDecoder.java
@@ -1,22 +1,38 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2UnknownFrame.Builder; + +import org.apache.mina.http2.api.Http2UnknownFrame.Http2UnknownFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2UnknownFrameDecoder extends Http2FrameDecoder { private BytePartialDecoder decoder; - private Builder builder = new Builder(); + private Http2UnknownFrameBuilder builder = new Http2UnknownFrameBuilder(); public Http2UnknownFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/Http2WindowUpdateFrameDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/Http2WindowUpdateFrameDecoder.java index 6d96327..234db5c 100644 --- a/http2/src/main/java/org/apache/mina/http2/impl/Http2WindowUpdateFrameDecoder.java +++ b/http2/src/main/java/org/apache/mina/http2/impl/Http2WindowUpdateFrameDecoder.java
@@ -1,19 +1,32 @@ -/** - * +/* + * 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. + * */ package org.apache.mina.http2.impl; import java.nio.ByteBuffer; -import org.apache.mina.http2.api.BytePartialDecoder; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; -import org.apache.mina.http2.api.Http2WindowUpdateFrame.Builder; -import org.apache.mina.http2.api.IntPartialDecoder; -import org.apache.mina.http2.api.PartialDecoder; +import org.apache.mina.http2.api.Http2WindowUpdateFrame.Http2WindowUpdateFrameBuilder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; /** - * @author jeffmaury - * + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public class Http2WindowUpdateFrameDecoder extends Http2FrameDecoder { @@ -26,7 +39,7 @@ private PartialDecoder<?> decoder; - private Builder builder = new Builder(); + private Http2WindowUpdateFrameBuilder builder = new Http2WindowUpdateFrameBuilder(); public Http2WindowUpdateFrameDecoder(Http2FrameHeader header) { super(header);
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/IntPartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/IntPartialDecoder.java new file mode 100644 index 0000000..152d840 --- /dev/null +++ b/http2/src/main/java/org/apache/mina/http2/impl/IntPartialDecoder.java
@@ -0,0 +1,78 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.impl; + +import java.nio.ByteBuffer; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class IntPartialDecoder implements PartialDecoder<Integer> { + private int size; + private int remaining; + private int value; + + /** + * Decode an integer whose size is different from the standard 4. + * + * @param size the size (1,2,3,4) to decode + */ + public IntPartialDecoder(int size) { + this.remaining = size; + this.size = size; + } + + /** + * Decode a 4 bytes integer + */ + public IntPartialDecoder() { + this(4); + } + + public boolean consume(ByteBuffer buffer) { + if (remaining == 0) { + throw new IllegalStateException(); + } + while (remaining > 0 && buffer.hasRemaining()) { + value = (value << 8) + (buffer.get() & 0x00FF); + --remaining; + } + return remaining == 0; + } + + public Integer getValue() { + if (remaining > 0) { + throw new IllegalStateException(); + } + return value; + } + + /* (non-Javadoc) + * @see org.apache.mina.http2.api.PartialDecoder#reset() + */ + @Override + public void reset() { + remaining = size; + value = 0; + } + + +}
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/LongPartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/LongPartialDecoder.java new file mode 100644 index 0000000..e6ac6eb --- /dev/null +++ b/http2/src/main/java/org/apache/mina/http2/impl/LongPartialDecoder.java
@@ -0,0 +1,78 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.impl; + +import java.nio.ByteBuffer; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class LongPartialDecoder implements PartialDecoder<Long> { + private int size; + private int remaining; + private long value; + + /** + * Decode a long integer whose size is different from the standard 8. + * + * @param size the size (1 to 8) to decode + */ + public LongPartialDecoder(int size) { + this.remaining = size; + this.size = size; + } + + /** + * Decode a 8 bytes long integer + */ + public LongPartialDecoder() { + this(8); + } + + public boolean consume(ByteBuffer buffer) { + if (remaining == 0) { + throw new IllegalStateException(); + } + while (remaining > 0 && buffer.hasRemaining()) { + value = (value << 8) + (buffer.get() & 0x00FF); + --remaining; + } + return remaining == 0; + } + + public Long getValue() { + if (remaining > 0) { + throw new IllegalStateException(); + } + return value; + } + + /* (non-Javadoc) + * @see org.apache.mina.http2.api.PartialDecoder#reset() + */ + @Override + public void reset() { + remaining = size; + value = 0; + } + + +}
diff --git a/http2/src/main/java/org/apache/mina/http2/impl/PartialDecoder.java b/http2/src/main/java/org/apache/mina/http2/impl/PartialDecoder.java new file mode 100644 index 0000000..0139382 --- /dev/null +++ b/http2/src/main/java/org/apache/mina/http2/impl/PartialDecoder.java
@@ -0,0 +1,50 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.impl; + +import java.nio.ByteBuffer; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public interface PartialDecoder<T> { + /** + * Consume the buffer so as to decode a value. Not all the input buffer + * may be consumed. + * + * @param buffer the input buffer to decode + * @return true if a value is available false if more data is requested + */ + public boolean consume(ByteBuffer buffer); + + /** + * Return the decoded value. + * + * @return the decoded value + */ + public T getValue(); + + /** + * Reset the internal state of the decoder to that new decoding can take place. + */ + public void reset(); + +}
diff --git a/http2/src/test/java/org/apache/mina/http2/Http2Test.java b/http2/src/test/java/org/apache/mina/http2/Http2Test.java new file mode 100644 index 0000000..44ee14b --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/Http2Test.java
@@ -0,0 +1,35 @@ +/* + * 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. + * + */ +package org.apache.mina.http2; + +import java.nio.ByteBuffer; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ + +public abstract class Http2Test { + protected byte[] toByteArray(ByteBuffer buffer) { + byte[] result = new byte[buffer.remaining()]; + buffer.get(result); + return result; + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/TestMessages.java b/http2/src/test/java/org/apache/mina/http2/TestMessages.java new file mode 100644 index 0000000..c931603 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/TestMessages.java
@@ -0,0 +1,465 @@ +/* + * 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. + * + */ +package org.apache.mina.http2; + +import java.util.Collections; + +import org.apache.mina.http2.api.Http2ContinuationFrame; +import org.apache.mina.http2.api.Http2ContinuationFrame.Http2ContinuationFrameBuilder; +import org.apache.mina.http2.api.Http2DataFrame; +import org.apache.mina.http2.api.Http2DataFrame.Http2DataFrameBuilder; +import org.apache.mina.http2.api.Http2GoAwayFrame; +import org.apache.mina.http2.api.Http2GoAwayFrame.Http2GoAwayFrameBuilder; +import org.apache.mina.http2.api.Http2HeadersFrame; +import org.apache.mina.http2.api.Http2HeadersFrame.Http2HeadersFrameBuilder; +import org.apache.mina.http2.api.Http2PingFrame; +import org.apache.mina.http2.api.Http2PingFrame.Http2PingFrameBuilder; +import org.apache.mina.http2.api.Http2PriorityFrame; +import org.apache.mina.http2.api.Http2PriorityFrame.Http2PriorityFrameBuilder; +import org.apache.mina.http2.api.Http2PushPromiseFrame; +import org.apache.mina.http2.api.Http2PushPromiseFrame.Http2PushPromiseFrameBuilder; +import org.apache.mina.http2.api.Http2RstStreamFrame; +import org.apache.mina.http2.api.Http2RstStreamFrame.Http2RstStreamFrameBuilder; +import org.apache.mina.http2.api.Http2Setting; +import org.apache.mina.http2.api.Http2SettingsFrame; +import org.apache.mina.http2.api.Http2SettingsFrame.Http2SettingsFrameBuilder; +import org.apache.mina.http2.api.Http2UnknownFrame; +import org.apache.mina.http2.api.Http2UnknownFrame.Http2UnknownFrameBuilder; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ + +public final class TestMessages { + + public static final byte[] CONTINUATION_NO_HEADER_FRAGMENT_BUFFER = new byte[] { + 0x00, 0x00, 0x00, /*length*/ + 0x09, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x32 /*streamID*/ + }; + + public static final Http2ContinuationFrame CONTINUATION_NO_HEADER_FRAGMENT_FRAME = Http2ContinuationFrameBuilder.builder(). + streamID(50). + build(); + + public static final byte[] CONTINUATION_HEADER_FRAGMENT_BUFFER = new byte[] { + 0x00, 0x00, 0x0A, /*length*/ + 0x09, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x32, /*streamID*/ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A /*headerFragment*/ + }; + + public static final Http2ContinuationFrame CONTINUATION_HEADER_FRAGMENT_FRAME = Http2ContinuationFrameBuilder.builder(). + streamID(50). + headerBlockFragment(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}). + build(); + + public static final byte[] DATA_NO_PAYLOAD_NO_PADDING_BUFFER = new byte[] { + 0x00, 0x00, 0x00, /*length*/ + 0x00, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x32 /*streamID*/ + }; + + public static final Http2DataFrame DATA_NO_PAYLOAD_NO_PADDING_FRAME = Http2DataFrameBuilder.builder(). + streamID(50). + build(); + + public static final byte[] DATA_PAYLOAD_NO_PADDING_BUFFER = new byte[] { + 0x00, 0x00, 0x0A, /*length*/ + 0x00, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x32, /*streamID*/ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A /*headerFragment*/ + }; + + public static final Http2DataFrame DATA_PAYLOAD_NO_PADDING_FRAME = Http2DataFrameBuilder.builder(). + streamID(50). + data(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}). + build(); + + public static final byte[] DATA_NO_PAYLOAD_PADDING_BUFFER = new byte[] { + 0x00, 0x00, 0x03, /*length*/ + 0x00, /*type*/ + 0x08, /*flags*/ + 0x00, 0x00, 0x00, 0x32, /*streamID*/ + 0x02, /*padLength*/ + 0x0E, 0x28 /*padding*/ + }; + + public static final Http2DataFrame DATA_NO_PAYLOAD_PADDING_FRAME = Http2DataFrameBuilder.builder(). + streamID(50). + padding(new byte[] {0x0E, 0x28}). + build(); + + public static final byte[] DATA_PAYLOAD_PADDING_BUFFER = new byte[] { + 0x00, 0x00, 0x0D, /*length*/ + 0x00, /*type*/ + 0x08, /*flags*/ + 0x00, 0x00, 0x00, 0x32, /*streamID*/ + 0x02, /*padLength*/ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, /*data*/ + 0x0E, 0x28 /*padding*/ + }; + + public static final Http2DataFrame DATA_PAYLOAD_PADDING_FRAME = Http2DataFrameBuilder.builder(). + streamID(50). + data(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}). + padding(new byte[] {0x0E, 0x28}). + build(); + + public static final byte[] GOAWAY_NO_DATA_BUFFER = new byte[] { + 0x00, 0x00, 0x08, /*length*/ + 0x07, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + 0x00, 0x00, 0x01, 0x00, /*lastStreamID*/ + 0x00, 0x01, 0x02, 0x03 /*errorCode*/ + }; + + public static final Http2GoAwayFrame GOAWAY_NO_DATA_FRAME = Http2GoAwayFrameBuilder.builder(). + streamID(1). + lastStreamID(256). + errorCode(0x010203). + build(); + + public static final byte[] GOAWAY_NO_DATA_HIGHEST_STREAMID_BUFFER = new byte[] { + 0x00, 0x00, 0x08, /*length*/ + 0x07, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*lastStreamID*/ + 0x00, 0x01, 0x02, 0x03 /*errorCode*/ + }; + + public static final Http2GoAwayFrame GOAWAY_NO_DATA_HIGHEST_STREAMID_FRAME = Http2GoAwayFrameBuilder.builder(). + streamID(1). + lastStreamID(0x7FFFFFFF). + errorCode(0x010203). + build(); + + public static final byte[] GOAWAY_NO_DATA_HIGHEST_STREAMID_RESERVED_BIT_BUFFER = new byte[] { + 0x00, 0x00, 0x08, /*length*/ + 0x07, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*lastStreamID*/ + 0x00, 0x01, 0x02, 0x03 /*errorCode*/ + }; + + public static final byte[] GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_BUFFER = new byte[] { + 0x00, 0x00, 0x08, /*length*/ + 0x07, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + (byte) 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*lastStreamID*/ + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF /*errorCode*/ + }; + + public static final Http2GoAwayFrame GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_FRAME = Http2GoAwayFrameBuilder.builder(). + streamID(1). + lastStreamID(0x7FFFFFFF). + errorCode(0x00FFFFFFFFL). + build(); + + public static final byte[] GOAWAY_DATA_BUFFER = new byte[] { + 0x00, 0x00, 0x09, /*length*/ + 0x07, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + 0x00, 0x00, 0x01, 0x00, /*lastStreamID*/ + 0x00, 0x01, 0x02, 0x03, /*errorCode*/ + 0x01 /*additionData*/ + }; + + public static final Http2GoAwayFrame GOAWAY_DATA_FRAME = Http2GoAwayFrameBuilder.builder(). + streamID(1). + lastStreamID(256). + errorCode(0x010203). + data(new byte[] { 0x01}). + build(); + + public static final byte[] HEADERS_NO_PADDING_NO_PRIORITY_BUFFER = new byte[] { + 0x00, 0x00, 0x01, /*length*/ + 0x01, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + (byte) 0x82 /*headerFragment*/ + }; + + public static final Http2HeadersFrame HEADERS_NO_PADDING_NO_PRIORITY_FRAME = Http2HeadersFrameBuilder.builder(). + streamID(1). + headerBlockFragment(new byte[] {(byte) 0x82}). + build(); + + public static final byte[] HEADERS_PADDING_PRIORITY_BUFFER = new byte[] { + 0x00, 0x00, 0x17, /*length*/ + 0x01, /*type*/ + 0x28, /*flags*/ + 0x00, 0x00, 0x00, 0x03, /*streamID*/ + 0x10, /*padding length*/ + (byte)0x0080, 0x00, 0x00, 0x14, /*stream dependency*/ + 0x09, /*weight*/ + (byte) 0x82, /*headerFragment*/ + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E /*padding*/ + }; + + public static final Http2HeadersFrame HEADERS_PADDING_PRIORITY_FRAME = Http2HeadersFrameBuilder.builder(). + streamID(3). + exclusiveMode(true). + streamDependencyID(20). + weight((short) 10). + headerBlockFragment(new byte[] { (byte) 0x82}). + padding(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}). + build(); + + public static final byte[] HEADERS_PADDING_NO_PRIORITY_BUFFER = new byte[] { + 0x00, 0x00, 0x12, /*length*/ + 0x01, /*type*/ + 0x08, /*flags*/ + 0x00, 0x00, 0x00, 0x03, /*streamID*/ + 0x10, /*padding length*/ + (byte) 0x0082, /*headerFragment*/ + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E /*padding*/ + }; + + public static final Http2HeadersFrame HEADERS_PADDING_NO_PRIORITY_FRAME = Http2HeadersFrameBuilder.builder(). + streamID(3). + headerBlockFragment(new byte[] { (byte) 0x82}). + padding(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}). + build(); + + public static final byte[] PING_STANDARD_BUFFER = new byte[] { + 0x00, 0x00, 0x08, /*length*/ + 0x06, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07/*opaqueData*/ + }; + + public static final Http2PingFrame PING_STANDARD_FRAME = Http2PingFrameBuilder.builder(). + streamID(32). + data(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}). + build(); + + public static final byte[] PING_EXTRA_DATA_BUFFER = new byte[] { + 0x00, 0x00, 0x09, /*length*/ + 0x06, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08/*opaqueData*/ + }; + + public static final Http2PingFrame PING_EXTRA_DATA_FRAME = Http2PingFrameBuilder.builder(). + streamID(32). + data(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}). + build(); + + public static final byte[] PING_NO_ENOUGH_DATA_BUFFER = new byte[] { + 0x00, 0x00, 0x01, /*length*/ + 0x06, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00/*opaqueData*/ + }; + + public static final Http2PingFrame PING_NO_ENOUGH_DATA_FRAME = Http2PingFrameBuilder.builder(). + streamID(32). + data(new byte[] {0x00}). + build(); + + public static final byte[] PRIORITY_NO_EXCLUSIVE_MODE_BUFFER = new byte[] { + 0x00, 0x00, 0x05, /*length*/ + 0x02, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x00, 0x01, 0x00, /*streamDependency*/ + 0x01 /*weight*/ + }; + + public static final Http2PriorityFrame PRIORITY_NO_EXCLUSIVE_MODE_FRAME = Http2PriorityFrameBuilder.builder(). + streamID(32). + weight((short) 2). + streamDependencyID(256). + build(); + + public static final byte[] PRIORITY_EXCLUSIVE_MODE_BUFFER = new byte[] { + 0x00, 0x00, 0x05, /*length*/ + 0x02, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + (byte) 0x80, 0x00, 0x01, 0x00, /*streamDependency*/ + 0x01 /*weight*/ + }; + + public static final Http2PriorityFrame PRIORITY_EXCLUSIVE_MODE_FRAME = Http2PriorityFrameBuilder.builder(). + streamID(32). + weight((short) 2). + streamDependencyID(256). + exclusiveMode(true). + build(); + + public static final byte[] PUSH_PROMISE_NO_PADDING_BUFFER = new byte[] { + 0x00, 0x00, 0x05, /*length*/ + 0x05, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x01, /*streamID*/ + 0x00, 0x00, 0x01, 0x00, /*promisedStreamID*/ + (byte) 0x82 /*headerFragment*/ + }; + + public static final Http2PushPromiseFrame PUSH_PROMISE_NO_PADDING_FRAME = Http2PushPromiseFrameBuilder.builder(). + streamID(1). + promisedStreamID(256). + headerBlockFragment(new byte[] {(byte) 0x82}). + build(); + + public static final byte[] PUSH_PROMISE_PADDING_BUFFER = new byte[] { + 0x00, 0x00, 0x16, /*length*/ + 0x05, /*type*/ + 0x08, /*flags*/ + 0x00, 0x00, 0x00, 0x03, /*streamID*/ + 0x10, /*padding length*/ + 0x00, 0x00, 0x00, 0x14, /*promisedStreamID*/ + (byte) 0x0082, /*headerFragment*/ + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E /*padding*/ + }; + + public static final Http2PushPromiseFrame PUSH_PROMISE_PADDING_FRAME = Http2PushPromiseFrameBuilder.builder(). + streamID(3). + promisedStreamID(20). + headerBlockFragment(new byte[] {(byte) 0x82}). + padding(new byte[] { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}). + build(); + + public static final byte[] RST_STREAM_NO_EXTRA_PAYLOAD_BUFFER = new byte[] { + 0x00, 0x00, 0x04, /*length*/ + 0x03, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x00, 0x01, 0x00, /*errorCode*/ + }; + + public static final Http2RstStreamFrame RST_STREAM_NO_EXTRA_PAYLOAD_FRAME = Http2RstStreamFrameBuilder.builder(). + streamID(32). + errorCode(256). + build(); + + public static final byte[] RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_BUFFER = new byte[] {0x00, 0x00, 0x04, /*length*/ + 0x03, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*errorCode*/ + }; + + public static final Http2RstStreamFrame RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_FRAME = Http2RstStreamFrameBuilder.builder(). + streamID(32). + errorCode(0x00FFFFFFFFL). + build(); + + public static final byte[] RST_STREAM_EXTRA_PAYLOAD_BUFFER = new byte[] { + 0x00, 0x00, 0x06, /*length*/ + 0x03, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x00, 0x01, 0x00, /*errorCode*/ + 0x0E, 0x28 + }; + + public static final byte[] RST_STREAM_EXTRA_PAYLOAD_HIGHEST_BUFFER = new byte[] { + 0x00, 0x00, 0x06, /*length*/ + 0x03, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*errorCode*/ + 0x0E, 0x28 + }; + + public static final byte[] SETTINGS_DEFAULT_BUFFER = new byte[] { + 0x00, 0x00, 0x06, /*length*/ + 0x04, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x01, /*ID*/ + 0x01, 0x02, 0x03, 0x04, /*value*/ + }; + + public static final Http2SettingsFrame SETTINGS_DEFAULT_FRAME = Http2SettingsFrameBuilder.builder(). + streamID(32). + settings(Collections.singletonList(new Http2Setting(1, 0x01020304))). + build(); + + public static final byte[] SETTINGS_HIGHEST_ID_BUFFER = new byte[] { + 0x00, 0x00, 0x06, /*length*/ + 0x04, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + (byte) 0xFF, (byte) 0xFF, /*ID*/ + 0x01, 0x02, 0x03, 0x04, /*value*/ + }; + + public static final Http2SettingsFrame SETTINGS_HIGHEST_ID_FRAME = Http2SettingsFrameBuilder.builder(). + streamID(32). + settings(Collections.singletonList(new Http2Setting(0x00FFFF, 0x01020304))). + build(); + + public static final byte[] SETTINGS_HIGHEST_VALUE_BUFFER = new byte[] { + 0x00, 0x00, 0x06, /*length*/ + 0x04, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x00, 0x01, /*ID*/ + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*value*/ + }; + + public static final Http2SettingsFrame SETTINGS_HIGHEST_VALUE_FRAME = Http2SettingsFrameBuilder.builder(). + streamID(32). + settings(Collections.singletonList(new Http2Setting(1, 0xFFFFFFFFL))). + build(); + + public static final byte[] UNKNOWN_PAYLOAD_BUFFER = new byte[] { + 0x00, 0x00, 0x02, /*length*/ + (byte) 0x00FF, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20, /*streamID*/ + 0x0E, 0x18 + }; + + public static final Http2UnknownFrame UNKNOWN_PAYLOAD_FRAME = Http2UnknownFrameBuilder.builder(). + type((short) 255). + streamID(32). + payload(new byte[] { 0x0E, 0x18}). + build(); + + public static final byte[] UNKNOWN_NO_PAYLOAD_BUFFER = new byte[] { + 0x00, 0x00, 0x00, /*length*/ + (byte) 0x00FF, /*type*/ + 0x00, /*flags*/ + 0x00, 0x00, 0x00, 0x20 /*streamID*/ + }; + + public static final Http2UnknownFrame UNKNOWN_NO_PAYLOAD_FRAME = Http2UnknownFrameBuilder.builder(). + type((short) 255). + streamID(32). + build(); +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2ContinuationFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2ContinuationFrameDecoderTest.java deleted file mode 100644 index 12a661c..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2ContinuationFrameDecoderTest.java +++ /dev/null
@@ -1,46 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2ContinuationFrameDecoderTest { - - @Test - public void checkContinuationNoHeaderFragment() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x00, /*length*/ - 0x09, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x32 /*streamID*/}); - Http2ContinuationFrame frame = (Http2ContinuationFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(0, frame.getLength()); - assertEquals(9, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(50, frame.getStreamID()); - assertEquals(0, frame.getHeaderBlockFragment().length); - } - - @Test - public void checkContinuationWithHeaderFragment() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x0A, /*length*/ - 0x09, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x32, /*streamID*/ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A /*headerFragment*/}); - Http2ContinuationFrame frame = (Http2ContinuationFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(10, frame.getLength()); - assertEquals(9, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(50, frame.getStreamID()); - assertEquals(10, frame.getHeaderBlockFragment().length); - assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getHeaderBlockFragment()); - } -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2DataFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2DataFrameDecoderTest.java deleted file mode 100644 index f6dad67..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2DataFrameDecoderTest.java +++ /dev/null
@@ -1,89 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2DataFrameDecoderTest { - - @Test - public void checkDataNoPayloadNoPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x00, /*length*/ - 0x00, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x32 /*streamID*/}); - Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(0, frame.getLength()); - assertEquals(0, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(50, frame.getStreamID()); - assertEquals(0, frame.getData().length); - assertEquals(0, frame.getPadding().length); - } - - @Test - public void checkDataWithPayloadNoPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x0A, /*length*/ - 0x00, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x32, /*streamID*/ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A /*headerFragment*/}); - Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(10, frame.getLength()); - assertEquals(0, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(50, frame.getStreamID()); - assertEquals(10, frame.getData().length); - assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getData()); - assertEquals(0, frame.getPadding().length); - } - - @Test - public void checkDataNoPayloadPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x03, /*length*/ - 0x00, /*type*/ - 0x08, /*flags*/ - 0x00, 0x00, 0x00, 0x32, /*streamID*/ - 0x02, 0x0E, 0x28 /*padding*/}); - Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(3, frame.getLength()); - assertEquals(0, frame.getType()); - assertEquals(0x08, frame.getFlags()); - assertEquals(50, frame.getStreamID()); - assertEquals(0,frame.getData().length); - assertEquals(2, frame.getPadding().length); - assertArrayEquals(new byte[] {0x0E, 0x28}, frame.getPadding()); - } - - @Test - public void checkDataWithPayloadPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x0D, /*length*/ - 0x00, /*type*/ - 0x08, /*flags*/ - 0x00, 0x00, 0x00, 0x32, /*streamID*/ - 0x02, /*padLength*/ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, /*data*/ - 0x0E, 0x28 /*padding*/}); - Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(13, frame.getLength()); - assertEquals(0, frame.getType()); - assertEquals(0x08, frame.getFlags()); - assertEquals(50, frame.getStreamID()); - assertEquals(10, frame.getData().length); - assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getData()); - assertEquals(2, frame.getPadding().length); - assertArrayEquals(new byte[] {0x0E, 0x28}, frame.getPadding()); - } -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2HeadersFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2HeadersFrameDecoderTest.java deleted file mode 100644 index e974ce5..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2HeadersFrameDecoderTest.java +++ /dev/null
@@ -1,78 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2HeadersFrameDecoderTest { - - @Test - public void checkHeadersFrameWithNotPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x01, /*length*/ - 0x01, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x01, /*streamID*/ - (byte) 0x0082 /*headerFragment*/}); - Http2HeadersFrame frame = (Http2HeadersFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(1, frame.getLength()); - assertEquals(1, frame.getType()); - assertEquals(0, frame.getFlags()); - assertEquals(1, frame.getStreamID()); - assertEquals(1, frame.getHeaderBlockFragment().length); - assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); - } - - - @Test - public void checkHeadersFramePaddingPriority() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x17, /*length*/ - 0x01, /*type*/ - 0x28, /*flags*/ - 0x00, 0x00, 0x00, 0x03, /*streamID*/ - 0x10, /*padding length*/ - (byte)0x0080, 0x00, 0x00, 0x14, /*stream dependency*/ - 0x09, /*weight*/ - (byte) 0x0082, /*headerFragment*/ - 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E /*padding*/}); - Http2HeadersFrame frame = (Http2HeadersFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(23, frame.getLength()); - assertEquals(1, frame.getType()); - assertEquals(0x28, frame.getFlags()); - assertEquals(3, frame.getStreamID()); - assertEquals(10, frame.getWeight()); - assertEquals(1, frame.getHeaderBlockFragment().length); - assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); - assertEquals(16, frame.getPadding().length); - assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); - } - - @Test - public void checkHeadersFramePaddingNoPriority() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x12, /*length*/ - 0x01, /*type*/ - 0x08, /*flags*/ - 0x00, 0x00, 0x00, 0x03, /*streamID*/ - 0x10, /*padding length*/ - (byte) 0x0082, /*headerFragment*/ - 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E /*padding*/}); - Http2HeadersFrame frame = (Http2HeadersFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(18, frame.getLength()); - assertEquals(1, frame.getType()); - assertEquals(0x08, frame.getFlags()); - assertEquals(3, frame.getStreamID()); - assertEquals(1, frame.getHeaderBlockFragment().length); - assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); - assertEquals(16, frame.getPadding().length); - assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); - } -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2PriorityFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2PriorityFrameDecoderTest.java deleted file mode 100644 index cd0c049..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2PriorityFrameDecoderTest.java +++ /dev/null
@@ -1,52 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2PriorityFrameDecoderTest { - - @Test - public void checkPriorityFrameNoExclusive() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x05, /*length*/ - 0x02, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - 0x00, 0x00, 0x01, 0x00, /*streamDependency*/ - 0x01}); - Http2PriorityFrame frame = (Http2PriorityFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(5, frame.getLength()); - assertEquals(2, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(256, frame.getStreamDependencyID()); - assertFalse(frame.getExclusiveMode()); - } - - @Test - public void checkPriorityFrameExclusive() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x05, /*length*/ - 0x02, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - (byte) 0x0080, 0x00, 0x01, 0x00, /*streamDependency*/ - 0x01}); - Http2PriorityFrame frame = (Http2PriorityFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(5, frame.getLength()); - assertEquals(2, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(256, frame.getStreamDependencyID()); - assertTrue(frame.getExclusiveMode()); - } -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2PushPromiseFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2PushPromiseFrameDecoderTest.java deleted file mode 100644 index 02f7198..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2PushPromiseFrameDecoderTest.java +++ /dev/null
@@ -1,57 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2PushPromiseFrameDecoderTest { - - @Test - public void checkWithNoPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x05, /*length*/ - 0x05, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x01, /*streamID*/ - 0x00, 0x00, 0x01, 0x00, /*promisedStreamID*/ - (byte) 0x0082 /*headerFragment*/}); - Http2PushPromiseFrame frame = (Http2PushPromiseFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(5, frame.getLength()); - assertEquals(5, frame.getType()); - assertEquals(0, frame.getFlags()); - assertEquals(1, frame.getStreamID()); - assertEquals(256, frame.getPromisedStreamID()); - assertEquals(1, frame.getHeaderBlockFragment().length); - assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); - } - - - @Test - public void checkWithPadding() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x16, /*length*/ - 0x05, /*type*/ - 0x08, /*flags*/ - 0x00, 0x00, 0x00, 0x03, /*streamID*/ - 0x10, /*padding length*/ - 0x00, 0x00, 0x00, 0x14, /*promisedStreamID*/ - (byte) 0x0082, /*headerFragment*/ - 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E /*padding*/}); - Http2PushPromiseFrame frame = (Http2PushPromiseFrame) connection.decode(buffer); - assertEquals(22, frame.getLength()); - assertEquals(5, frame.getType()); - assertEquals(0x08, frame.getFlags()); - assertEquals(3, frame.getStreamID()); - assertEquals(20, frame.getPromisedStreamID()); - assertEquals(1, frame.getHeaderBlockFragment().length); - assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); - assertEquals(16, frame.getPadding().length); - assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); - } - -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2RstStreamFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2RstStreamFrameDecoderTest.java deleted file mode 100644 index 717b0f6..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2RstStreamFrameDecoderTest.java +++ /dev/null
@@ -1,84 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2RstStreamFrameDecoderTest { - - @Test - public void checkRstStreamNoExtraPayload() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x04, /*length*/ - 0x03, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - 0x00, 0x00, 0x01, 0x00, /*errorCode*/}); - Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(4, frame.getLength()); - assertEquals(3, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(256, frame.getErrorCode()); - } - - @Test - public void checkRstStreamHighestValueNoExtraPayload() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x04, /*length*/ - 0x03, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*errorCode*/}); - Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(4, frame.getLength()); - assertEquals(3, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); - } - - @Test - public void checkRstStreamWithExtraPayload() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x06, /*length*/ - 0x03, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - 0x00, 0x00, 0x01, 0x00, /*errorCode*/ - 0x0E, 0x28}); - Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(6, frame.getLength()); - assertEquals(3, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(256, frame.getErrorCode()); - } - - @Test - public void checkRstStreamHighestValueWithExtraPayload() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x06, /*length*/ - 0x03, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*errorCode*/ - 0x0E, 0x28}); - Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(6, frame.getLength()); - assertEquals(3, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); - } -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2SettingsFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2SettingsFrameDecoderTest.java deleted file mode 100644 index 073464e..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2SettingsFrameDecoderTest.java +++ /dev/null
@@ -1,74 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2SettingsFrameDecoderTest { - - @Test - public void checkRstStream() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x06, /*length*/ - 0x04, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - 0x00, 0x01, /*ID*/ - 0x01, 0x02, 0x03, 0x04, /*value*/}); - Http2SettingsFrame frame = (Http2SettingsFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(6, frame.getLength()); - assertEquals(4, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(1, frame.getSettings().size()); - Http2Setting setting = frame.getSettings().iterator().next(); - assertEquals(1, setting.getID()); - assertEquals(0x01020304L, setting.getValue()); - } - - @Test - public void checkRstStreamHighestID() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x06, /*length*/ - 0x04, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - (byte) 0xFF, (byte) 0xFF, /*ID*/ - 0x01, 0x02, 0x03, 0x04, /*value*/}); - Http2SettingsFrame frame = (Http2SettingsFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(6, frame.getLength()); - assertEquals(4, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(1, frame.getSettings().size()); - Http2Setting setting = frame.getSettings().iterator().next(); - assertEquals(0x00FFFF, setting.getID()); - assertEquals(0x01020304L, setting.getValue()); - } - - @Test - public void checkRstStreamHighestValue() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x06, /*length*/ - 0x04, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - 0x00, 0x01, /*ID*/ - (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, /*value*/}); - Http2SettingsFrame frame = (Http2SettingsFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(6, frame.getLength()); - assertEquals(4, frame.getType()); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(1, frame.getSettings().size()); - Http2Setting setting = frame.getSettings().iterator().next(); - assertEquals(1, setting.getID()); - assertEquals(0xFFFFFFFFL, setting.getValue()); - } -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Htp2UnknownFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Htp2UnknownFrameDecoderTest.java deleted file mode 100644 index ffc6149..0000000 --- a/http2/src/test/java/org/apache/mina/http2/api/Htp2UnknownFrameDecoderTest.java +++ /dev/null
@@ -1,47 +0,0 @@ -package org.apache.mina.http2.api; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.nio.ByteBuffer; - -import org.apache.mina.http2.impl.Http2Connection; -import org.junit.Test; - -public class Htp2UnknownFrameDecoderTest { - - @Test - public void checkUnknownFrame() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x02, /*length*/ - (byte) 0x00FF, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20, /*streamID*/ - 0x0E, 0x18}); - Http2UnknownFrame frame = (Http2UnknownFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(2, frame.getLength()); - assertEquals(255, frame.getType() & 0x00FF); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(2, frame.getPayload().length); - assertArrayEquals(new byte[] {0x0E, 0x18}, frame.getPayload()); - } - - @Test - public void checkUnknownFrameWithoutPayload() { - Http2Connection connection = new Http2Connection(); - ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x00, 0x00, 0x00, /*length*/ - (byte) 0x00FF, /*type*/ - 0x00, /*flags*/ - 0x00, 0x00, 0x00, 0x20 /*streamID*/}); - Http2UnknownFrame frame = (Http2UnknownFrame) connection.decode(buffer); - assertNotNull(frame); - assertEquals(0, frame.getLength()); - assertEquals(255, frame.getType() & 0x00FF); - assertEquals(0x00, frame.getFlags()); - assertEquals(32, frame.getStreamID()); - assertEquals(0, frame.getPayload().length); - } - -}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2ContinuationFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2ContinuationFrameTest.java new file mode 100644 index 0000000..0c0329f --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2ContinuationFrameTest.java
@@ -0,0 +1,77 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2ContinuationFrameTest extends Http2Test { + + @Test + public void decodeNoHeaderFragment() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.CONTINUATION_NO_HEADER_FRAGMENT_BUFFER); + Http2ContinuationFrame frame = (Http2ContinuationFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(0, frame.getLength()); + assertEquals(9, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(0, frame.getHeaderBlockFragment().length); + } + + @Test + public void encodeNoHeaderFragment() { + Http2ContinuationFrame frame = TestMessages.CONTINUATION_NO_HEADER_FRAGMENT_FRAME; + assertArrayEquals(TestMessages.CONTINUATION_NO_HEADER_FRAGMENT_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeHeaderFragment() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.CONTINUATION_HEADER_FRAGMENT_BUFFER); + Http2ContinuationFrame frame = (Http2ContinuationFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(10, frame.getLength()); + assertEquals(9, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(10, frame.getHeaderBlockFragment().length); + assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getHeaderBlockFragment()); + } + + @Test + public void encodeHeaderFragment() { + Http2ContinuationFrame frame = TestMessages.CONTINUATION_HEADER_FRAGMENT_FRAME; + assertArrayEquals(TestMessages.CONTINUATION_HEADER_FRAGMENT_BUFFER, toByteArray(frame.toBuffer())); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2DataFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2DataFrameTest.java new file mode 100644 index 0000000..5c7ff95 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2DataFrameTest.java
@@ -0,0 +1,122 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2DataFrameTest extends Http2Test { + + @Test + public void decodeNoPayloadNoPadding() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_NO_PAYLOAD_NO_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(0, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(0, frame.getData().length); + assertEquals(0, frame.getPadding().length); + } + + @Test + public void encodeNoPayloadNoPadding() { + Http2DataFrame frame = TestMessages.DATA_NO_PAYLOAD_NO_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_NO_PAYLOAD_NO_PADDING_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodePayloadNoPadding() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_PAYLOAD_NO_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(10, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(10, frame.getData().length); + assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getData()); + assertEquals(0, frame.getPadding().length); + } + + @Test + public void encodePayloadNoPadding() { + Http2DataFrame frame = TestMessages.DATA_PAYLOAD_NO_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_PAYLOAD_NO_PADDING_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeNoPayloadPadding() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_NO_PAYLOAD_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(3, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(0,frame.getData().length); + assertEquals(2, frame.getPadding().length); + assertArrayEquals(new byte[] {0x0E, 0x28}, frame.getPadding()); + } + + @Test + public void encodeNoPayloadPadding() { + Http2DataFrame frame = TestMessages.DATA_NO_PAYLOAD_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_NO_PAYLOAD_PADDING_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodePayloadPadding() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_PAYLOAD_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(13, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(10, frame.getData().length); + assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getData()); + assertEquals(2, frame.getPadding().length); + assertArrayEquals(new byte[] {0x0E, 0x28}, frame.getPadding()); + } + + @Test + public void encodePayloadPadding() { + Http2DataFrame frame = TestMessages.DATA_PAYLOAD_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_PAYLOAD_PADDING_BUFFER, toByteArray(frame.toBuffer())); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2GoAwayFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2GoAwayFrameTest.java new file mode 100644 index 0000000..1921423 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2GoAwayFrameTest.java
@@ -0,0 +1,134 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2GoAwayFrameTest extends Http2Test { + + + @Test + public void decodeNoAdditionalData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(256, frame.getLastStreamID()); + assertEquals(0x010203, frame.getErrorCode()); + } + + @Test + public void encodeWNoAdditionalData() { + Http2GoAwayFrame frame = TestMessages.GOAWAY_NO_DATA_FRAME; + assertArrayEquals(TestMessages.GOAWAY_NO_DATA_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeHighestLastStreamIDNoAdditionalData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(0x7FFFFFFF, frame.getLastStreamID()); + assertEquals(0x010203, frame.getErrorCode()); + } + + @Test + public void encodeHighestLastStreamIDWNoAdditionalData() { + Http2GoAwayFrame frame = TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_FRAME; + assertArrayEquals(TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeHighestLastStreamIDReservedBitSetNoAdditionalData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_RESERVED_BIT_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(0x7FFFFFFF, frame.getLastStreamID()); + assertEquals(0x010203, frame.getErrorCode()); + } + + @Test + public void decodeHighestErrorCodeNoAdditionalData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(0x7FFFFFFF, frame.getLastStreamID()); + assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); + } + + @Test + public void encodeHighestErrorCodeNoAdditionalData() { + Http2GoAwayFrame frame = TestMessages.GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_FRAME; + assertArrayEquals(TestMessages.GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeAdditionalData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_DATA_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(9, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(256, frame.getLastStreamID()); + assertEquals(0x00010203, frame.getErrorCode()); + assertArrayEquals(new byte[] {0x01}, frame.getData()); + } + + @Test + public void encodeAdditionalData() { + Http2GoAwayFrame frame = TestMessages.GOAWAY_DATA_FRAME; + assertArrayEquals(TestMessages.GOAWAY_DATA_BUFFER, toByteArray(frame.toBuffer())); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2HeadersFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2HeadersFrameTest.java new file mode 100644 index 0000000..a108474 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2HeadersFrameTest.java
@@ -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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2HeadersFrameTest extends Http2Test { + + @Test + public void decodeNoPaddingNoPriority() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.HEADERS_NO_PADDING_NO_PRIORITY_BUFFER); + Http2HeadersFrame frame = (Http2HeadersFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(1, frame.getLength()); + assertEquals(1, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + } + + @Test + public void encodeNoPaddingNoPriority() { + Http2HeadersFrame frame = TestMessages.HEADERS_NO_PADDING_NO_PRIORITY_FRAME; + assertArrayEquals(TestMessages.HEADERS_NO_PADDING_NO_PRIORITY_BUFFER, toByteArray(frame.toBuffer())); + } + + + @Test + public void decodePaddingPriority() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.HEADERS_PADDING_PRIORITY_BUFFER); + Http2HeadersFrame frame = (Http2HeadersFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(23, frame.getLength()); + assertEquals(1, frame.getType()); + assertEquals(0x28, frame.getFlags()); + assertEquals(3, frame.getStreamID()); + assertEquals(10, frame.getWeight()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + assertEquals(16, frame.getPadding().length); + assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); + } + + @Test + public void encodePaddingPriority() { + Http2HeadersFrame frame = TestMessages.HEADERS_PADDING_PRIORITY_FRAME; + assertArrayEquals(TestMessages.HEADERS_PADDING_PRIORITY_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodePaddingNoPriority() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.HEADERS_PADDING_NO_PRIORITY_BUFFER); + Http2HeadersFrame frame = (Http2HeadersFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(18, frame.getLength()); + assertEquals(1, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(3, frame.getStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + assertEquals(16, frame.getPadding().length); + assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); + } + + @Test + public void encodePaddingNoPriority() { + Http2HeadersFrame frame = TestMessages.HEADERS_PADDING_NO_PRIORITY_FRAME; + assertArrayEquals(TestMessages.HEADERS_PADDING_NO_PRIORITY_BUFFER, toByteArray(frame.toBuffer())); + } + +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2PingFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2PingFrameTest.java new file mode 100644 index 0000000..12d3283 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2PingFrameTest.java
@@ -0,0 +1,95 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2PingFrameTest extends Http2Test { + + @Test + public void decode() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PING_STANDARD_BUFFER); + Http2PingFrame frame = (Http2PingFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(6, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertArrayEquals(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, frame.getData()); + } + + @Test + public void encode() { + Http2PingFrame frame = TestMessages.PING_STANDARD_FRAME; + assertArrayEquals(TestMessages.PING_STANDARD_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeExtraData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PING_EXTRA_DATA_BUFFER); + Http2PingFrame frame = (Http2PingFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(9, frame.getLength()); + assertEquals(6, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertArrayEquals(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, frame.getData()); + } + + @Test + public void encodeExtraData() { + Http2PingFrame frame = TestMessages.PING_EXTRA_DATA_FRAME; + assertArrayEquals(TestMessages.PING_EXTRA_DATA_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeNotEnoughData() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PING_NO_ENOUGH_DATA_BUFFER); + Http2PingFrame frame = (Http2PingFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(1, frame.getLength()); + assertEquals(6, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertArrayEquals(new byte[] {0x00}, frame.getData()); + } + + @Test + public void encodeNotEnoughData() { + Http2PingFrame frame = TestMessages.PING_NO_ENOUGH_DATA_FRAME; + assertArrayEquals(TestMessages.PING_NO_ENOUGH_DATA_BUFFER, toByteArray(frame.toBuffer())); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2PriorityFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2PriorityFrameTest.java new file mode 100644 index 0000000..397ba36 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2PriorityFrameTest.java
@@ -0,0 +1,82 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2PriorityFrameTest extends Http2Test { + + @Test + public void decodeNoExclusive() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PRIORITY_NO_EXCLUSIVE_MODE_BUFFER); + Http2PriorityFrame frame = (Http2PriorityFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(5, frame.getLength()); + assertEquals(2, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getStreamDependencyID()); + assertFalse(frame.getExclusiveMode()); + assertEquals(2, frame.getWeight()); + } + + @Test + public void encodeNoExclusive() { + Http2PriorityFrame frame = TestMessages.PRIORITY_NO_EXCLUSIVE_MODE_FRAME; + assertArrayEquals(TestMessages.PRIORITY_NO_EXCLUSIVE_MODE_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeExclusive() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PRIORITY_EXCLUSIVE_MODE_BUFFER); + Http2PriorityFrame frame = (Http2PriorityFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(5, frame.getLength()); + assertEquals(2, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getStreamDependencyID()); + assertTrue(frame.getExclusiveMode()); + assertEquals(2, frame.getWeight()); + } + + @Test + public void encodeExclusive() { + Http2PriorityFrame frame = TestMessages.PRIORITY_EXCLUSIVE_MODE_FRAME; + assertArrayEquals(TestMessages.PRIORITY_EXCLUSIVE_MODE_BUFFER, toByteArray(frame.toBuffer())); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2PushPromiseFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2PushPromiseFrameTest.java new file mode 100644 index 0000000..612c788 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2PushPromiseFrameTest.java
@@ -0,0 +1,83 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2PushPromiseFrameTest extends Http2Test { + + @Test + public void decodeNoPadding() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PUSH_PROMISE_NO_PADDING_BUFFER); + Http2PushPromiseFrame frame = (Http2PushPromiseFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(5, frame.getLength()); + assertEquals(5, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(256, frame.getPromisedStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + } + + @Test + public void encodeNoPadding() { + Http2PushPromiseFrame frame = TestMessages.PUSH_PROMISE_NO_PADDING_FRAME; + assertArrayEquals(TestMessages.PUSH_PROMISE_NO_PADDING_BUFFER, toByteArray(frame.toBuffer())); + } + + + @Test + public void decodePadding() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PUSH_PROMISE_PADDING_BUFFER); + Http2PushPromiseFrame frame = (Http2PushPromiseFrame) connection.decode(buffer); + assertEquals(22, frame.getLength()); + assertEquals(5, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(3, frame.getStreamID()); + assertEquals(20, frame.getPromisedStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + assertEquals(16, frame.getPadding().length); + assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); + } + + @Test + public void encodePadding() { + Http2PushPromiseFrame frame = TestMessages.PUSH_PROMISE_PADDING_FRAME; + assertArrayEquals(TestMessages.PUSH_PROMISE_PADDING_BUFFER, toByteArray(frame.toBuffer())); + } + +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2RstStreamFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2RstStreamFrameTest.java new file mode 100644 index 0000000..c8b42d5 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2RstStreamFrameTest.java
@@ -0,0 +1,103 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.api.Http2RstStreamFrame.Http2RstStreamFrameBuilder; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2RstStreamFrameTest extends Http2Test { + + @Test + public void decodeNoExtraPayload() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_NO_EXTRA_PAYLOAD_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(4, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getErrorCode()); + } + + @Test + public void encodeNoExtraPayload() { + Http2RstStreamFrame frame = TestMessages.RST_STREAM_NO_EXTRA_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.RST_STREAM_NO_EXTRA_PAYLOAD_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeHighestValueNoExtraPayload() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(4, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); + } + + @Test + public void encodeHighestValueNoExtraPayload() { + Http2RstStreamFrame frame = TestMessages.RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeExtraPayload() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_EXTRA_PAYLOAD_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getErrorCode()); + } + + @Test + public void decodeHighestValueExtraPayload() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_EXTRA_PAYLOAD_HIGHEST_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2SettingsFrameDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2SettingsFrameDecoderTest.java new file mode 100644 index 0000000..3681978 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2SettingsFrameDecoderTest.java
@@ -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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2SettingsFrameDecoderTest extends Http2Test { + + @Test + public void decode() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.SETTINGS_DEFAULT_BUFFER); + Http2SettingsFrame frame = (Http2SettingsFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(4, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(1, frame.getSettings().size()); + Http2Setting setting = frame.getSettings().iterator().next(); + assertEquals(1, setting.getID()); + assertEquals(0x01020304L, setting.getValue()); + } + + @Test + public void encode() { + Http2SettingsFrame frame = TestMessages.SETTINGS_DEFAULT_FRAME; + assertArrayEquals(TestMessages.SETTINGS_DEFAULT_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeHighestID() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.SETTINGS_HIGHEST_ID_BUFFER); + Http2SettingsFrame frame = (Http2SettingsFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(4, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(1, frame.getSettings().size()); + Http2Setting setting = frame.getSettings().iterator().next(); + assertEquals(0x00FFFF, setting.getID()); + assertEquals(0x01020304L, setting.getValue()); + } + + @Test + public void encodeHighestID() { + Http2SettingsFrame frame = TestMessages.SETTINGS_HIGHEST_ID_FRAME; + assertArrayEquals(TestMessages.SETTINGS_HIGHEST_ID_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeHighestValue() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.SETTINGS_HIGHEST_VALUE_BUFFER); + Http2SettingsFrame frame = (Http2SettingsFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(4, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(1, frame.getSettings().size()); + Http2Setting setting = frame.getSettings().iterator().next(); + assertEquals(1, setting.getID()); + assertEquals(0xFFFFFFFFL, setting.getValue()); + } + + @Test + public void encodeHighestValue() { + Http2SettingsFrame frame = TestMessages.SETTINGS_HIGHEST_VALUE_FRAME; + assertArrayEquals(TestMessages.SETTINGS_HIGHEST_VALUE_BUFFER, toByteArray(frame.toBuffer())); + } + +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2UnknownFrameTest.java b/http2/src/test/java/org/apache/mina/http2/api/Http2UnknownFrameTest.java new file mode 100644 index 0000000..764e924 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/api/Http2UnknownFrameTest.java
@@ -0,0 +1,79 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ +public class Http2UnknownFrameTest extends Http2Test { + + @Test + public void decode() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.UNKNOWN_PAYLOAD_BUFFER); + Http2UnknownFrame frame = (Http2UnknownFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(2, frame.getLength()); + assertEquals(255, frame.getType() & 0x00FF); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(2, frame.getPayload().length); + assertArrayEquals(new byte[] {0x0E, 0x18}, frame.getPayload()); + } + + @Test + public void encode() { + Http2UnknownFrame frame = TestMessages.UNKNOWN_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.UNKNOWN_PAYLOAD_BUFFER, toByteArray(frame.toBuffer())); + } + + @Test + public void decodeWithoutPayload() { + Http2Connection connection = new Http2Connection(); + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.UNKNOWN_NO_PAYLOAD_BUFFER); + Http2UnknownFrame frame = (Http2UnknownFrame) connection.decode(buffer); + assertNotNull(frame); + assertEquals(0, frame.getLength()); + assertEquals(255, frame.getType() & 0x00FF); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(0, frame.getPayload().length); + } + + @Test + public void encodeWithoutPayload() { + Http2UnknownFrame frame = TestMessages.UNKNOWN_NO_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.UNKNOWN_NO_PAYLOAD_BUFFER, toByteArray(frame.toBuffer())); + } + + +}
diff --git a/http2/src/test/java/org/apache/mina/http2/codec/Http2ProtocolDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/codec/Http2ProtocolDecoderTest.java new file mode 100644 index 0000000..6a478dd --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/codec/Http2ProtocolDecoderTest.java
@@ -0,0 +1,458 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.codec; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.nio.ByteBuffer; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.api.Http2ContinuationFrame; +import org.apache.mina.http2.api.Http2DataFrame; +import org.apache.mina.http2.api.Http2Frame; +import org.apache.mina.http2.api.Http2GoAwayFrame; +import org.apache.mina.http2.api.Http2HeadersFrame; +import org.apache.mina.http2.api.Http2PingFrame; +import org.apache.mina.http2.api.Http2PriorityFrame; +import org.apache.mina.http2.api.Http2PushPromiseFrame; +import org.apache.mina.http2.api.Http2RstStreamFrame; +import org.apache.mina.http2.api.Http2Setting; +import org.apache.mina.http2.api.Http2SettingsFrame; +import org.apache.mina.http2.api.Http2UnknownFrame; +import org.apache.mina.http2.impl.Http2Connection; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ + +public class Http2ProtocolDecoderTest extends Http2Test { + + private Http2ProtocolDecoder decoder = new Http2ProtocolDecoder(); + private Http2Connection context = new Http2Connection(); + + @Test + public void continuationNoHeaderBlock() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.CONTINUATION_NO_HEADER_FRAGMENT_BUFFER); + Http2ContinuationFrame frame = (Http2ContinuationFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(0, frame.getLength()); + assertEquals(9, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(0, frame.getHeaderBlockFragment().length); + } + + @Test + public void continuationHeaderBlock() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.CONTINUATION_HEADER_FRAGMENT_BUFFER); + Http2ContinuationFrame frame = (Http2ContinuationFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(10, frame.getLength()); + assertEquals(9, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(10, frame.getHeaderBlockFragment().length); + assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getHeaderBlockFragment()); + } + + @Test + public void dataNoPayloadNoPadding() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_NO_PAYLOAD_NO_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(0, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(0, frame.getData().length); + assertEquals(0, frame.getPadding().length); + } + + @Test + public void dataPayloadNoPadding() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_PAYLOAD_NO_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(10, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(10, frame.getData().length); + assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getData()); + assertEquals(0, frame.getPadding().length); + } + + @Test + public void dataNoPayloadPadding() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_NO_PAYLOAD_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(3, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(0,frame.getData().length); + assertEquals(2, frame.getPadding().length); + assertArrayEquals(new byte[] {0x0E, 0x28}, frame.getPadding()); + } + + @Test + public void dataPayloadPadding() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.DATA_PAYLOAD_PADDING_BUFFER); + Http2DataFrame frame = (Http2DataFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(13, frame.getLength()); + assertEquals(0, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(50, frame.getStreamID()); + assertEquals(10, frame.getData().length); + assertArrayEquals(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, frame.getData()); + assertEquals(2, frame.getPadding().length); + assertArrayEquals(new byte[] {0x0E, 0x28}, frame.getPadding()); + } + + @Test + public void goAwayNoAdditionalData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(256, frame.getLastStreamID()); + assertEquals(0x010203, frame.getErrorCode()); + } + + @Test + public void goAwayHighestLastStreamIDNoAdditionalData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(0x7FFFFFFF, frame.getLastStreamID()); + assertEquals(0x010203, frame.getErrorCode()); + } + + @Test + public void goAwayHighestLastStreamIDReservedBitSetNoAdditionalData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_RESERVED_BIT_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(0x7FFFFFFF, frame.getLastStreamID()); + assertEquals(0x010203, frame.getErrorCode()); + } + + @Test + public void goAwayHighestErrorCodeNoAdditionalData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(0x7FFFFFFF, frame.getLastStreamID()); + assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); + } + + @Test + public void goAwayAdditionalData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.GOAWAY_DATA_BUFFER); + Http2GoAwayFrame frame = (Http2GoAwayFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(9, frame.getLength()); + assertEquals(7, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(256, frame.getLastStreamID()); + assertEquals(0x00010203, frame.getErrorCode()); + assertArrayEquals(new byte[] {0x01}, frame.getData()); + } + + @Test + public void headersNoPaddingNoPriority() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.HEADERS_NO_PADDING_NO_PRIORITY_BUFFER); + Http2HeadersFrame frame = (Http2HeadersFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(1, frame.getLength()); + assertEquals(1, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + } + + @Test + public void headersPaddingPriority() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.HEADERS_PADDING_PRIORITY_BUFFER); + Http2HeadersFrame frame = (Http2HeadersFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(23, frame.getLength()); + assertEquals(1, frame.getType()); + assertEquals(0x28, frame.getFlags()); + assertEquals(3, frame.getStreamID()); + assertEquals(10, frame.getWeight()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + assertEquals(16, frame.getPadding().length); + assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); + } + + @Test + public void headersPaddingNoPriority() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.HEADERS_PADDING_NO_PRIORITY_BUFFER); + Http2HeadersFrame frame = (Http2HeadersFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(18, frame.getLength()); + assertEquals(1, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(3, frame.getStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + assertEquals(16, frame.getPadding().length); + assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); + } + + @Test + public void ping() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PING_STANDARD_BUFFER); + Http2PingFrame frame = (Http2PingFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(8, frame.getLength()); + assertEquals(6, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertArrayEquals(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, frame.getData()); + } + + @Test + public void pingExtraData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PING_EXTRA_DATA_BUFFER); + Http2PingFrame frame = (Http2PingFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(9, frame.getLength()); + assertEquals(6, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertArrayEquals(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, frame.getData()); + } + + @Test + public void pingNotEnoughData() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PING_NO_ENOUGH_DATA_BUFFER); + Http2PingFrame frame = (Http2PingFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(1, frame.getLength()); + assertEquals(6, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertArrayEquals(new byte[] {0x00}, frame.getData()); + } + + @Test + public void priorityNoExclusive() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PRIORITY_NO_EXCLUSIVE_MODE_BUFFER); + Http2PriorityFrame frame = (Http2PriorityFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(5, frame.getLength()); + assertEquals(2, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getStreamDependencyID()); + assertFalse(frame.getExclusiveMode()); + assertEquals(2, frame.getWeight()); + } + + @Test + public void priorityExclusive() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PRIORITY_EXCLUSIVE_MODE_BUFFER); + Http2PriorityFrame frame = (Http2PriorityFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(5, frame.getLength()); + assertEquals(2, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getStreamDependencyID()); + assertTrue(frame.getExclusiveMode()); + assertEquals(2, frame.getWeight()); + } + + @Test + public void pushPromiseNoPadding() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PUSH_PROMISE_NO_PADDING_BUFFER); + Http2PushPromiseFrame frame = (Http2PushPromiseFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(5, frame.getLength()); + assertEquals(5, frame.getType()); + assertEquals(0, frame.getFlags()); + assertEquals(1, frame.getStreamID()); + assertEquals(256, frame.getPromisedStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + } + + @Test + public void pushPromisePadding() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.PUSH_PROMISE_PADDING_BUFFER); + Http2PushPromiseFrame frame = (Http2PushPromiseFrame) decoder.decode(buffer, context); + assertEquals(22, frame.getLength()); + assertEquals(5, frame.getType()); + assertEquals(0x08, frame.getFlags()); + assertEquals(3, frame.getStreamID()); + assertEquals(20, frame.getPromisedStreamID()); + assertEquals(1, frame.getHeaderBlockFragment().length); + assertEquals(0x0082, frame.getHeaderBlockFragment()[0] & 0x00FF); + assertEquals(16, frame.getPadding().length); + assertArrayEquals(new byte[] {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2E}, frame.getPadding()); + } + + @Test + public void rstStreamNoExtraPayload() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_NO_EXTRA_PAYLOAD_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(4, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getErrorCode()); + } + + @Test + public void rstStreamHighestValueNoExtraPayload() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(4, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); + } + + @Test + public void rstStreamExtraPayload() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_EXTRA_PAYLOAD_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(256, frame.getErrorCode()); + } + + @Test + public void rstStreamHighestValueExtraPayload() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.RST_STREAM_EXTRA_PAYLOAD_HIGHEST_BUFFER); + Http2RstStreamFrame frame = (Http2RstStreamFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(3, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(0x00FFFFFFFFL, frame.getErrorCode()); + } + + @Test + public void settings() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.SETTINGS_DEFAULT_BUFFER); + Http2SettingsFrame frame = (Http2SettingsFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(4, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(1, frame.getSettings().size()); + Http2Setting setting = frame.getSettings().iterator().next(); + assertEquals(1, setting.getID()); + assertEquals(0x01020304L, setting.getValue()); + } + + @Test + public void settingsHighestID() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.SETTINGS_HIGHEST_ID_BUFFER); + Http2SettingsFrame frame = (Http2SettingsFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(4, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(1, frame.getSettings().size()); + Http2Setting setting = frame.getSettings().iterator().next(); + assertEquals(0x00FFFF, setting.getID()); + assertEquals(0x01020304L, setting.getValue()); + } + + @Test + public void settingsHighestValue() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.SETTINGS_HIGHEST_VALUE_BUFFER); + Http2SettingsFrame frame = (Http2SettingsFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(6, frame.getLength()); + assertEquals(4, frame.getType()); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(1, frame.getSettings().size()); + Http2Setting setting = frame.getSettings().iterator().next(); + assertEquals(1, setting.getID()); + assertEquals(0xFFFFFFFFL, setting.getValue()); + } + + @Test + public void unknownFrame() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.UNKNOWN_PAYLOAD_BUFFER); + Http2UnknownFrame frame = (Http2UnknownFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(2, frame.getLength()); + assertEquals(255, frame.getType() & 0x00FF); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(2, frame.getPayload().length); + assertArrayEquals(new byte[] {0x0E, 0x18}, frame.getPayload()); + } + + @Test + public void unknownFrameNoPayload() { + ByteBuffer buffer = ByteBuffer.wrap(TestMessages.UNKNOWN_NO_PAYLOAD_BUFFER); + Http2UnknownFrame frame = (Http2UnknownFrame) decoder.decode(buffer, context); + assertNotNull(frame); + assertEquals(0, frame.getLength()); + assertEquals(255, frame.getType() & 0x00FF); + assertEquals(0x00, frame.getFlags()); + assertEquals(32, frame.getStreamID()); + assertEquals(0, frame.getPayload().length); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/codec/Http2ProtocolEncoderTest.java b/http2/src/test/java/org/apache/mina/http2/codec/Http2ProtocolEncoderTest.java new file mode 100644 index 0000000..ecea462 --- /dev/null +++ b/http2/src/test/java/org/apache/mina/http2/codec/Http2ProtocolEncoderTest.java
@@ -0,0 +1,200 @@ +/* + * 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. + * + */ +package org.apache.mina.http2.codec; + +import static org.junit.Assert.assertArrayEquals; + +import org.apache.mina.http2.Http2Test; +import org.apache.mina.http2.TestMessages; +import org.apache.mina.http2.api.Http2Frame; +import org.junit.Test; + +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ + +public class Http2ProtocolEncoderTest extends Http2Test { + + private Http2ProtocolEncoder encoder = new Http2ProtocolEncoder(); + + @Test + public void continuationNoHeaderBlock() { + Http2Frame frame = TestMessages.CONTINUATION_NO_HEADER_FRAGMENT_FRAME; + assertArrayEquals(TestMessages.CONTINUATION_NO_HEADER_FRAGMENT_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void continuationHeaderBlock() { + Http2Frame frame = TestMessages.CONTINUATION_HEADER_FRAGMENT_FRAME; + assertArrayEquals(TestMessages.CONTINUATION_HEADER_FRAGMENT_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + + @Test + public void dataNoPayloadNoPadding() { + Http2Frame frame = TestMessages.DATA_NO_PAYLOAD_NO_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_NO_PAYLOAD_NO_PADDING_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void dataPayloadNoPadding() { + Http2Frame frame = TestMessages.DATA_PAYLOAD_NO_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_PAYLOAD_NO_PADDING_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void dataNoPayloadPadding() { + Http2Frame frame = TestMessages.DATA_NO_PAYLOAD_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_NO_PAYLOAD_PADDING_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void dataPayloadPadding() { + Http2Frame frame = TestMessages.DATA_PAYLOAD_PADDING_FRAME; + assertArrayEquals(TestMessages.DATA_PAYLOAD_PADDING_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void goAwayNoAdditionalData() { + Http2Frame frame = TestMessages.GOAWAY_NO_DATA_FRAME; + assertArrayEquals(TestMessages.GOAWAY_NO_DATA_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void goAwayHighestLastStreamIDNoAdditionalData() { + Http2Frame frame = TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_FRAME; + assertArrayEquals(TestMessages.GOAWAY_NO_DATA_HIGHEST_STREAMID_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void goAwayHighestErrorCodeNoAdditionalData() { + Http2Frame frame = TestMessages.GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_FRAME; + assertArrayEquals(TestMessages.GOAWAY_NO_DATA_HIGHEST_ERROR_CODE_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void goAwayAdditionalData() { + Http2Frame frame = TestMessages.GOAWAY_DATA_FRAME; + assertArrayEquals(TestMessages.GOAWAY_DATA_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void headersNoPaddingNoPriority() { + Http2Frame frame = TestMessages.HEADERS_NO_PADDING_NO_PRIORITY_FRAME; + assertArrayEquals(TestMessages.HEADERS_NO_PADDING_NO_PRIORITY_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void headersPaddingPriority() { + Http2Frame frame = TestMessages.HEADERS_PADDING_PRIORITY_FRAME; + assertArrayEquals(TestMessages.HEADERS_PADDING_PRIORITY_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void headersPaddingNoPriority() { + Http2Frame frame = TestMessages.HEADERS_PADDING_NO_PRIORITY_FRAME; + assertArrayEquals(TestMessages.HEADERS_PADDING_NO_PRIORITY_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void ping() { + Http2Frame frame = TestMessages.PING_STANDARD_FRAME; + assertArrayEquals(TestMessages.PING_STANDARD_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void pingExtraData() { + Http2Frame frame = TestMessages.PING_EXTRA_DATA_FRAME; + assertArrayEquals(TestMessages.PING_EXTRA_DATA_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void pingNotEnoughData() { + Http2Frame frame = TestMessages.PING_NO_ENOUGH_DATA_FRAME; + assertArrayEquals(TestMessages.PING_NO_ENOUGH_DATA_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void priorityNoExclusive() { + Http2Frame frame = TestMessages.PRIORITY_NO_EXCLUSIVE_MODE_FRAME; + assertArrayEquals(TestMessages.PRIORITY_NO_EXCLUSIVE_MODE_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void priorityExclusive() { + Http2Frame frame = TestMessages.PRIORITY_EXCLUSIVE_MODE_FRAME; + assertArrayEquals(TestMessages.PRIORITY_EXCLUSIVE_MODE_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void pushPromiseNoPadding() { + Http2Frame frame = TestMessages.PUSH_PROMISE_NO_PADDING_FRAME; + assertArrayEquals(TestMessages.PUSH_PROMISE_NO_PADDING_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void pushPromisePadding() { + Http2Frame frame = TestMessages.PUSH_PROMISE_PADDING_FRAME; + assertArrayEquals(TestMessages.PUSH_PROMISE_PADDING_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void rstStreamNoExtraPayload() { + Http2Frame frame = TestMessages.RST_STREAM_NO_EXTRA_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.RST_STREAM_NO_EXTRA_PAYLOAD_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void rstStreamHighestValueNoExtraPayload() { + Http2Frame frame = TestMessages.RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.RST_STREAM_HIGHEST_VALUE_NO_EXTRA_PAYLOAD_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void settings() { + Http2Frame frame = TestMessages.SETTINGS_DEFAULT_FRAME; + assertArrayEquals(TestMessages.SETTINGS_DEFAULT_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void settingsHighestID() { + Http2Frame frame = TestMessages.SETTINGS_HIGHEST_ID_FRAME; + assertArrayEquals(TestMessages.SETTINGS_HIGHEST_ID_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void settingsHighestValue() { + Http2Frame frame = TestMessages.SETTINGS_HIGHEST_VALUE_FRAME; + assertArrayEquals(TestMessages.SETTINGS_HIGHEST_VALUE_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void unknownFrame() { + Http2Frame frame = TestMessages.UNKNOWN_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.UNKNOWN_PAYLOAD_BUFFER, toByteArray(encoder.encode(frame, null))); + } + + @Test + public void unknownFrameNoPayload() { + Http2Frame frame = TestMessages.UNKNOWN_NO_PAYLOAD_FRAME; + assertArrayEquals(TestMessages.UNKNOWN_NO_PAYLOAD_BUFFER, toByteArray(encoder.encode(frame, null))); + } +}
diff --git a/http2/src/test/java/org/apache/mina/http2/api/BytePartialDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/impl/BytePartialDecoderTest.java similarity index 64% rename from http2/src/test/java/org/apache/mina/http2/api/BytePartialDecoderTest.java rename to http2/src/test/java/org/apache/mina/http2/impl/BytePartialDecoderTest.java index 7d09d11..6a30567 100644 --- a/http2/src/test/java/org/apache/mina/http2/api/BytePartialDecoderTest.java +++ b/http2/src/test/java/org/apache/mina/http2/impl/BytePartialDecoderTest.java
@@ -1,4 +1,23 @@ -package org.apache.mina.http2.api; +/* + * 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. + * + */ +package org.apache.mina.http2.impl; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -7,8 +26,13 @@ import java.nio.ByteBuffer; +import org.apache.mina.http2.impl.BytePartialDecoder; import org.junit.Test; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class BytePartialDecoderTest { private static final byte[] SAMPLE_VALUE_1 = new byte[] {0x74, 0x18, 0x4F, 0x68};
diff --git a/http2/src/test/java/org/apache/mina/http2/api/Http2FrameHeaderPartialDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/impl/Http2FrameHeaderPartialDecoderTest.java similarity index 70% rename from http2/src/test/java/org/apache/mina/http2/api/Http2FrameHeaderPartialDecoderTest.java rename to http2/src/test/java/org/apache/mina/http2/impl/Http2FrameHeaderPartialDecoderTest.java index af684b4..dc12569 100644 --- a/http2/src/test/java/org/apache/mina/http2/api/Http2FrameHeaderPartialDecoderTest.java +++ b/http2/src/test/java/org/apache/mina/http2/impl/Http2FrameHeaderPartialDecoderTest.java
@@ -1,4 +1,23 @@ -package org.apache.mina.http2.api; +/* + * 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. + * + */ +package org.apache.mina.http2.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -6,9 +25,14 @@ import java.nio.ByteBuffer; -import org.apache.mina.http2.api.Http2FrameHeadePartialDecoder.Http2FrameHeader; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder; +import org.apache.mina.http2.impl.Http2FrameHeadePartialDecoder.Http2FrameHeader; import org.junit.Test; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class Http2FrameHeaderPartialDecoderTest { @Test
diff --git a/http2/src/test/java/org/apache/mina/http2/api/IntPartialDecoderTest.java b/http2/src/test/java/org/apache/mina/http2/impl/IntPartialDecoderTest.java similarity index 60% rename from http2/src/test/java/org/apache/mina/http2/api/IntPartialDecoderTest.java rename to http2/src/test/java/org/apache/mina/http2/impl/IntPartialDecoderTest.java index 78c9125..674a76e 100644 --- a/http2/src/test/java/org/apache/mina/http2/api/IntPartialDecoderTest.java +++ b/http2/src/test/java/org/apache/mina/http2/impl/IntPartialDecoderTest.java
@@ -1,4 +1,23 @@ -package org.apache.mina.http2.api; +/* + * 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. + * + */ +package org.apache.mina.http2.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -6,8 +25,13 @@ import java.nio.ByteBuffer; +import org.apache.mina.http2.impl.IntPartialDecoder; import org.junit.Test; +/** + * + * @author <a href="http://mina.apache.org">Apache MINA Project</a> + */ public class IntPartialDecoderTest { @Test
diff --git a/pom.xml b/pom.xml index 97a960e..cc851e7 100644 --- a/pom.xml +++ b/pom.xml
@@ -111,6 +111,7 @@ <module>core</module> <module>codec</module> <module>http</module> + <module>http2</module> <module>examples</module> <module>coap</module> <module>thrift</module>