@@ -1521,6 +1521,96 @@ public void onCompleted() {
15211521 channelManager .close ();
15221522 }
15231523
1524+ @ Test
1525+ public void givenRequestBodyModeNone_whenSendMessageCalled_thenMessageSentDirectlyToDataPlane ()
1526+ throws Exception {
1527+ ExternalProcessor proto = createBaseProto (extProcServerName )
1528+ .setProcessingMode (ProcessingMode .newBuilder ()
1529+ .setRequestHeaderMode (ProcessingMode .HeaderSendMode .SKIP )
1530+ .setRequestBodyMode (ProcessingMode .BodySendMode .NONE )
1531+ .build ())
1532+ .build ();
1533+ ConfigOrError <ExternalProcessorFilterConfig > configOrError =
1534+ provider .parseFilterConfig (Any .pack (proto ), filterContext );
1535+ assertThat (configOrError .errorDetail ).isNull ();
1536+ ExternalProcessorFilterConfig filterConfig = configOrError .config ;
1537+
1538+ final AtomicInteger extProcBodyCount = new AtomicInteger (0 );
1539+ ExternalProcessorGrpc .ExternalProcessorImplBase extProcImpl =
1540+ new ExternalProcessorGrpc .ExternalProcessorImplBase () {
1541+ @ Override
1542+ @ SuppressWarnings ("unchecked" )
1543+ public StreamObserver <ProcessingRequest > process (
1544+ final StreamObserver <ProcessingResponse > responseObserver ) {
1545+ ((ServerCallStreamObserver <ProcessingResponse >) responseObserver ).request (100 );
1546+ return new StreamObserver <ProcessingRequest >() {
1547+ @ Override
1548+ public void onNext (ProcessingRequest request ) {
1549+ if (request .hasRequestBody ()) {
1550+ extProcBodyCount .incrementAndGet ();
1551+ }
1552+ }
1553+
1554+ @ Override
1555+ public void onError (Throwable t ) {}
1556+
1557+ @ Override
1558+ public void onCompleted () {
1559+ responseObserver .onCompleted ();
1560+ }
1561+ };
1562+ }
1563+ };
1564+
1565+ grpcCleanup .register (InProcessServerBuilder .forName (extProcServerName )
1566+ .addService (extProcImpl )
1567+ .directExecutor ()
1568+ .build ().start ());
1569+
1570+ CachedChannelManager channelManager = new CachedChannelManager (config -> {
1571+ return grpcCleanup .register (
1572+ InProcessChannelBuilder .forName (extProcServerName ).directExecutor ().build ());
1573+ });
1574+
1575+ ExternalProcessorServerInterceptor interceptor = new ExternalProcessorServerInterceptor (
1576+ filterConfig , channelManager , FAKE_CONTEXT );
1577+
1578+ final AtomicReference <String > receivedBody = new AtomicReference <>();
1579+ final CountDownLatch dataPlaneLatch = new CountDownLatch (1 );
1580+ dataPlaneHandler = new DataPlaneServiceHandler () {
1581+ @ Override
1582+ public void sayHello (InputStream request , StreamObserver <InputStream > responseObserver ) {
1583+ try {
1584+ byte [] bytes = ByteStreams .toByteArray (request );
1585+ receivedBody .set (new String (bytes , StandardCharsets .UTF_8 ));
1586+ } catch (Exception e ) {
1587+ receivedBody .set ("Error reading: " + e .getMessage ());
1588+ }
1589+ responseObserver .onNext (
1590+ new ByteArrayInputStream ("Hello Back" .getBytes (StandardCharsets .UTF_8 )));
1591+ responseObserver .onCompleted ();
1592+ dataPlaneLatch .countDown ();
1593+ }
1594+ };
1595+
1596+ startDataPlane (interceptor );
1597+
1598+ io .grpc .ClientCall <InputStream , InputStream > clientCall = dataPlaneChannel .newCall (
1599+ METHOD_SAY_HELLO_RAW , io .grpc .CallOptions .DEFAULT );
1600+
1601+ clientCall .start (new io .grpc .ClientCall .Listener <InputStream >() {}, new Metadata ());
1602+ clientCall .request (1 );
1603+ clientCall .sendMessage (new ByteArrayInputStream ("Original" .getBytes (StandardCharsets .UTF_8 )));
1604+ clientCall .halfClose ();
1605+
1606+ assertThat (dataPlaneLatch .await (5 , TimeUnit .SECONDS )).isTrue ();
1607+ assertThat (receivedBody .get ()).isEqualTo ("Original" );
1608+ assertThat (extProcBodyCount .get ()).isEqualTo (0 );
1609+
1610+ clientCall .cancel ("Cleanup" , null );
1611+ channelManager .close ();
1612+ }
1613+
15241614 // ============================================================================
15251615 // Category 5: Response Header Mutation
15261616 // ============================================================================
0 commit comments