@Override public HttpResponseStatus status() { return response.status(); }
@Override public HttpResponseStatus status() { return delegate.status(); }
switch (response.status().codeClass()) { case INFORMATIONAL: statusClassInformationalMeter.mark();
public void onResponse(ChannelHandlerContext ctx, Response response) { Optional<Span> requestSpan = popSpan(ctx, response.streamId()); requestSpan.ifPresent( span -> { int responseCode = response.status().code(); span.setTag(Tags.HTTP_STATUS.getKey(), responseCode); span.setTag("http.response.streamId", response.streamId()); StreamSupport.stream(response.headers().spliterator(), false) .forEach( (entry) -> { span.setTag( "http.response.headers." + entry.getKey().toString(), entry.getValue().toString()); }); span.finish(); response.httpTraceInfo().setSpan(span); }); }
public void onResponse(ChannelHandlerContext ctx, Response response, Throwable error) { popSpan(ctx, response.streamId()) .ifPresent( span -> { int responseCode = response.status().code(); span.setTag(Tags.HTTP_STATUS.getKey(), responseCode); span.setTag("http.response.streamId", response.streamId()); StreamSupport.stream(response.headers().spliterator(), false) .forEach( (entry) -> { span.setTag( "http.response.headers." + entry.getKey().toString(), entry.getValue().toString()); }); span.finish(); response.httpTraceInfo().setSpan(span); }); } }
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); }
@Test public void testIndicatedSizeSmallerThanActualSizeSingleChunk() { HelloRequest grpcRequest = HelloRequest.newBuilder().setName("myName").build(); byte[] dataBytes = grpcRequest.toByteArray(); byte[] lengthByteBuffer = ByteBuffer.allocate(4).putInt(2).array(); byte[] compressedByteBuffer = ByteBuffer.allocate(1).put((byte) 0).array(); int streamId = 567; int length = dataBytes.length; ByteBuf grpcRequestBuffer = UnpooledByteBufAllocator.DEFAULT.buffer(length + 5, length + 5); grpcRequestBuffer.writeBytes(compressedByteBuffer); grpcRequestBuffer.writeBytes(lengthByteBuffer); grpcRequestBuffer.writeBytes(dataBytes); channel.writeInbound(fullGrpcRequest(grpcRequestBuffer, 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)); assertEquals("13", Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); String actualMessage = grpcDecodedString( Objects.requireNonNull( Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-message"))); assertEquals("indicated payload size does not match actual payload size", actualMessage); assertEquals(streamId, segmentedData.streamId()); assertTrue(segmentedData.endOfMessage()); }
SegmentedData segmentedData = channel.readOutbound(); assertEquals(HttpResponseStatus.OK, response.status()); assertEquals(streamId, response.streamId()); assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE));
@Test public void testDidNotGetAllMetaData() { byte[] lengthByteBuffer = ByteBuffer.allocate(4).putInt(0).array(); int streamId = 456; ByteBuf grpcRequestBuffer = UnpooledByteBufAllocator.DEFAULT.buffer(4, 4); grpcRequestBuffer.writeBytes(lengthByteBuffer); channel.writeInbound(fullGrpcRequest(grpcRequestBuffer, 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)); assertEquals("13", Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); String actualMessage = grpcDecodedString( Objects.requireNonNull( Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-message"))); assertEquals("metadata not provided", actualMessage); assertEquals(streamId, segmentedData.streamId()); assertTrue(segmentedData.endOfMessage()); }
obj = new DefaultHttpResponse(HttpVersion.HTTP_1_1, response.status(), headers);
@Test public void testFullResponse() throws Exception { outputReceived = new CountDownLatch(1); ByteBuf body = ByteBufUtil.writeUtf8(UnpooledByteBufAllocator.DEFAULT, "response"); FullHttpResponse responseIn = new DefaultFullHttpResponse(HTTP_1_1, OK, body); channel.writeInbound(responseIn); channel.runPendingTasks(); // blocks Uninterruptibles.awaitUninterruptibly(outputReceived); Response responseOut = responses.remove(0); assertTrue(responseOut != null); assertTrue(responseOut instanceof FullResponse); assertEquals("HTTP/1.1", responseOut.version()); assertEquals(OK, responseOut.status()); assertTrue(responseOut.hasBody()); assertFalse(responseOut.body() == null); assertEquals(body, responseOut.body()); }
@Test public void testFullResponse() throws Exception { outputReceived = new CountDownLatch(1); Http2Headers headers = new DefaultHttp2Headers().status("200"); Http2Response responseIn = Http2Response.build(1, headers, true); channel.writeInbound(responseIn); channel.runPendingTasks(); // blocks Uninterruptibles.awaitUninterruptibly(outputReceived); Response responseOut = responses.remove(0); assertTrue(responseOut != null); assertTrue(responseOut instanceof FullResponse); assertEquals("h2", responseOut.version()); assertEquals(OK, responseOut.status()); assertFalse(responseOut.hasBody()); assertEquals(1, responseOut.streamId()); }
@Test public void testCompressedFlag() { HelloRequest grpcRequest = HelloRequest.newBuilder().setName("myName").build(); ByteBuf grpcRequestBuffer = bufferFor(grpcRequest, true); int streamId = 345; 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)); assertEquals("12", Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); String actualMessage = grpcDecodedString( Objects.requireNonNull( Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-message"))); assertEquals("compression not supported", actualMessage); assertEquals(streamId, segmentedData.streamId()); assertTrue(segmentedData.endOfMessage()); }
SegmentedData segmentedData = channel.readOutbound(); assertEquals(HttpResponseStatus.OK, response.status()); assertEquals(streamId, response.streamId()); assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE));
SegmentedData segmentedData = channel.readOutbound(); assertEquals(HttpResponseStatus.OK, response.status()); assertEquals(streamId, response.streamId()); assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE));
@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()); }