Skip to content

Commit c8c699a

Browse files
committed
xds: Send protocol config and request attributes on first message to ext-proc
- Centralize decoration of ProcessingRequest messages within sendToExtProc. - Ensure ProtocolConfiguration is populated on the very first message dispatched to the external processor. - Ensure request attributes are collected and attached to the first client-to-server message (either request headers or request body). - Add Category 3 tests to verify protocol configuration propagation across different processing mode setups. - Add Category 4 tests to verify request attributes propagation on headers, body, or omitted correctly.
1 parent 1824eb7 commit c8c699a

2 files changed

Lines changed: 823 additions & 66 deletions

File tree

xds/src/main/java/io/grpc/xds/ExternalProcessorClientInterceptor.java

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,9 @@ private enum EventType {
442442
private long serverHeadersStartNanos;
443443
private long serverTrailersStartNanos;
444444

445+
private boolean protocolConfigSent = false;
446+
private ImmutableMap<String, Struct> collectedAttributes;
447+
private boolean requestAttributesSent = false;
445448
private volatile Metadata requestHeaders;
446449
final AtomicReference<DataPlaneCallState> dataPlaneCallState =
447450
new AtomicReference<>(DataPlaneCallState.IDLE);
@@ -795,6 +798,9 @@ public void onCompleted() {
795798
}
796799
});
797800

801+
this.collectedAttributes = collectAttributes(
802+
config.getRequestAttributes(), method, channel, headers);
803+
798804
boolean sendRequestHeaders =
799805
currentProcessingMode.getRequestHeaderMode() == ProcessingMode.HeaderSendMode.SEND
800806
|| currentProcessingMode.getRequestHeaderMode()
@@ -806,12 +812,6 @@ public void onCompleted() {
806812
.setHeaders(toHeaderMap(headers, config.getForwardRulesConfig()))
807813
.setEndOfStream(false)
808814
.build())
809-
.putAllAttributes(
810-
collectAttributes(config.getRequestAttributes(), method, channel, headers))
811-
.setProtocolConfig(ProtocolConfiguration.newBuilder()
812-
.setRequestBodyMode(currentProcessingMode.getRequestBodyMode())
813-
.setResponseBodyMode(currentProcessingMode.getResponseBodyMode())
814-
.build())
815815
.build());
816816
}
817817

@@ -835,8 +835,30 @@ private void sendToExtProc(ProcessingRequest request) {
835835
}
836836

837837
ProcessingRequest requestToSend = request;
838+
if (!protocolConfigSent) {
839+
requestToSend = ProcessingRequest.newBuilder(requestToSend)
840+
.setProtocolConfig(ProtocolConfiguration.newBuilder()
841+
.setRequestBodyMode(currentProcessingMode.getRequestBodyMode())
842+
.setResponseBodyMode(currentProcessingMode.getResponseBodyMode())
843+
.build())
844+
.build();
845+
protocolConfigSent = true;
846+
}
847+
848+
boolean isClientServerMessage =
849+
requestToSend.hasRequestHeaders() || requestToSend.hasRequestBody();
850+
if (isClientServerMessage
851+
&& !requestAttributesSent
852+
&& collectedAttributes != null
853+
&& !collectedAttributes.isEmpty()) {
854+
requestToSend = ProcessingRequest.newBuilder(requestToSend)
855+
.putAllAttributes(collectedAttributes)
856+
.build();
857+
requestAttributesSent = true;
858+
}
859+
838860
if (config.getObservabilityMode()) {
839-
requestToSend = ProcessingRequest.newBuilder(request)
861+
requestToSend = ProcessingRequest.newBuilder(requestToSend)
840862
.setObservabilityMode(true)
841863
.build();
842864
}

0 commit comments

Comments
 (0)