Refine search
private void encodeLastContent(LastHttpContent last, List<Object> out) { boolean needFiller = !(last instanceof FullHttpMessage) && last.trailingHeaders().isEmpty(); if (last.content().isReadable() || needFiller) { out.add(new DefaultHttp2DataFrame(last.content().retain(), last.trailingHeaders().isEmpty())); } if (!last.trailingHeaders().isEmpty()) { Http2Headers headers = HttpConversionUtil.toHttp2Headers(last.trailingHeaders(), validateHeaders); out.add(new DefaultHttp2HeadersFrame(headers, true)); } }
@Override public int onDataRead(ChannelHandlerContext ctx, int streamId, ByteBuf data, int padding, boolean endOfStream) { onHttp2Frame(ctx, new DefaultHttp2DataFrame(data, endOfStream, padding) .stream(requireStream(streamId)).retain()); // We return the bytes in consumeBytes() once the stream channel consumed the bytes. return 0; }
/** * Construct a new data message. * * @param content non-{@code null} payload * @param endStream whether this data should terminate the stream * @param padding additional bytes that should be added to obscure the true content size. Must be between 0 and * 256 (inclusive). */ public DefaultHttp2DataFrame(ByteBuf content, boolean endStream, int padding) { this.content = checkNotNull(content, "content"); this.endStream = endStream; verifyPadding(padding); this.padding = padding; if (content().readableBytes() + (long) padding > Integer.MAX_VALUE) { throw new IllegalArgumentException("content + padding must be <= Integer.MAX_VALUE"); } initialFlowControlledBytes = content().readableBytes() + padding; }
@Override public DefaultHttp2DataFrame retainedDuplicate() { return replace(content().retainedDuplicate()); }
private void writeRequest(ChannelHandlerContext ctx, Request request, ChannelPromise promise) { /* // TOOD(CK): define ACCEPT? if (!response.headers().contains(HttpHeaderNames.CONTENT_TYPE)) { response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8"); } */ Http2Headers headers = request.headers().http2Headers(); headers.authority(request.host()).method(request.method().asciiName()).path(request.path()); int streamId = request.streamId(); if (request instanceof FullRequest) { if (request.body().readableBytes() > 0) { PromiseCombiner combiner = new PromiseCombiner(); combiner.add(ctx.write(Http2Request.build(streamId, headers, false), ctx.newPromise())); Http2DataFrame data = new DefaultHttp2DataFrame(request.body(), true); combiner.add(ctx.write(Http2Request.build(streamId, data, true), ctx.newPromise())); combiner.finish(promise); } else { ctx.write(Http2Request.build(streamId, headers, true), promise); } } else { ctx.write(Http2Request.build(streamId, headers, false), promise); } }
@Override public int onDataRead( ChannelHandlerContext ctx, int streamId, ByteBuf data, int padding, boolean endOfStream) throws Http2Exception { if (isServer) { ctx.fireChannelRead( Http2Request.build( streamId, new DefaultHttp2DataFrame(data.retain(), endOfStream, padding), endOfStream)); } else { ctx.fireChannelRead( Http2Response.build( streamId, new DefaultHttp2DataFrame(data.retain(), endOfStream, padding), endOfStream)); } return data.readableBytes() + padding; }
@Override public void write(byte[] b, int off, int len) throws IOException { ByteBuf buffer = ctx.alloc().buffer(len); buffer.writeBytes(b, off, len); ctx.writeAndFlush(new DefaultHttp2DataFrame(buffer, false)); }
endStream = msg instanceof FullHttpMessage && !((FullHttpMessage) msg).content().isReadable(); ctx.write(new DefaultHttp2HeadersFrame(http2Headers), promiseAggregator); endStream = isLastContent && trailers.isEmpty(); release = false; ctx.write(new DefaultHttp2DataFrame(content, endStream), promiseAggregator); ctx.write(new DefaultHttp2HeadersFrame(http2Trailers, true), promiseAggregator);
Http2Request.build(streamIdOne, new DefaultHttp2Headers().method("GET").path("/"), false); Http2Request requestSubSequential1 = Http2Request.build(streamIdOne, new DefaultHttp2DataFrame(Unpooled.EMPTY_BUFFER), true); Http2Request.build(streamIdTwo, new DefaultHttp2Headers().method("POST").path("/"), false); Http2Request requestSubSequential2 = Http2Request.build(streamIdTwo, new DefaultHttp2DataFrame(Unpooled.EMPTY_BUFFER), true); Http2Response.build( streamIdOne, new DefaultHttp2DataFrame( ByteBufUtil.writeUtf8(UnpooledByteBufAllocator.DEFAULT, "body1"), true), true); Http2Response.build( streamIdTwo, new DefaultHttp2DataFrame( ByteBufUtil.writeUtf8(UnpooledByteBufAllocator.DEFAULT, "body2"), true), true); assertTrue(bodyOut.eos); assertEquals( "body1", ((Http2DataFrame) bodyOut.payload).content().toString(CharsetUtil.UTF_8)); assertEquals(streamIdOne, bodyOut.streamId);
final Http2DataFrame cannedData = new DefaultHttp2DataFrame(buf.retain(), false);
request.headers().remove("host"); request.headers().forEach(header -> headers.set(header.getKey().toLowerCase(), header.getValue())); ctx.fireChannelRead(new DefaultHttp2HeadersFrame(headers, false)); } else { HttpServerImpl.log.warn("Cannot perform HTTP/2 upgrade in a worker verticle"); ByteBuf buf = VertxHandler.safeBuffer(content.content(), ctx.alloc()); boolean end = msg instanceof LastHttpContent; ctx.fireChannelRead(new DefaultHttp2DataFrame(buf, end, 0)); if (end) { ChannelPipeline pipeline = ctx.pipeline();
if(msg instanceof DefaultHttp2HeadersFrame){ final DefaultHttp2HeadersFrame headersFrame = (DefaultHttp2HeadersFrame)msg; final int streamId = ClientToProxyChannels.clientToProxyStreamIdMap.get(headersFrame.streamId()); inboundChannel = ClientToProxyChannels.clientToProxyChannelMap.get(headersFrame.streamId()); msg = new DefaultHttp2HeadersFrame(headersFrame.headers(),headersFrame.isEndStream(), headersFrame.padding()) .streamId(streamId); final DefaultHttp2DataFrame dataFrame = (DefaultHttp2DataFrame)msg; final int streamId = ClientToProxyChannels.clientToProxyStreamIdMap.get(dataFrame.streamId()); inboundChannel = ClientToProxyChannels.clientToProxyChannelMap.get(dataFrame.streamId()); msg = new DefaultHttp2DataFrame(dataFrame.content(), dataFrame.isEndStream(), dataFrame.padding()).streamId (streamId); if(dataFrame.isEndStream()){ ClientToProxyChannels.clientToProxyStreamIdMap.remove(dataFrame.streamId()); ClientToProxyChannels.clientToProxyChannelMap.remove(dataFrame.streamId());
@Override public DefaultHttp2DataFrame replace(ByteBuf content) { return new DefaultHttp2DataFrame(content, endStream, padding); }
@Override public String toString() { return StringUtil.simpleClassName(this) + "(stream=" + stream() + ", content=" + content + ", endStream=" + endStream + ", padding=" + padding + ')'; }
private void writeResponse(ChannelHandlerContext ctx, Response response, ChannelPromise promise) { if (!response.headers().contains(HttpHeaderNames.CONTENT_TYPE)) { response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8"); } Http2MessageSession messageSession = lazyCreateSession(ctx); int streamId = response.streamId(); Http2Headers headers = response.headers().http2Headers(); headers.status(response.status().codeAsText()); if (response instanceof FullResponse) { messageSession.onOutboundResponse(response); ByteBuf body = response.body(); if (body != null && body.readableBytes() > 0) { PromiseCombiner combiner = new PromiseCombiner(); combiner.add(ctx.write(Http2Response.build(streamId, headers, false), ctx.newPromise())); Http2DataFrame data = new DefaultHttp2DataFrame(body, true); combiner.add(ctx.write(Http2Response.build(streamId, data, true), ctx.newPromise())); combiner.finish(promise); } else { ctx.write(Http2Response.build(streamId, headers, true), promise); } } else { ctx.write(Http2Response.build(streamId, headers, false), promise); } messageSession.flush(streamId); }
endStream = msg instanceof FullHttpMessage && !((FullHttpMessage) msg).content().isReadable(); ctx.write(new DefaultHttp2HeadersFrame(http2Headers), promiseAggregator); endStream = isLastContent && trailers.isEmpty(); release = false; ctx.write(new DefaultHttp2DataFrame(content, endStream), promiseAggregator); ctx.write(new DefaultHttp2HeadersFrame(http2Trailers, true), promiseAggregator);