if (!response.headers().contains(HttpHeaderNames.CONTENT_TYPE)) { response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8"); content = Unpooled.EMPTY_BUFFER; if (!full.headers().contains(HttpHeaderNames.CONTENT_LENGTH)) { full.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes()); if (!response.headers().contains(HttpHeaderNames.TRANSFER_ENCODING)) { headers.set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED); headers.remove(HttpHeaderNames.CONTENT_LENGTH);
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); }
HttpRequest buildRequest(Request request) { if (!request.headers().contains(HttpHeaderNames.CONTENT_TYPE)) { request.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8"); content = Unpooled.EMPTY_BUFFER; if (!full.headers().contains(HttpHeaderNames.CONTENT_LENGTH)) { full.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
Integer.toString(grpcStatus.getCode().value()), Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); assertFalse(Objects.requireNonNull(segmentedData.trailingHeaders()).contains("grpc-message")); assertEquals(streamId, segmentedData.streamId()); assertTrue(segmentedData.endOfMessage());
@Test public void testChunkedRequest() { HelloRequest grpcRequest = HelloRequest.newBuilder().setName("myName").build(); ByteBuf grpcRequestBuffer = bufferFor(grpcRequest); int streamId = 234; int middleIndex = grpcRequestBuffer.readableBytes() / 2; ByteBuf firstHalf = grpcRequestBuffer.slice(0, middleIndex); ByteBuf secondHalf = grpcRequestBuffer.slice(middleIndex, grpcRequestBuffer.readableBytes() - middleIndex); channel.writeInbound(fullGrpcRequest(firstHalf, streamId, false)); channel.writeInbound(fullGrpcRequest(secondHalf, streamId, true)); Response response = channel.readOutbound(); SegmentedData segmentedData = channel.readOutbound(); assertEquals(HttpResponseStatus.OK, response.status()); assertEquals(streamId, response.streamId()); assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE)); HelloReply actualReply = protoObjectFor(segmentedData.content(), HelloReply::parseFrom); HelloReply expectedReply = HelloReply.newBuilder().setMessage(responsePrefix + grpcRequest.getName()).build(); assertEquals(actualReply, expectedReply); assertEquals("0", Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); assertFalse(Objects.requireNonNull(segmentedData.trailingHeaders()).contains("grpc-message")); assertEquals(streamId, segmentedData.streamId()); assertTrue(segmentedData.endOfMessage()); }
@Test public void testSimpleRequest() { HelloRequest grpcRequest = HelloRequest.newBuilder().setName("myName").build(); ByteBuf grpcRequestBuffer = bufferFor(grpcRequest); int streamId = 123; SegmentedRequestData segmentedRequest = fullGrpcRequest(grpcRequestBuffer, streamId, true); channel.writeInbound(segmentedRequest); Response response = channel.readOutbound(); SegmentedData segmentedData = channel.readOutbound(); assertEquals(HttpResponseStatus.OK, response.status()); assertEquals(streamId, response.streamId()); assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE)); HelloReply actualReply = protoObjectFor(segmentedData.content(), HelloReply::parseFrom); HelloReply expectedReply = HelloReply.newBuilder().setMessage(responsePrefix + grpcRequest.getName()).build(); assertEquals(actualReply, expectedReply); assertEquals("0", Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); assertFalse(Objects.requireNonNull(segmentedData.trailingHeaders()).contains("grpc-message")); assertEquals(streamId, segmentedData.streamId()); assertTrue(segmentedData.endOfMessage()); }