@Nullable default String get(String name) { CharSequence value = get((CharSequence) name); if (value != null) { return value.toString(); } else { return null; } }
protected String getOriginatingAddressAndPort(ChannelHandlerContext ctx, Request request) { val rawXFF = request.headers().get(X_FORWARDED_FOR); if (rawXFF == null || rawXFF.toString().trim().isEmpty()) { return addressHelper.extractRemoteAddressAndPort(ctx.channel()); } else { String stringXFF = rawXFF.toString(); if (stringXFF.contains(",")) { // extract originating address from list of addresses return stringXFF.substring(0, stringXFF.indexOf(",")); } else { // XFF only has one address return stringXFF; } } }
private void appendXForwardedFor(ChannelHandlerContext ctx, Request request) { val remoteAddressAndPort = addressHelper.extractRemoteAddressAndPort(ctx.channel()); if (remoteAddressAndPort != null) { val rawXFF = request.headers().get(X_FORWARDED_FOR); if (rawXFF == null || rawXFF.toString().trim().isEmpty()) { request.headers().set(X_FORWARDED_FOR, remoteAddressAndPort); } else { val newXFF = rawXFF.toString().trim() + ", " + remoteAddressAndPort; request.headers().set(X_FORWARDED_FOR, newXFF); } } }
default String host() { return headers().get(HttpHeaderNames.HOST.toString()); }
@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()); }
@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()); }
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());
@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()); }
assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE)); Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); String actualMessage = grpcDecodedString( Objects.requireNonNull( Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-message"))); assertEquals(grpcStatus.getDescription(), actualMessage); assertEquals(streamId, segmentedData.streamId());
assertEquals("application/grpc+proto", response.headers().get(HttpHeaderNames.CONTENT_TYPE)); Objects.requireNonNull(segmentedData.trailingHeaders()).get("grpc-status")); assertFalse(Objects.requireNonNull(segmentedData.trailingHeaders()).contains("grpc-message")); assertEquals(streamId, segmentedData.streamId());
@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()); }
assertEquals(0, trailersOut.body().readableBytes()); assertEquals(1, trailersOut.trailingHeaders().size()); assertEquals("bar", trailersOut.trailingHeaders().get("foo")); assertTrue(trailersOut.endOfMessage());
assertEquals(0, trailersOut.body().readableBytes()); assertEquals(1, ((SegmentedRequestData) trailersOut).trailingHeaders().size()); assertEquals("bar", ((SegmentedRequestData) trailersOut).trailingHeaders().get("foo")); assertTrue(trailersOut.endOfMessage());