diff --git a/example/src/main/java/io/netty/example/http2/Http2ExampleUtil.java b/example/src/main/java/io/netty/example/http2/Http2ExampleUtil.java index 98cf022db6..e749ef1ea2 100644 --- a/example/src/main/java/io/netty/example/http2/Http2ExampleUtil.java +++ b/example/src/main/java/io/netty/example/http2/Http2ExampleUtil.java @@ -14,6 +14,15 @@ */ package io.netty.example.http2; +import static io.netty.util.internal.ObjectUtil.checkNotNull; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.http.QueryStringDecoder; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + /** * Utility methods used by the example client and server. */ @@ -24,5 +33,51 @@ public final class Http2ExampleUtil { */ public static final String UPGRADE_RESPONSE_HEADER = "Http-To-Http2-Upgrade"; + /** + * Size of the block to be read from the input stream. + */ + private static final int BLOCK_SIZE = 1024; + private Http2ExampleUtil() { } + + /** + * @param string the string to be converted to an integer. + * @param defaultValue the default value + * @return the integer value of a string or the default value, if the string is either null or empty. + */ + public static int toInt(String string, int defaultValue) { + if (string != null && !string.isEmpty()) { + return Integer.valueOf(string); + } + return defaultValue; + } + + /** + * Reads an InputStream into a byte array. + * @param input the InputStream. + * @return a byte array representation of the InputStream. + * @throws IOException if an I/O exception of some sort happens while reading the InputStream. + */ + public static ByteBuf toByteBuf(InputStream input) throws IOException { + ByteBuf buf = Unpooled.buffer(); + int n = 0; + do { + n = buf.writeBytes(input, BLOCK_SIZE); + } while (n > 0); + return buf; + } + + /** + * @param query the decoder of query string + * @param key the key to lookup + * @return the first occurrence of that key in the string parameters + */ + public static String firstValue(QueryStringDecoder query, String key) { + checkNotNull(query, "Query can't be null!"); + List values = query.parameters().get(key); + if (values == null || values.isEmpty()) { + return null; + } + return values.get(0); + } } diff --git a/example/src/main/java/io/netty/example/http2/client/Http2Client.java b/example/src/main/java/io/netty/example/http2/helloworld/client/Http2Client.java similarity index 99% rename from example/src/main/java/io/netty/example/http2/client/Http2Client.java rename to example/src/main/java/io/netty/example/http2/helloworld/client/Http2Client.java index 84fa7e7739..35c9dd5158 100644 --- a/example/src/main/java/io/netty/example/http2/client/Http2Client.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/client/Http2Client.java @@ -12,7 +12,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package io.netty.example.http2.client; +package io.netty.example.http2.helloworld.client; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; diff --git a/example/src/main/java/io/netty/example/http2/client/Http2ClientInitializer.java b/example/src/main/java/io/netty/example/http2/helloworld/client/Http2ClientInitializer.java similarity index 99% rename from example/src/main/java/io/netty/example/http2/client/Http2ClientInitializer.java rename to example/src/main/java/io/netty/example/http2/helloworld/client/Http2ClientInitializer.java index 0e2b45db03..2504966f10 100644 --- a/example/src/main/java/io/netty/example/http2/client/Http2ClientInitializer.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/client/Http2ClientInitializer.java @@ -12,7 +12,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package io.netty.example.http2.client; +package io.netty.example.http2.helloworld.client; import static io.netty.handler.logging.LogLevel.INFO; diff --git a/example/src/main/java/io/netty/example/http2/client/Http2SettingsHandler.java b/example/src/main/java/io/netty/example/http2/helloworld/client/Http2SettingsHandler.java similarity index 97% rename from example/src/main/java/io/netty/example/http2/client/Http2SettingsHandler.java rename to example/src/main/java/io/netty/example/http2/helloworld/client/Http2SettingsHandler.java index 480133c8ce..0867cb2c83 100644 --- a/example/src/main/java/io/netty/example/http2/client/Http2SettingsHandler.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/client/Http2SettingsHandler.java @@ -12,7 +12,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package io.netty.example.http2.client; +package io.netty.example.http2.helloworld.client; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; diff --git a/example/src/main/java/io/netty/example/http2/client/HttpResponseHandler.java b/example/src/main/java/io/netty/example/http2/helloworld/client/HttpResponseHandler.java similarity index 98% rename from example/src/main/java/io/netty/example/http2/client/HttpResponseHandler.java rename to example/src/main/java/io/netty/example/http2/helloworld/client/HttpResponseHandler.java index c5f51ec24c..891f47dbe1 100644 --- a/example/src/main/java/io/netty/example/http2/client/HttpResponseHandler.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/client/HttpResponseHandler.java @@ -12,7 +12,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package io.netty.example.http2.client; +package io.netty.example.http2.helloworld.client; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; diff --git a/example/src/main/java/io/netty/example/http2/server/HelloWorldHttp1Handler.java b/example/src/main/java/io/netty/example/http2/helloworld/server/HelloWorldHttp1Handler.java similarity index 98% rename from example/src/main/java/io/netty/example/http2/server/HelloWorldHttp1Handler.java rename to example/src/main/java/io/netty/example/http2/helloworld/server/HelloWorldHttp1Handler.java index b43f851d6c..c790399f0f 100644 --- a/example/src/main/java/io/netty/example/http2/server/HelloWorldHttp1Handler.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/server/HelloWorldHttp1Handler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.example.http2.server; +package io.netty.example.http2.helloworld.server; import static io.netty.util.internal.ObjectUtil.checkNotNull; import io.netty.buffer.ByteBuf; diff --git a/example/src/main/java/io/netty/example/http2/server/HelloWorldHttp2Handler.java b/example/src/main/java/io/netty/example/http2/helloworld/server/HelloWorldHttp2Handler.java similarity index 99% rename from example/src/main/java/io/netty/example/http2/server/HelloWorldHttp2Handler.java rename to example/src/main/java/io/netty/example/http2/helloworld/server/HelloWorldHttp2Handler.java index f0ae73fd6e..d6c14d0a04 100644 --- a/example/src/main/java/io/netty/example/http2/server/HelloWorldHttp2Handler.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/server/HelloWorldHttp2Handler.java @@ -13,7 +13,7 @@ * the License. */ -package io.netty.example.http2.server; +package io.netty.example.http2.helloworld.server; import static io.netty.buffer.Unpooled.copiedBuffer; import static io.netty.buffer.Unpooled.unreleasableBuffer; diff --git a/example/src/main/java/io/netty/example/http2/server/Http2OrHttpHandler.java b/example/src/main/java/io/netty/example/http2/helloworld/server/Http2OrHttpHandler.java similarity index 97% rename from example/src/main/java/io/netty/example/http2/server/Http2OrHttpHandler.java rename to example/src/main/java/io/netty/example/http2/helloworld/server/Http2OrHttpHandler.java index e07dec2486..96af05b560 100644 --- a/example/src/main/java/io/netty/example/http2/server/Http2OrHttpHandler.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/server/Http2OrHttpHandler.java @@ -12,7 +12,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package io.netty.example.http2.server; +package io.netty.example.http2.helloworld.server; import io.netty.channel.ChannelHandler; import io.netty.handler.codec.http2.Http2ConnectionHandler; diff --git a/example/src/main/java/io/netty/example/http2/server/Http2Server.java b/example/src/main/java/io/netty/example/http2/helloworld/server/Http2Server.java similarity index 93% rename from example/src/main/java/io/netty/example/http2/server/Http2Server.java rename to example/src/main/java/io/netty/example/http2/helloworld/server/Http2Server.java index 31f0a8b490..26a10ccb7a 100644 --- a/example/src/main/java/io/netty/example/http2/server/Http2Server.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/server/Http2Server.java @@ -14,7 +14,7 @@ * under the License. */ -package io.netty.example.http2.server; +package io.netty.example.http2.helloworld.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; @@ -71,12 +71,11 @@ public final class Http2Server { sslCtx = null; } // Configure the server. - EventLoopGroup bossGroup = new NioEventLoopGroup(1); - EventLoopGroup workerGroup = new NioEventLoopGroup(); + EventLoopGroup group = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.option(ChannelOption.SO_BACKLOG, 1024); - b.group(bossGroup, workerGroup) + b.group(group) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new Http2ServerInitializer(sslCtx)); @@ -88,8 +87,7 @@ public final class Http2Server { ch.closeFuture().sync(); } finally { - bossGroup.shutdownGracefully(); - workerGroup.shutdownGracefully(); + group.shutdownGracefully(); } } } diff --git a/example/src/main/java/io/netty/example/http2/server/Http2ServerInitializer.java b/example/src/main/java/io/netty/example/http2/helloworld/server/Http2ServerInitializer.java similarity index 98% rename from example/src/main/java/io/netty/example/http2/server/Http2ServerInitializer.java rename to example/src/main/java/io/netty/example/http2/helloworld/server/Http2ServerInitializer.java index abe5edb594..a29801fb88 100644 --- a/example/src/main/java/io/netty/example/http2/server/Http2ServerInitializer.java +++ b/example/src/main/java/io/netty/example/http2/helloworld/server/Http2ServerInitializer.java @@ -14,7 +14,7 @@ * under the License. */ -package io.netty.example.http2.server; +package io.netty.example.http2.helloworld.server; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; diff --git a/example/src/main/java/io/netty/example/http2/tiles/FallbackRequestHandler.java b/example/src/main/java/io/netty/example/http2/tiles/FallbackRequestHandler.java new file mode 100644 index 0000000000..d0c88b42f7 --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/FallbackRequestHandler.java @@ -0,0 +1,74 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import static io.netty.buffer.Unpooled.copiedBuffer; +import static io.netty.buffer.Unpooled.unmodifiableBuffer; +import static io.netty.buffer.Unpooled.unreleasableBuffer; +import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH; +import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; +import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE; +import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; +import static io.netty.util.CharsetUtil.UTF_8; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpHeaderUtil; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http2.Http2CodecUtil; + +/** + * Handles the exceptional case where HTTP 1.x was negotiated under TLS. + */ +public final class FallbackRequestHandler extends SimpleChannelInboundHandler { + + private static final ByteBuf response = unmodifiableBuffer(unreleasableBuffer(copiedBuffer("" + + "

To view the example you need a browser that supports HTTP/2 (" + + Http2CodecUtil.TLS_UPGRADE_PROTOCOL_NAME + + ")

", UTF_8))); + + @Override + protected void channelRead0(ChannelHandlerContext ctx, HttpRequest req) throws Exception { + if (HttpHeaderUtil.is100ContinueExpected(req)) { + ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE)); + } + + ByteBuf content = ctx.alloc().buffer(); + content.writeBytes(response.duplicate()); + + FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, content); + response.headers().set(CONTENT_TYPE, "text/html; charset=UTF-8"); + response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes()); + + ctx.write(response).addListener(ChannelFutureListener.CLOSE); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/Html.java b/example/src/main/java/io/netty/example/http2/tiles/Html.java new file mode 100644 index 0000000000..2ac497edb0 --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/Html.java @@ -0,0 +1,79 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import static io.netty.util.CharsetUtil.UTF_8; + +import java.util.Random; + +/** + * Static and dynamically generated HTML for the example. + */ +public final class Html { + + public static final String IP = System.getProperty("ip", "127.0.0.1"); + + public static final byte[] FOOTER = "".getBytes(UTF_8); + + public static final byte[] HEADER = ("Netty HTTP/2 Example" + + "" + + "" + + "A grid of 200 tiled images is shown below. Compare:" + + "

[HTTP/2, 0 latency] [HTTP/1, 0 latency]
" + "[HTTP/2, 30ms latency] [HTTP/1, 30ms latency]
" + "[HTTP/2, 200ms latency] [HTTP/1, 200ms latency]
" + "[HTTP/2, 1s latency] [HTTP/1, " + "1s latency]
").getBytes(UTF_8); + + private static final int IMAGES_X_AXIS = 20; + + private static final int IMAGES_Y_AXIS = 10; + + private Html() { + } + + private static String url(int port) { + return IP + ":" + port + "/http2"; + } + + public static byte[] body(int latency) { + int r = Math.abs(new Random().nextInt()); + // The string to be built contains 13192 fixed characters plus the variable latency and random cache-bust. + int numberOfCharacters = 13192 + stringLength(latency) + stringLength(r); + StringBuilder sb = new StringBuilder(numberOfCharacters).append("

"); + for (int y = 0; y < IMAGES_Y_AXIS; y++) { + for (int x = 0; x < IMAGES_X_AXIS; x++) { + sb.append(""); + } + sb.append("
\r\n"); + } + sb.append("
"); + return sb.toString().getBytes(UTF_8); + } + + private static int stringLength(int value) { + return Integer.toString(value).length() * IMAGES_X_AXIS * IMAGES_Y_AXIS; + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/Http1RequestHandler.java b/example/src/main/java/io/netty/example/http2/tiles/Http1RequestHandler.java new file mode 100644 index 0000000000..aacc31ca53 --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/Http1RequestHandler.java @@ -0,0 +1,62 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import static io.netty.handler.codec.http.HttpHeaderNames.CONNECTION; +import static io.netty.handler.codec.http.HttpHeaderUtil.isKeepAlive; +import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpHeaderUtil; +import io.netty.handler.codec.http.HttpHeaderValues; + +import java.util.concurrent.TimeUnit; + +/** + * Handles the requests for the tiled image using HTTP 1.x as a protocol. + */ +public final class Http1RequestHandler extends Http2RequestHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception { + if (HttpHeaderUtil.is100ContinueExpected(request)) { + ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE)); + } + super.channelRead0(ctx, request); + } + + @Override + protected void sendResponse(final ChannelHandlerContext ctx, String streamId, int latency, + final FullHttpResponse response, final FullHttpRequest request) { + HttpHeaderUtil.setContentLength(response, response.content().readableBytes()); + ctx.executor().schedule(new Runnable() { + @Override + public void run() { + if (isKeepAlive(request)) { + response.headers().set(CONNECTION, HttpHeaderValues.KEEP_ALIVE); + ctx.writeAndFlush(response); + } else { + ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); + } + } + }, latency, TimeUnit.MILLISECONDS); + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/Http2OrHttpHandler.java b/example/src/main/java/io/netty/example/http2/tiles/Http2OrHttpHandler.java new file mode 100644 index 0000000000..ca93a49035 --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/Http2OrHttpHandler.java @@ -0,0 +1,77 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http2.DefaultHttp2Connection; +import io.netty.handler.codec.http2.DefaultHttp2FrameReader; +import io.netty.handler.codec.http2.DefaultHttp2FrameWriter; +import io.netty.handler.codec.http2.Http2ConnectionHandler; +import io.netty.handler.codec.http2.Http2OrHttpChooser; +import io.netty.handler.codec.http2.HttpToHttp2ConnectionHandler; +import io.netty.handler.codec.http2.InboundHttp2ToHttpAdapter; + +import javax.net.ssl.SSLEngine; + +/** + * Used during protocol negotiation, the main function of this handler is to + * return the HTTP/1.1 or HTTP/2 handler once the protocol has been negotiated. + */ +public class Http2OrHttpHandler extends Http2OrHttpChooser { + + public Http2OrHttpHandler(int maxHttpContentLength) { + super(maxHttpContentLength); + } + + @Override + protected SelectedProtocol getProtocol(SSLEngine engine) { + String[] protocol = engine.getSession().getProtocol().split(":"); + if (protocol != null && protocol.length > 1) { + SelectedProtocol selectedProtocol = SelectedProtocol.protocol(protocol[1]); + System.err.println("Selected Protocol is " + selectedProtocol); + return selectedProtocol; + } + return SelectedProtocol.UNKNOWN; + } + + @Override + protected void addHttp2Handlers(ChannelHandlerContext ctx) { + DefaultHttp2Connection connection = new DefaultHttp2Connection(true); + DefaultHttp2FrameWriter writer = new DefaultHttp2FrameWriter(); + DefaultHttp2FrameReader reader = new DefaultHttp2FrameReader(); + InboundHttp2ToHttpAdapter listener = new InboundHttp2ToHttpAdapter.Builder(connection).propagateSettings(true) + .validateHttpHeaders(false).maxContentLength(1024 * 100).build(); + + ctx.pipeline().addLast("httpToHttp2", new HttpToHttp2ConnectionHandler(connection, + // Loggers can be activated for debugging purposes + // new Http2InboundFrameLogger(reader, TilesHttp2ToHttpHandler.logger), + // new Http2OutboundFrameLogger(writer, TilesHttp2ToHttpHandler.logger) + reader, writer, listener)); + ctx.pipeline().addLast("fullHttpRequestHandler", new Http2RequestHandler()); + } + + @Override + protected ChannelHandler createHttp1RequestHandler() { + return new FallbackRequestHandler(); + } + + @Override + protected Http2ConnectionHandler createHttp2RequestHandler() { + return null; // NOOP + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/Http2RequestHandler.java b/example/src/main/java/io/netty/example/http2/tiles/Http2RequestHandler.java new file mode 100644 index 0000000000..8ddf9910ca --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/Http2RequestHandler.java @@ -0,0 +1,122 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import static io.netty.buffer.Unpooled.EMPTY_BUFFER; +import static io.netty.example.http2.Http2ExampleUtil.firstValue; +import static io.netty.example.http2.Http2ExampleUtil.toInt; +import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; +import static io.netty.handler.codec.http.HttpHeaderUtil.setContentLength; +import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST; +import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; +import static java.lang.Integer.valueOf; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.QueryStringDecoder; +import io.netty.handler.codec.http2.HttpUtil; +import io.netty.handler.codec.http2.InboundHttp2ToHttpAdapter; + +import java.util.concurrent.TimeUnit; + +/** + * Handles all the requests for data. It receives a {@link FullHttpRequest}, + * which has been converted by a {@link InboundHttp2ToHttpAdapter} before it + * arrived here. For further details, check {@link Http2OrHttpHandler} where the + * pipeline is setup. + */ +public class Http2RequestHandler extends SimpleChannelInboundHandler { + + private static final String LATENCY_FIELD_NAME = "latency"; + private static final int MIN_LATENCY = 0; + private static final int MAX_LATENCY = 1000; + private static final String IMAGE_COORDINATE_Y = "y"; + private static final String IMAGE_COORDINATE_X = "x"; + + @Override + protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception { + QueryStringDecoder queryString = new QueryStringDecoder(request.uri()); + String streamId = streamId(request); + int latency = toInt(firstValue(queryString, LATENCY_FIELD_NAME), 0); + if (latency < MIN_LATENCY || latency > MAX_LATENCY) { + sendBadRequest(ctx, streamId); + return; + } + String x = firstValue(queryString, IMAGE_COORDINATE_X); + String y = firstValue(queryString, IMAGE_COORDINATE_Y); + if (x == null || y == null) { + handlePage(ctx, streamId, latency, request); + } else { + handleImage(x, y, ctx, streamId, latency, request); + } + } + + private void sendBadRequest(ChannelHandlerContext ctx, String streamId) { + FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, BAD_REQUEST, EMPTY_BUFFER); + streamId(response, streamId); + ctx.writeAndFlush(response); + } + + private void handleImage(String x, String y, ChannelHandlerContext ctx, String streamId, int latency, + FullHttpRequest request) { + ByteBuf image = ImageCache.INSTANCE.image(valueOf(x), valueOf(y)); + FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, image.duplicate()); + response.headers().set(CONTENT_TYPE, "image/jpeg"); + sendResponse(ctx, streamId, latency, response, request); + } + + private void handlePage(ChannelHandlerContext ctx, String streamId, int latency, FullHttpRequest request) { + byte[] body = Html.body(latency); + ByteBuf content = ctx.alloc().buffer(Html.HEADER.length + body.length + Html.FOOTER.length); + content.writeBytes(Html.HEADER); + content.writeBytes(body); + content.writeBytes(Html.FOOTER); + FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, content); + response.headers().set(CONTENT_TYPE, "text/html; charset=UTF-8"); + sendResponse(ctx, streamId, latency, response, request); + } + + protected void sendResponse(final ChannelHandlerContext ctx, String streamId, int latency, + final FullHttpResponse response, final FullHttpRequest request) { + setContentLength(response, response.content().readableBytes()); + streamId(response, streamId); + ctx.executor().schedule(new Runnable() { + @Override + public void run() { + ctx.writeAndFlush(response); + } + }, latency, TimeUnit.MILLISECONDS); + } + + private String streamId(FullHttpRequest request) { + return request.headers().get(HttpUtil.ExtensionHeaderNames.STREAM_ID.text()); + } + + private void streamId(FullHttpResponse response, String streamId) { + response.headers().set(HttpUtil.ExtensionHeaderNames.STREAM_ID.text(), streamId); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/Http2Server.java b/example/src/main/java/io/netty/example/http2/tiles/Http2Server.java new file mode 100644 index 0000000000..7c818ca239 --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/Http2Server.java @@ -0,0 +1,87 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import static io.netty.handler.codec.http2.Http2OrHttpChooser.SelectedProtocol.HTTP_1_1; +import static io.netty.handler.codec.http2.Http2OrHttpChooser.SelectedProtocol.HTTP_2; +import static io.netty.handler.codec.http2.Http2SecurityUtil.CIPHERS; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.ssl.ApplicationProtocolConfig; +import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol; +import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior; +import io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.SupportedCipherSuiteFilter; +import io.netty.handler.ssl.util.SelfSignedCertificate; + +import java.security.cert.CertificateException; + +import javax.net.ssl.SSLException; + +/** + * Demonstrates a Http2 server using Netty to display a bunch of images and + * simulate latency. It is a Netty version of the + * Go lang HTTP2 tiles demo. + */ +public class Http2Server { + + public static final int PORT = Integer.parseInt(System.getProperty("http2-port", "8443")); + static final int MAX_CONTENT_LENGTH = 1024 * 100; + + private final EventLoopGroup group; + + public Http2Server(EventLoopGroup eventLoopGroup) { + group = eventLoopGroup; + } + + public ChannelFuture start() throws Exception { + final SslContext sslCtx = configureTLS(); + ServerBootstrap b = new ServerBootstrap(); + b.option(ChannelOption.SO_BACKLOG, 1024); + b.group(group).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(sslCtx.newHandler(ch.alloc()), new Http2OrHttpHandler(MAX_CONTENT_LENGTH)); + } + }); + + Channel ch = b.bind(PORT).sync().channel(); + return ch.closeFuture(); + } + + private SslContext configureTLS() throws CertificateException, SSLException { + SelfSignedCertificate ssc = new SelfSignedCertificate(); + ApplicationProtocolConfig apn = new ApplicationProtocolConfig(Protocol.ALPN, + // NO_ADVERTISE is currently the only mode supported by both OpenSsl and JDK providers. + SelectorFailureBehavior.NO_ADVERTISE, + // ACCEPT is currently the only mode supported by both OpenSsl and JDK providers. + SelectedListenerFailureBehavior.ACCEPT, + HTTP_2.protocolName(), HTTP_1_1.protocolName()); + final SslContext sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey(), null) + .ciphers(CIPHERS, SupportedCipherSuiteFilter.INSTANCE) + .applicationProtocolConfig(apn).build(); + return sslCtx; + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/HttpServer.java b/example/src/main/java/io/netty/example/http2/tiles/HttpServer.java new file mode 100644 index 0000000000..a961b4eded --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/HttpServer.java @@ -0,0 +1,68 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpRequestDecoder; +import io.netty.handler.codec.http.HttpResponseEncoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; + +/** + * Demonstrates a http server using Netty to display a bunch of images, simulate + * latency and compare it against the http2 implementation. + */ +public final class HttpServer { + + public static final int PORT = Integer.parseInt(System.getProperty("http-port", "8080")); + private static final int MAX_CONTENT_LENGTH = 1024 * 100; + + private final EventLoopGroup group; + + public HttpServer(EventLoopGroup eventLoopGroup) { + group = eventLoopGroup; + } + + public ChannelFuture start() throws Exception { + ServerBootstrap b = new ServerBootstrap(); + b.option(ChannelOption.SO_BACKLOG, 1024); + + b.group(group).channel(NioServerSocketChannel.class).handler(new LoggingHandler(LogLevel.INFO)) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast("httpRequestDecoder", new HttpRequestDecoder()); + pipeline.addLast("httpResponseEncoder", new HttpResponseEncoder()); + pipeline.addLast("httpChunkAggregator", new HttpObjectAggregator(MAX_CONTENT_LENGTH)); + pipeline.addLast("httpRequestHandler", new Http1RequestHandler()); + } + }); + + Channel ch = b.bind(PORT).sync().channel(); + return ch.closeFuture(); + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/ImageCache.java b/example/src/main/java/io/netty/example/http2/tiles/ImageCache.java new file mode 100644 index 0000000000..dbf3e0b2da --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/ImageCache.java @@ -0,0 +1,63 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import static io.netty.buffer.Unpooled.unmodifiableBuffer; +import static io.netty.buffer.Unpooled.unreleasableBuffer; +import static io.netty.example.http2.Http2ExampleUtil.toByteBuf; +import io.netty.buffer.ByteBuf; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * Caches the images to avoid reading them every time from the disk. + */ +public final class ImageCache { + + public static ImageCache INSTANCE = new ImageCache(); + + private final Map imageBank = new HashMap(200); + + private ImageCache() { + init(); + } + + public static String name(int x, int y) { + return "tile-" + y + "-" + x + ".jpeg"; + } + + public ByteBuf image(int x, int y) { + return imageBank.get(name(x, y)); + } + + private void init() { + for (int y = 0; y < 10; y++) { + for (int x = 0; x < 20; x++) { + try { + String name = name(x, y); + ByteBuf fileBytes = unreleasableBuffer(unmodifiableBuffer(toByteBuf(getClass() + .getResourceAsStream(name)))); + imageBank.put(name, fileBytes); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/example/src/main/java/io/netty/example/http2/tiles/Launcher.java b/example/src/main/java/io/netty/example/http2/tiles/Launcher.java new file mode 100644 index 0000000000..5ce3ff3814 --- /dev/null +++ b/example/src/main/java/io/netty/example/http2/tiles/Launcher.java @@ -0,0 +1,54 @@ +/* + * Copyright 2015 The Netty Project + * + * The Netty Project 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 io.netty.example.http2.tiles; + +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; + +/** + *

+ * Launches both Http and Http2 servers using Netty to display a set of images + * and simulate latency. It is a Netty version of the Go lang HTTP2 tiles + * demo. + *

+ *

+ * Please note that if you intent to use the JDK provider for SSL, you MUST use JDK 1.8. + * Previous JDK versions don't have any cipher suite that is suitable for use with HTTP/2. + * The associated ALPN library for your JDK version can be found here: + * http://eclipse.org/jetty/documentation/current/alpn-chapter.html#alpn-versions. + * Alternatively, you can use the OpenSsl provider. Please make sure that you run OpenSsl + * version 1.0.2 or greater. + *

+ */ +public final class Launcher { + + public static void main(String[] args) { + EventLoopGroup group = new NioEventLoopGroup(); + Http2Server http2 = new Http2Server(group); + HttpServer http = new HttpServer(group); + try { + http2.start(); + System.err.println("Open your web browser and navigate to " + "http://" + Html.IP + ":" + HttpServer.PORT); + http.start().sync(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + group.shutdownGracefully(); + } + } +} diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-0.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-1.jpeg new file mode 100755 index 0000000000..c0dd8789e6 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-10.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-11.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-12.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-13.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-14.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-15.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-16.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-17.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-18.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-19.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-2.jpeg new file mode 100755 index 0000000000..db5cc901ea Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-3.jpeg new file mode 100755 index 0000000000..9a760055a5 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-4.jpeg new file mode 100755 index 0000000000..ab69470b31 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-5.jpeg new file mode 100755 index 0000000000..32f6b7b9c9 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-6.jpeg new file mode 100755 index 0000000000..45a5e2b300 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-7.jpeg new file mode 100755 index 0000000000..6d86705e42 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-8.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-0-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-9.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-0-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-0.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-1.jpeg new file mode 100755 index 0000000000..f339448f35 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-10.jpeg new file mode 100755 index 0000000000..fe0252518d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-11.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-12.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-13.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-14.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-15.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-16.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-17.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-18.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-19.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-2.jpeg new file mode 100755 index 0000000000..d3865871a4 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-3.jpeg new file mode 100755 index 0000000000..f7b6b640ac Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-4.jpeg new file mode 100755 index 0000000000..37b0eb0382 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-5.jpeg new file mode 100755 index 0000000000..82481c7b9a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-6.jpeg new file mode 100755 index 0000000000..7274942c54 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-7.jpeg new file mode 100755 index 0000000000..7ae2c2f536 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-8.jpeg new file mode 100755 index 0000000000..737aabb9c5 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-1-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-9.jpeg new file mode 100755 index 0000000000..78a857d97c Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-1-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-0.jpeg new file mode 100755 index 0000000000..77c51a9409 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-1.jpeg new file mode 100755 index 0000000000..4e069be1d2 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-10.jpeg new file mode 100755 index 0000000000..af1c431199 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-11.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-12.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-13.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-14.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-15.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-16.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-17.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-18.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-19.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-2.jpeg new file mode 100755 index 0000000000..48655a423d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-3.jpeg new file mode 100755 index 0000000000..2820d4d422 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-4.jpeg new file mode 100755 index 0000000000..f0497291a8 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-5.jpeg new file mode 100755 index 0000000000..8f10b7d0de Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-6.jpeg new file mode 100755 index 0000000000..979d881d94 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-7.jpeg new file mode 100755 index 0000000000..2782965b9f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-8.jpeg new file mode 100755 index 0000000000..c590bd3881 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-2-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-9.jpeg new file mode 100755 index 0000000000..d3f5777444 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-2-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-0.jpeg new file mode 100755 index 0000000000..080942070c Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-1.jpeg new file mode 100755 index 0000000000..05b6af1975 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-10.jpeg new file mode 100755 index 0000000000..940676fb57 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-11.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-12.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-13.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-14.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-15.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-16.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-17.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-18.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-19.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-2.jpeg new file mode 100755 index 0000000000..00275a7d9f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-3.jpeg new file mode 100755 index 0000000000..aa4dd400b1 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-4.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-5.jpeg new file mode 100755 index 0000000000..1bfbaa365d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-6.jpeg new file mode 100755 index 0000000000..ad4ebc9f30 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-7.jpeg new file mode 100755 index 0000000000..64be476759 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-8.jpeg new file mode 100755 index 0000000000..8e0031cbc6 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-3-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-9.jpeg new file mode 100755 index 0000000000..09986f438f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-3-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-0.jpeg new file mode 100755 index 0000000000..a77305cb6e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-1.jpeg new file mode 100755 index 0000000000..e28b7edea2 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-10.jpeg new file mode 100755 index 0000000000..9e1b528113 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-11.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-12.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-13.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-14.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-15.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-16.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-17.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-18.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-19.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-2.jpeg new file mode 100755 index 0000000000..34af62c63f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-3.jpeg new file mode 100755 index 0000000000..4b23e0c427 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-4.jpeg new file mode 100755 index 0000000000..18502b10c2 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-5.jpeg new file mode 100755 index 0000000000..78b32c1b4a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-6.jpeg new file mode 100755 index 0000000000..59ede3518e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-7.jpeg new file mode 100755 index 0000000000..507e5cc0af Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-8.jpeg new file mode 100755 index 0000000000..3a80f879d7 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-4-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-9.jpeg new file mode 100755 index 0000000000..566eb6e4eb Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-4-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-0.jpeg new file mode 100755 index 0000000000..4144053667 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-1.jpeg new file mode 100755 index 0000000000..6f83a51d84 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-10.jpeg new file mode 100755 index 0000000000..4b875ead29 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-11.jpeg new file mode 100755 index 0000000000..3587575181 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-12.jpeg new file mode 100755 index 0000000000..9b3155c564 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-13.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-14.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-15.jpeg new file mode 100755 index 0000000000..23a5bf55c2 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-16.jpeg new file mode 100755 index 0000000000..37b1b4b618 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-17.jpeg new file mode 100755 index 0000000000..c3d2507a92 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-18.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-19.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-2.jpeg new file mode 100755 index 0000000000..d70a4fc572 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-3.jpeg new file mode 100755 index 0000000000..5c88ed69fc Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-4.jpeg new file mode 100755 index 0000000000..b25337b3cf Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-5.jpeg new file mode 100755 index 0000000000..cd02251aca Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-6.jpeg new file mode 100755 index 0000000000..59ede3518e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-7.jpeg new file mode 100755 index 0000000000..4480b59819 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-8.jpeg new file mode 100755 index 0000000000..1c2f150601 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-5-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-9.jpeg new file mode 100755 index 0000000000..94f89058e8 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-5-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-0.jpeg new file mode 100755 index 0000000000..f4f72d05f1 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-1.jpeg new file mode 100755 index 0000000000..d185b5158e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-10.jpeg new file mode 100755 index 0000000000..5b2b2f236c Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-11.jpeg new file mode 100755 index 0000000000..fd4ac78e6f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-12.jpeg new file mode 100755 index 0000000000..3e801f4385 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-13.jpeg new file mode 100755 index 0000000000..335ea4bde9 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-14.jpeg new file mode 100755 index 0000000000..38d585d873 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-15.jpeg new file mode 100755 index 0000000000..de98ca1580 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-16.jpeg new file mode 100755 index 0000000000..0199780803 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-17.jpeg new file mode 100755 index 0000000000..d2ae692c2f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-18.jpeg new file mode 100755 index 0000000000..a86bd43cfa Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-19.jpeg new file mode 100755 index 0000000000..47dbf5020a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-2.jpeg new file mode 100755 index 0000000000..056be6059f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-3.jpeg new file mode 100755 index 0000000000..e66ca164bc Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-4.jpeg new file mode 100755 index 0000000000..a189bb6dec Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-5.jpeg new file mode 100755 index 0000000000..9ae844182c Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-6.jpeg new file mode 100755 index 0000000000..59ede3518e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-7.jpeg new file mode 100755 index 0000000000..f729c91ff1 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-8.jpeg new file mode 100755 index 0000000000..eba94d955a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-6-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-9.jpeg new file mode 100755 index 0000000000..7e4d54779f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-6-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-0.jpeg new file mode 100755 index 0000000000..d45de00b57 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-1.jpeg new file mode 100755 index 0000000000..1d7f6bf9e2 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-10.jpeg new file mode 100755 index 0000000000..3fce6f62c3 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-11.jpeg new file mode 100755 index 0000000000..7588c7989f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-12.jpeg new file mode 100755 index 0000000000..32aa90007c Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-13.jpeg new file mode 100755 index 0000000000..83a7f72177 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-14.jpeg new file mode 100755 index 0000000000..a22db246bd Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-15.jpeg new file mode 100755 index 0000000000..acf559c86d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-16.jpeg new file mode 100755 index 0000000000..3aa26f6d77 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-17.jpeg new file mode 100755 index 0000000000..09cb715a7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-18.jpeg new file mode 100755 index 0000000000..821e5ac08f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-19.jpeg new file mode 100755 index 0000000000..1423ca0edf Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-2.jpeg new file mode 100755 index 0000000000..47f525bea0 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-3.jpeg new file mode 100755 index 0000000000..1f97c0b60e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-4.jpeg new file mode 100755 index 0000000000..3c296fd933 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-5.jpeg new file mode 100755 index 0000000000..23c9d1a23b Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-6.jpeg new file mode 100755 index 0000000000..8abf43c659 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-7.jpeg new file mode 100755 index 0000000000..a40c73cba3 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-8.jpeg new file mode 100755 index 0000000000..4d0cddea82 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-7-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-9.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-7-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-0.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-1.jpeg new file mode 100755 index 0000000000..b56cbc04d9 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-10.jpeg new file mode 100755 index 0000000000..173493c56f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-11.jpeg new file mode 100755 index 0000000000..23ad24431f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-12.jpeg new file mode 100755 index 0000000000..4cd3b2c669 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-13.jpeg new file mode 100755 index 0000000000..bdf6dbe49f Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-14.jpeg new file mode 100755 index 0000000000..9bb3a4a735 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-15.jpeg new file mode 100755 index 0000000000..c9485dcf4d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-16.jpeg new file mode 100755 index 0000000000..220eeb64db Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-17.jpeg new file mode 100755 index 0000000000..2242f0d2ac Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-18.jpeg new file mode 100755 index 0000000000..78b0971d77 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-19.jpeg new file mode 100755 index 0000000000..e355af14e9 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-2.jpeg new file mode 100755 index 0000000000..fc1623448e Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-3.jpeg new file mode 100755 index 0000000000..a4747e64ca Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-4.jpeg new file mode 100755 index 0000000000..0f9a1ee632 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-5.jpeg new file mode 100755 index 0000000000..4eadd3c6dc Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-6.jpeg new file mode 100755 index 0000000000..568504b96a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-7.jpeg new file mode 100755 index 0000000000..f79ca80e01 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-8.jpeg new file mode 100755 index 0000000000..024d38bc33 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-8-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-9.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-8-9.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-0.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-0.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-0.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-1.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-1.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-1.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-10.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-10.jpeg new file mode 100755 index 0000000000..a950ab67d9 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-10.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-11.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-11.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-11.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-12.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-12.jpeg new file mode 100755 index 0000000000..29ebd2ba74 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-12.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-13.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-13.jpeg new file mode 100755 index 0000000000..46efbafe6c Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-13.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-14.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-14.jpeg new file mode 100755 index 0000000000..b5175b93d4 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-14.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-15.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-15.jpeg new file mode 100755 index 0000000000..84e019ca5b Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-15.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-16.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-16.jpeg new file mode 100755 index 0000000000..9e728f8419 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-16.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-17.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-17.jpeg new file mode 100755 index 0000000000..5b7c2440ab Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-17.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-18.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-18.jpeg new file mode 100755 index 0000000000..f4e5e2375a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-18.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-19.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-19.jpeg new file mode 100755 index 0000000000..54c7b57856 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-19.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-2.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-2.jpeg new file mode 100755 index 0000000000..a7ca8d64ba Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-2.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-3.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-3.jpeg new file mode 100755 index 0000000000..1a0e06f529 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-3.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-4.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-4.jpeg new file mode 100755 index 0000000000..ef2f7a3b80 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-4.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-5.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-5.jpeg new file mode 100755 index 0000000000..9b5765a268 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-5.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-6.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-6.jpeg new file mode 100755 index 0000000000..4c0ee8187a Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-6.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-7.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-7.jpeg new file mode 100755 index 0000000000..0dd10018f2 Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-7.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-8.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-8.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-8.jpeg differ diff --git a/example/src/main/resources/io/netty/example/http2/tiles/tile-9-9.jpeg b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-9.jpeg new file mode 100755 index 0000000000..5890841f7d Binary files /dev/null and b/example/src/main/resources/io/netty/example/http2/tiles/tile-9-9.jpeg differ diff --git a/run-example.sh b/run-example.sh index 30ae934266..d91bec7722 100755 --- a/run-example.sh +++ b/run-example.sh @@ -16,8 +16,9 @@ EXAMPLE_MAP=( 'http-upload-server:io.netty.example.http.upload.HttpUploadServer' 'websocket-client:io.netty.example.http.websocketx.client.WebSocketClient' 'websocket-server:io.netty.example.http.websocketx.server.WebSocketServer' - 'http2-client:io.netty.example.http2.client.Http2Client' - 'http2-server:io.netty.example.http2.server.Http2Server' + 'http2-client:io.netty.example.http2.helloworld.client.Http2Client' + 'http2-server:io.netty.example.http2.helloworld.server.Http2Server' + 'http2-tiles:io.netty.example.http2.tiles.Launcher' 'spdy-client:io.netty.example.spdy.client.SpdyClient' 'spdy-server:io.netty.example.spdy.server.SpdyServer' 'worldclock-client:io.netty.example.worldclock.WorldClockClient'