private void _writeData(Http2Stream stream, ByteBuf chunk, boolean end, ChannelPromise promise) { encoder().writeData(chctx, stream.id(), chunk, 0, end, promise); Http2RemoteFlowController controller = encoder().flowController(); if (!controller.isWritable(stream) || end) { try { encoder().flowController().writePendingBytes(); } catch (Http2Exception e) { onError(chctx, true, e); } } chctx.channel().flush(); }
protected void sendHttp2Response(ChannelHandlerContext ctx, int streamId, HttpResponseStatus status, String result) { // Send a frame for the response status Http2Headers headers = new DefaultHttp2Headers().status(status.codeAsText()); if (!HttpResponseStatus.OK.equals(status)) { headers.set(RemotingConstants.HEAD_RESPONSE_ERROR, "true"); } if (StringUtils.isNotBlank(result)) { ByteBuf data = ctx.alloc().buffer(); data.writeBytes(result.getBytes(RpcConstants.DEFAULT_CHARSET)); encoder().writeHeaders(ctx, streamId, headers, 0, false, ctx.newPromise()); encoder().writeData(ctx, streamId, data, 0, true, ctx.newPromise()); } else { encoder().writeHeaders(ctx, streamId, headers, 0, true, ctx.newPromise()); } }
protected void sendHttp2Response(ChannelHandlerContext ctx, int streamId, HttpResponseStatus status, String result) { // Send a frame for the response status Http2Headers headers = new DefaultHttp2Headers().status(status.codeAsText()); if (!HttpResponseStatus.OK.equals(status)) { headers.set(RemotingConstants.HEAD_RESPONSE_ERROR, "true"); } if (StringUtils.isNotBlank(result)) { ByteBuf data = ctx.alloc().buffer(); data.writeBytes(result.getBytes(RpcConstants.DEFAULT_CHARSET)); encoder().writeHeaders(ctx, streamId, headers, 0, false, ctx.newPromise()); encoder().writeData(ctx, streamId, data, 0, true, ctx.newPromise()); } else { encoder().writeHeaders(ctx, streamId, headers, 0, true, ctx.newPromise()); } }
@Override protected ChannelFuture doWriteData(int id, int streamId, HttpData data, boolean endStream) { if (isStreamPresentAndWritable(streamId)) { // Write to an existing stream. return encoder.writeData(ctx, streamId, toByteBuf(data), 0, endStream, ctx.newPromise()); } if (encoder.connection().local().mayHaveCreatedStream(streamId)) { // Can't write to an outdated (closed) stream. ReferenceCountUtil.safeRelease(data); return data.isEmpty() ? ctx.writeAndFlush(Unpooled.EMPTY_BUFFER) : newFailedFuture(ClosedPublisherException.get()); } // Cannot start a new stream with a DATA frame. It must start with a HEADERS frame. ReferenceCountUtil.safeRelease(data); return newFailedFuture(new IllegalStateException( "cannot start a new stream " + streamId + " with a DATA frame")); }
this.encoder().writeData(context, streamId, payloadBuffer, 0, true, dataPromise); log.trace("Wrote payload on stream {}: {}", streamId, pushNotification.getPayload());
private void writeErrorResponse(ChannelHandlerContext ctx, int streamId, HttpResponseStatus status) throws Http2Exception { final byte[] content = status.toString().getBytes(StandardCharsets.UTF_8); writer.writeHeaders( ctx, streamId, new DefaultHttp2Headers(false) .status(status.codeAsText()) .set(HttpHeaderNames.CONTENT_TYPE, MediaType.PLAIN_TEXT_UTF_8.toString()) .setInt(HttpHeaderNames.CONTENT_LENGTH, content.length), 0, false, ctx.voidPromise()); writer.writeData(ctx, streamId, Unpooled.wrappedBuffer(content), 0, true, ctx.voidPromise()); final Http2Stream stream = writer.connection().stream(streamId); if (stream != null && writer.flowController().hasFlowControlled(stream)) { // Ensure to flush the error response if it's flow-controlled so that it is sent // before an RST_STREAM frame. writer.flowController().writePendingBytes(); } }
private void sendHttp2Response0(HttpResponseStatus status, boolean error, ByteBuf data) { Http2Headers headers = new DefaultHttp2Headers().status(status.codeAsText()); if (request.getSerializeType() > 0) { String serialization = SerializerFactory.getAliasByCode(request.getSerializeType()); headers.set(RemotingConstants.HEAD_SERIALIZE_TYPE, serialization); } else { headers.set(CONTENT_TYPE, "text/plain; charset=" + RpcConstants.DEFAULT_CHARSET.displayName()); } if (error) { headers.set(RemotingConstants.HEAD_RESPONSE_ERROR, "true"); } if (data != null) { encoder.writeHeaders(ctx, streamId, headers, 0, false, ctx.newPromise()); encoder.writeData(ctx, streamId, data, 0, true, ctx.newPromise()); } else { encoder.writeHeaders(ctx, streamId, headers, 0, true, ctx.newPromise()); } } }
private void sendHttp2Response0(HttpResponseStatus status, boolean error, ByteBuf data) { Http2Headers headers = new DefaultHttp2Headers().status(status.codeAsText()); if (request.getSerializeType() > 0) { String serialization = SerializerFactory.getAliasByCode(request.getSerializeType()); headers.set(RemotingConstants.HEAD_SERIALIZE_TYPE, serialization); } else { headers.set(CONTENT_TYPE, "text/plain; charset=" + RpcConstants.DEFAULT_CHARSET.displayName()); } if (error) { headers.set(RemotingConstants.HEAD_RESPONSE_ERROR, "true"); } if (data != null) { encoder.writeHeaders(ctx, streamId, headers, 0, false, ctx.newPromise()); encoder.writeData(ctx, streamId, data, 0, true, ctx.newPromise()); } else { encoder.writeHeaders(ctx, streamId, headers, 0, true, ctx.newPromise()); } } }
endStream = isLastContent && trailers.isEmpty(); release = false; encoder.writeData(ctx, currentStreamId, content, 0, endStream, promiseAggregator.newPromise());
this.encoder().writeData(context, rejectNotificationResponse.getStreamId(), Unpooled.wrappedBuffer(payloadBytes), 0, true, dataPromise);
if (msg instanceof Http2DataFrame) { Http2DataFrame dataFrame = (Http2DataFrame) msg; encoder().writeData(ctx, dataFrame.stream().id(), dataFrame.content(), dataFrame.padding(), dataFrame.isEndStream(), promise); } else if (msg instanceof Http2HeadersFrame) {
if (msg instanceof Http2DataFrame) { Http2DataFrame dataFrame = (Http2DataFrame) msg; encoder().writeData(ctx, dataFrame.stream().id(), dataFrame.content(), dataFrame.padding(), dataFrame.isEndStream(), promise); } else if (msg instanceof Http2HeadersFrame) {
if (msg instanceof Http2DataFrame) { Http2DataFrame dataFrame = (Http2DataFrame) msg; encoder().writeData(ctx, dataFrame.stream().id(), dataFrame.content(), dataFrame.padding(), dataFrame.isEndStream(), promise); } else if (msg instanceof Http2HeadersFrame) {
private void _writeData(Http2Stream stream, ByteBuf chunk, boolean end, ChannelPromise promise) { encoder().writeData(chctx, stream.id(), chunk, 0, end, promise); Http2RemoteFlowController controller = encoder().flowController(); if (!controller.isWritable(stream) || end) { try { encoder().flowController().writePendingBytes(); } catch (Http2Exception e) { onError(chctx, true, e); } } chctx.channel().flush(); }
@Override public void onDone() { _encoder.writeData(_ctx, _streamId, Unpooled.EMPTY_BUFFER, NO_PADDING, END_STREAM, _ctx.channel().newPromise()); LOG.debug("Sent HTTP/2 DATA frame, stream={}, end={}, data={}bytes, padding={}bytes", new Object[] { _streamId, END_STREAM, NO_DATA, NO_PADDING }); _ctx.channel().flush(); }
@Override public CompletableFuture<StreamWriteOperation> writeData(int streamId, byte[] data, boolean endStream) { return doInEventLoop((cf, channelPromise) -> { log.info("write data on connection {}, stream id: {}, size : {}", ctx.channel().id(), streamId, data.length); cf.setResult(new StreamWriteOperation(http2Connection.stream(streamId), this)); encoder.writeData(ctx, streamId, Unpooled.wrappedBuffer(data), 0, endStream, channelPromise); ctx.pipeline().flush(); }); }
private void writeData( ChannelHandlerContext ctx, Http2DataFrame data, ChannelPromise promise, int currentStreamId) throws Exception { encoder().writeData(ctx, currentStreamId, data.content(), 0, data.isEndStream(), promise); }
private void writeData( ChannelHandlerContext ctx, Http2DataFrame data, ChannelPromise promise, int currentStreamId) throws Exception { encoder().writeData(ctx, currentStreamId, data.content(), 0, data.isEndStream(), promise); }
private void writeErrorResponse(ChannelHandlerContext ctx, int streamId, HttpResponseStatus status) { final byte[] content = status.toString().getBytes(StandardCharsets.UTF_8); writer.writeHeaders(ctx, streamId, new DefaultHttp2Headers(false) .status(status.codeAsText()) .set(HttpHeaderNames.CONTENT_TYPE, "text/plain") .setInt(HttpHeaderNames.CONTENT_LENGTH, content.length), 0, false, ctx.voidPromise()); writer.writeData( ctx, streamId, Unpooled.wrappedBuffer(content), 0, true, ctx.voidPromise()); }
private void sendAPushPromise(ChannelHandlerContext ctx, int streamId, int pushPromiseStreamId, ByteBuf payload) throws Http2Exception { encoder().writePushPromise(ctx, streamId, pushPromiseStreamId, new DefaultHttp2Headers().status(OK.codeAsText()), 0, ctx.newPromise()); //Http2Stream stream = connection.local().reservePushStream(pushPromiseStreamId, connection.connectionStream()); Http2Headers headers = new DefaultHttp2Headers(); headers.status(OK.codeAsText()); encoder().writeHeaders(ctx, pushPromiseStreamId, headers, 0, false, ctx.newPromise()); encoder().writeData(ctx, pushPromiseStreamId, payload, 0, false, ctx.newPromise()); }