@@ -151,6 +151,9 @@ public class NettyClientTransportTest {
151
151
152
152
private static final SslContext SSL_CONTEXT = createSslContext ();
153
153
154
+ @ SuppressWarnings ("InlineMeInliner" ) // Requires Java 11
155
+ private static final String LONG_STRING_OF_A = Strings .repeat ("a" , 128 );
156
+
154
157
@ Mock
155
158
private ManagedClientTransport .Listener clientTransportListener ;
156
159
@@ -624,9 +627,6 @@ public void maxHeaderListSizeShouldBeEnforcedOnClient() throws Exception {
624
627
625
628
@ Test
626
629
public void huffmanCodingShouldNotBePerformed () throws Exception {
627
- @ SuppressWarnings ("InlineMeInliner" ) // Requires Java 11
628
- String longStringOfA = Strings .repeat ("a" , 128 );
629
-
630
630
negotiator = ProtocolNegotiators .serverPlaintext ();
631
631
startServer ();
632
632
@@ -637,7 +637,7 @@ public void huffmanCodingShouldNotBePerformed() throws Exception {
637
637
638
638
Metadata headers = new Metadata ();
639
639
headers .put (Metadata .Key .of ("test" , Metadata .ASCII_STRING_MARSHALLER ),
640
- longStringOfA );
640
+ LONG_STRING_OF_A );
641
641
642
642
callMeMaybe (transport .start (clientTransportListener ));
643
643
verify (clientTransportListener , timeout (5000 )).transportReady ();
@@ -649,7 +649,7 @@ public void huffmanCodingShouldNotBePerformed() throws Exception {
649
649
public void write (ChannelHandlerContext ctx , Object msg , ChannelPromise promise )
650
650
throws Exception {
651
651
if (msg instanceof ByteBuf ) {
652
- if (((ByteBuf ) msg ).toString (StandardCharsets .UTF_8 ).contains (longStringOfA )) {
652
+ if (((ByteBuf ) msg ).toString (StandardCharsets .UTF_8 ).contains (LONG_STRING_OF_A )) {
653
653
foundExpectedHeaderBytes .set (true );
654
654
}
655
655
}
@@ -664,6 +664,47 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)
664
664
}
665
665
}
666
666
667
+ @ Test
668
+ public void huffmanCodingShouldNotBePerformedOnServer () throws Exception {
669
+ negotiator = ProtocolNegotiators .serverPlaintext ();
670
+
671
+ Metadata responseHeaders = new Metadata ();
672
+ responseHeaders .put (Metadata .Key .of ("test" , Metadata .ASCII_STRING_MARSHALLER ),
673
+ LONG_STRING_OF_A );
674
+
675
+ startServer (new EchoServerListener (responseHeaders ));
676
+
677
+ NettyClientTransport transport = newTransport (ProtocolNegotiators .plaintext (),
678
+ DEFAULT_MAX_MESSAGE_SIZE , GrpcUtil .DEFAULT_MAX_HEADER_LIST_SIZE , null , false ,
679
+ TimeUnit .SECONDS .toNanos (10L ), TimeUnit .SECONDS .toNanos (1L ),
680
+ new ReflectiveChannelFactory <>(NioSocketChannel .class ), group );
681
+
682
+ callMeMaybe (transport .start (clientTransportListener ));
683
+ verify (clientTransportListener , timeout (5000 )).transportReady ();
684
+
685
+ AtomicBoolean foundExpectedHeaderBytes = new AtomicBoolean (false );
686
+
687
+ // Add a handler to the client pipeline to inspect server's response
688
+ transport .channel ().pipeline ().addFirst (new ChannelDuplexHandler () {
689
+ @ Override
690
+ public void channelRead (ChannelHandlerContext ctx , Object msg ) throws Exception {
691
+ if (msg instanceof ByteBuf ) {
692
+ String data = ((ByteBuf ) msg ).toString (StandardCharsets .UTF_8 );
693
+ if (data .contains (LONG_STRING_OF_A )) {
694
+ foundExpectedHeaderBytes .set (true );
695
+ }
696
+ }
697
+ super .channelRead (ctx , msg );
698
+ }
699
+ });
700
+
701
+ new Rpc (transport ).halfClose ().waitForResponse ();
702
+
703
+ if (!foundExpectedHeaderBytes .get ()) {
704
+ fail ("expected to find UTF-8 encoded 'a's in the response header sent by the server" );
705
+ }
706
+ }
707
+
667
708
@ Test
668
709
public void maxHeaderListSizeShouldBeEnforcedOnServer () throws Exception {
669
710
startServer (100 , 1 );
@@ -1115,7 +1156,16 @@ private void startServer() throws IOException {
1115
1156
startServer (100 , GrpcUtil .DEFAULT_MAX_HEADER_LIST_SIZE );
1116
1157
}
1117
1158
1159
+ private void startServer (ServerListener serverListener ) throws IOException {
1160
+ startServer (100 , GrpcUtil .DEFAULT_MAX_HEADER_LIST_SIZE , serverListener );
1161
+ }
1162
+
1118
1163
private void startServer (int maxStreamsPerConnection , int maxHeaderListSize ) throws IOException {
1164
+ startServer (maxStreamsPerConnection , maxHeaderListSize , serverListener );
1165
+ }
1166
+
1167
+ private void startServer (int maxStreamsPerConnection , int maxHeaderListSize ,
1168
+ ServerListener serverListener ) throws IOException {
1119
1169
server =
1120
1170
new NettyServer (
1121
1171
TestUtils .testServerAddresses (new InetSocketAddress (0 )),
@@ -1283,6 +1333,15 @@ private final class EchoServerListener implements ServerListener {
1283
1333
final List <NettyServerTransport > transports = new ArrayList <>();
1284
1334
final List <EchoServerStreamListener > streamListeners =
1285
1335
Collections .synchronizedList (new ArrayList <EchoServerStreamListener >());
1336
+ Metadata responseHeaders ;
1337
+
1338
+ public EchoServerListener () {
1339
+ this (new Metadata ());
1340
+ }
1341
+
1342
+ public EchoServerListener (Metadata responseHeaders ) {
1343
+ this .responseHeaders = responseHeaders ;
1344
+ }
1286
1345
1287
1346
@ Override
1288
1347
public ServerTransportListener transportCreated (final ServerTransport transport ) {
@@ -1292,7 +1351,7 @@ public ServerTransportListener transportCreated(final ServerTransport transport)
1292
1351
public void streamCreated (ServerStream stream , String method , Metadata headers ) {
1293
1352
EchoServerStreamListener listener = new EchoServerStreamListener (stream , headers );
1294
1353
stream .setListener (listener );
1295
- stream .writeHeaders (new Metadata () , true );
1354
+ stream .writeHeaders (responseHeaders , true );
1296
1355
stream .request (1 );
1297
1356
streamListeners .add (listener );
1298
1357
}
0 commit comments