Skip to content

Commit ba4b25c

Browse files
committed
HTTP response schema collection and data classification
1 parent 7dfc057 commit ba4b25c

File tree

21 files changed

+164
-28
lines changed

21 files changed

+164
-28
lines changed

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import datadog.trace.bootstrap.instrumentation.api.URIUtils;
3737
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
3838
import datadog.trace.bootstrap.instrumentation.decorator.http.ClientIpAddressResolver;
39+
import java.io.OutputStream;
3940
import java.net.InetAddress;
4041
import java.util.BitSet;
4142
import java.util.LinkedHashMap;
@@ -383,6 +384,8 @@ public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) {
383384
final int status = status(response);
384385
onResponseStatus(span, status);
385386

387+
final OutputStream responseBody = responseBody(response);
388+
386389
AgentPropagation.ContextVisitor<RESPONSE> getter = responseGetter();
387390
if (getter != null) {
388391
ResponseHeaderTagClassifier tagger =
@@ -393,12 +396,17 @@ public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) {
393396
}
394397

395398
if (!isAppSecOnResponseSeparate()) {
396-
callIGCallbackResponseAndHeaders(span, response, status);
399+
callIGCallbackResponseAndHeaders(span, response, status, responseBody);
397400
}
398401
}
399402
return span;
400403
}
401404

405+
// TODO this should be abstract by the end of developments
406+
protected OutputStream responseBody(RESPONSE response) {
407+
return null;
408+
}
409+
402410
// @Override
403411
// public Span onError(final Span span, final Throwable throwable) {
404412
// assert span != null;
@@ -464,7 +472,8 @@ private Flow<Void> callIGCallbackRequestHeaders(AgentSpan span, REQUEST_CARRIER
464472
IGKeyClassifier.create(
465473
requestContext,
466474
cbp.getCallback(EVENTS.requestHeader()),
467-
cbp.getCallback(EVENTS.requestHeaderDone()));
475+
cbp.getCallback(EVENTS.requestHeaderDone()),
476+
null);
468477
if (null != igKeyClassifier) {
469478
getter.forEachKey(carrier, igKeyClassifier);
470479
return igKeyClassifier.done();
@@ -493,15 +502,16 @@ private Flow<Void> callIGCallbackRequestSessionId(final AgentSpan span, final RE
493502
}
494503

495504
private Flow<Void> callIGCallbackResponseAndHeaders(
496-
AgentSpan span, RESPONSE carrier, int status) {
497-
return callIGCallbackResponseAndHeaders(span, carrier, status, responseGetter());
505+
AgentSpan span, RESPONSE carrier, int status, OutputStream responseBody) {
506+
return callIGCallbackResponseAndHeaders(span, carrier, status, responseGetter(), responseBody);
498507
}
499508

500509
public <RESP> Flow<Void> callIGCallbackResponseAndHeaders(
501510
AgentSpan span,
502511
RESP carrier,
503512
int status,
504-
AgentPropagation.ContextVisitor<RESP> contextVisitor) {
513+
AgentPropagation.ContextVisitor<RESP> contextVisitor,
514+
OutputStream responseBody) {
505515
CallbackProvider cbp = tracer().getCallbackProvider(RequestContextSlot.APPSEC);
506516
RequestContext requestContext = span.getRequestContext();
507517
if (cbp == null || requestContext == null) {
@@ -520,7 +530,8 @@ public <RESP> Flow<Void> callIGCallbackResponseAndHeaders(
520530
IGKeyClassifier.create(
521531
requestContext,
522532
cbp.getCallback(EVENTS.responseHeader()),
523-
cbp.getCallback(EVENTS.responseHeaderDone()));
533+
cbp.getCallback(EVENTS.responseHeaderDone()),
534+
cbp.getCallback(EVENTS.responseBodyDone()));
524535
if (null != igKeyClassifier) {
525536
contextVisitor.forEachKey(carrier, igKeyClassifier);
526537
return igKeyClassifier.done();
@@ -604,7 +615,8 @@ protected static final class IGKeyClassifier implements AgentPropagation.KeyClas
604615
public static IGKeyClassifier create(
605616
RequestContext requestContext,
606617
TriConsumer<RequestContext, String, String> headerCallback,
607-
Function<RequestContext, Flow<Void>> doneCallback) {
618+
Function<RequestContext, Flow<Void>> doneCallback,
619+
BiFunction<RequestContext, OutputStream, Flow<Void>> bodyDoneCallback) {
608620
if (null == requestContext || null == headerCallback) {
609621
return null;
610622
}

dd-java-agent/appsec/src/main/java/com/datadog/appsec/event/data/KnownAddresses.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public interface KnownAddresses {
4848
Address<Object> RESPONSE_BODY_OBJECT = new Address<>("server.response.body");
4949

5050
/** First chars of HTTP response body */
51-
Address<String> RESPONSE_BODY_RAW = new Address<>("server.response.body.raw");
51+
Address<CharSequence> RESPONSE_BODY_RAW = new Address<>("server.response.body.raw");
5252

5353
/** Reponse headers excluding cookies */
5454
Address<Map<String, List<String>>> RESPONSE_HEADERS_NO_COOKIES =

dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import datadog.trace.api.internal.TraceSegment;
1616
import datadog.trace.util.stacktrace.StackTraceEvent;
1717
import java.io.Closeable;
18+
import java.io.OutputStream;
1819
import java.util.*;
1920
import java.util.concurrent.ConcurrentHashMap;
2021
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -98,6 +99,7 @@ public class AppSecRequestContext implements DataBundle, Closeable {
9899
private String inferredClientIp;
99100

100101
private volatile StoredBodySupplier storedRequestBodySupplier;
102+
private volatile OutputStream storedResponseBodySupplier;
101103
private String dbType;
102104

103105
private int responseStatus;
@@ -106,6 +108,7 @@ public class AppSecRequestContext implements DataBundle, Closeable {
106108
private boolean rawReqBodyPublished;
107109
private boolean convertedReqBodyPublished;
108110
private boolean respDataPublished;
111+
private boolean rawResBodyPublished;
109112
private boolean pathParamsPublished;
110113
private volatile Map<String, String> derivatives;
111114

@@ -451,6 +454,10 @@ void setStoredRequestBodySupplier(StoredBodySupplier storedRequestBodySupplier)
451454
this.storedRequestBodySupplier = storedRequestBodySupplier;
452455
}
453456

457+
void setStoredResponseBodySupplier(OutputStream storedResponseBodySupplier) {
458+
this.storedResponseBodySupplier = storedResponseBodySupplier;
459+
}
460+
454461
public String getDbType() {
455462
return dbType;
456463
}
@@ -503,10 +510,18 @@ public boolean isRespDataPublished() {
503510
return respDataPublished;
504511
}
505512

513+
public boolean isRawResBodyPublished() {
514+
return rawResBodyPublished;
515+
}
516+
506517
public void setRespDataPublished(boolean respDataPublished) {
507518
this.respDataPublished = respDataPublished;
508519
}
509520

521+
public void setRawResBodyPublished(boolean rawResBodyPublished) {
522+
this.rawResBodyPublished = rawResBodyPublished;
523+
}
524+
510525
/**
511526
* Updates the current used usr.id
512527
*
@@ -580,6 +595,14 @@ public CharSequence getStoredRequestBody() {
580595
return storedRequestBodySupplier.get();
581596
}
582597

598+
/** @return the contents of stream */
599+
public CharSequence getStoredResponseBody() {
600+
CharSequence storedResponseBody = null;
601+
storedResponseBody =
602+
this.storedResponseBodySupplier != null ? this.storedResponseBodySupplier.toString() : null;
603+
return storedResponseBody;
604+
}
605+
583606
public void reportEvents(Collection<AppSecEvent> appSecEvents) {
584607
for (AppSecEvent event : appSecEvents) {
585608
StandardizedLogging.attackDetected(log, event);

dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import datadog.trace.bootstrap.instrumentation.api.URIDataAdapter;
3838
import datadog.trace.util.stacktrace.StackTraceEvent;
3939
import datadog.trace.util.stacktrace.StackUtils;
40+
import java.io.OutputStream;
4041
import java.net.URI;
4142
import java.net.URISyntaxException;
4243
import java.nio.charset.Charset;
@@ -94,6 +95,7 @@ public class GatewayBridge {
9495
// subscriber cache
9596
private volatile DataSubscriberInfo initialReqDataSubInfo;
9697
private volatile DataSubscriberInfo rawRequestBodySubInfo;
98+
private volatile DataSubscriberInfo rawResponseBodySubInfo;
9799
private volatile DataSubscriberInfo requestBodySubInfo;
98100
private volatile DataSubscriberInfo pathParamsSubInfo;
99101
private volatile DataSubscriberInfo respDataSubInfo;
@@ -141,6 +143,8 @@ public void init() {
141143
subscriptionService.registerCallback(EVENTS.responseStarted(), this::onResponseStarted);
142144
subscriptionService.registerCallback(EVENTS.responseHeader(), this::onResponseHeader);
143145
subscriptionService.registerCallback(EVENTS.responseHeaderDone(), this::onResponseHeaderDone);
146+
subscriptionService.registerCallback(EVENTS.responseBodyStart(), this::onResponseBodyStart);
147+
subscriptionService.registerCallback(EVENTS.responseBodyDone(), this::onResponseBodyDone);
144148
subscriptionService.registerCallback(EVENTS.grpcServerMethod(), this::onGrpcServerMethod);
145149
subscriptionService.registerCallback(
146150
EVENTS.grpcServerRequestMessage(), this::onGrpcServerRequestMessage);
@@ -602,7 +606,7 @@ private Flow<Void> onRequestBodyDone(RequestContext ctx_, StoredBodySupplier sup
602606
}
603607

604608
CharSequence bodyContent = supplier.get();
605-
if (bodyContent == null || bodyContent.length() == 0) {
609+
if (bodyContent.length() == 0) {
606610
return NoopFlow.INSTANCE;
607611
}
608612
DataBundle bundle = new SingletonDataBundle<>(KnownAddresses.REQUEST_BODY_RAW, bodyContent);
@@ -615,6 +619,38 @@ private Flow<Void> onRequestBodyDone(RequestContext ctx_, StoredBodySupplier sup
615619
}
616620
}
617621

622+
private Flow<Void> onResponseBodyDone(RequestContext ctx_, OutputStream supplier) {
623+
AppSecRequestContext ctx = ctx_.getData(RequestContextSlot.APPSEC);
624+
if (ctx == null || ctx.isRawResBodyPublished()) {
625+
return NoopFlow.INSTANCE;
626+
}
627+
ctx.setRawResBodyPublished(true);
628+
629+
while (true) {
630+
DataSubscriberInfo subInfo = rawResponseBodySubInfo;
631+
if (subInfo == null) {
632+
subInfo = producerService.getDataSubscribers(KnownAddresses.RESPONSE_BODY_RAW);
633+
rawResponseBodySubInfo = subInfo;
634+
}
635+
if (subInfo == null || subInfo.isEmpty()) {
636+
return NoopFlow.INSTANCE;
637+
}
638+
639+
CharSequence bodyContent = supplier.toString();
640+
if (bodyContent.length() == 0) {
641+
return NoopFlow.INSTANCE;
642+
}
643+
DataBundle bundle =
644+
new SingletonDataBundle<>(KnownAddresses.RESPONSE_BODY_OBJECT, bodyContent);
645+
try {
646+
GatewayContext gwCtx = new GatewayContext(false);
647+
return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx);
648+
} catch (ExpiredSubscriberInfoException e) {
649+
rawResponseBodySubInfo = null;
650+
}
651+
}
652+
}
653+
618654
private Flow<Void> onRequestPathParams(RequestContext ctx_, Map<String, ?> data) {
619655
AppSecRequestContext ctx = ctx_.getData(RequestContextSlot.APPSEC);
620656
if (ctx == null || ctx.isPathParamsPublished()) {
@@ -651,6 +687,16 @@ private Void onRequestBodyStart(RequestContext ctx_, StoredBodySupplier supplier
651687
return null;
652688
}
653689

690+
private Void onResponseBodyStart(RequestContext ctx_, OutputStream supplier) {
691+
AppSecRequestContext ctx = ctx_.getData(RequestContextSlot.APPSEC);
692+
if (ctx == null) {
693+
return null;
694+
}
695+
696+
ctx.setStoredResponseBodySupplier(supplier);
697+
return null;
698+
}
699+
654700
private Flow<AppSecRequestContext> onRequestStarted() {
655701
if (!AppSecSystem.isActive()) {
656702
return RequestContextSupplier.EMPTY;
@@ -1014,8 +1060,12 @@ private Flow<Void> maybePublishResponseData(AppSecRequestContext ctx) {
10141060

10151061
MapDataBundle bundle =
10161062
MapDataBundle.of(
1017-
KnownAddresses.RESPONSE_STATUS, String.valueOf(ctx.getResponseStatus()),
1018-
KnownAddresses.RESPONSE_HEADERS_NO_COOKIES, ctx.getResponseHeaders());
1063+
KnownAddresses.RESPONSE_STATUS,
1064+
String.valueOf(ctx.getResponseStatus()),
1065+
KnownAddresses.RESPONSE_HEADERS_NO_COOKIES,
1066+
ctx.getResponseHeaders(),
1067+
KnownAddresses.RESPONSE_BODY_OBJECT,
1068+
ctx.getStoredResponseBody());
10191069

10201070
while (true) {
10211071
DataSubscriberInfo subInfo = respDataSubInfo;
@@ -1110,6 +1160,9 @@ private static class IGAppSecEventDependencies {
11101160
KnownAddresses.REQUEST_BODY_RAW, l(EVENTS.requestBodyStart(), EVENTS.requestBodyDone()));
11111161
DATA_DEPENDENCIES.put(KnownAddresses.REQUEST_PATH_PARAMS, l(EVENTS.requestPathParams()));
11121162
DATA_DEPENDENCIES.put(KnownAddresses.REQUEST_BODY_OBJECT, l(EVENTS.requestBodyProcessed()));
1163+
DATA_DEPENDENCIES.put(
1164+
KnownAddresses.RESPONSE_BODY_RAW,
1165+
l(EVENTS.responseBodyStart(), EVENTS.responseBodyDone()));
11131166
}
11141167

11151168
private static Collection<datadog.trace.api.gateway.EventType<?>> l(

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.datadog.appsec.report.AppSecEvent
1111
import com.datadog.appsec.report.AppSecEventWrapper
1212
import datadog.trace.api.ProductTraceSource
1313
import datadog.trace.api.config.GeneralConfig
14-
import static datadog.trace.api.config.IastConfig.IAST_DEDUPLICATION_ENABLED
1514
import datadog.trace.api.function.TriConsumer
1615
import datadog.trace.api.function.TriFunction
1716
import datadog.trace.api.gateway.BlockResponseFunction
@@ -114,6 +113,8 @@ class GatewayBridgeSpecification extends DDSpecification {
114113
BiFunction<RequestContext, String, Flow<Void>> shellCmdCB
115114
BiFunction<RequestContext, String, Flow<Void>> userCB
116115
TriFunction<RequestContext, LoginEvent, String, Flow<Void>> loginEventCB
116+
BiFunction<RequestContext, StoredBodySupplier, Void> responseBodyStartCB
117+
BiFunction<RequestContext, StoredBodySupplier, Flow<Void>> responseBodyDoneCB
117118

118119
WafMetricCollector wafMetricCollector = Mock(WafMetricCollector)
119120

@@ -452,6 +453,8 @@ class GatewayBridgeSpecification extends DDSpecification {
452453
1 * ig.registerCallback(EVENTS.responseStarted(), _) >> { responseStartedCB = it[1]; null }
453454
1 * ig.registerCallback(EVENTS.responseHeader(), _) >> { respHeaderCB = it[1]; null }
454455
1 * ig.registerCallback(EVENTS.responseHeaderDone(), _) >> { respHeadersDoneCB = it[1]; null }
456+
1 * ig.registerCallback(EVENTS.responseBodyStart(), _) >> { responseBodyStartCB = it[1]; null }
457+
1 * ig.registerCallback(EVENTS.responseBodyDone(), _) >> { responseBodyDoneCB = it[1]; null }
455458
1 * ig.registerCallback(EVENTS.grpcServerMethod(), _) >> { grpcServerMethodCB = it[1]; null }
456459
1 * ig.registerCallback(EVENTS.grpcServerRequestMessage(), _) >> { grpcServerRequestMessageCB = it[1]; null }
457460
1 * ig.registerCallback(EVENTS.graphqlServerRequestMessage(), _) >> { graphqlServerRequestMessageCB = it[1]; null }
@@ -933,7 +936,7 @@ class GatewayBridgeSpecification extends DDSpecification {
933936
}
934937

935938
@Override
936-
def <T> T getOrCreateMetaStructTop(String key, Function<String, T> defaultValue) {
939+
<T> T getOrCreateMetaStructTop(String key, Function<String, T> defaultValue) {
937940
return null
938941
}
939942

@@ -991,7 +994,7 @@ class GatewayBridgeSpecification extends DDSpecification {
991994
getTraceSegment() >> traceSegment
992995
}
993996
final spanInfo = Mock(AgentSpan) {
994-
getTags() >> ['http.route':'/']
997+
getTags() >> ['http.route': '/']
995998
}
996999

9971000
when:

dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/BlockingResponseHelper.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ public static HttpResponse handleFinishForWaf(final AgentSpan span, final HttpRe
3737
}
3838
Flow<Void> flow =
3939
DECORATE.callIGCallbackResponseAndHeaders(
40-
span, response, response.status().intValue(), AkkaHttpServerHeaders.responseGetter());
40+
span,
41+
response,
42+
response.status().intValue(),
43+
AkkaHttpServerHeaders.responseGetter(),
44+
null);
4145
Flow.Action action = flow.getAction();
4246
if (action instanceof Flow.Action.RequestBlockingAction) {
4347
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyCommitResponseInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ static class CommitResponseAdvice {
8484

8585
Flow<Void> flow =
8686
DECORATE.callIGCallbackResponseAndHeaders(
87-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
87+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
8888
Flow.Action action = flow.getAction();
8989
if (action instanceof Flow.Action.RequestBlockingAction) {
9090
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyCommitResponseInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static class CommitResponseAdvice {
9898

9999
Flow<Void> flow =
100100
DECORATE.callIGCallbackResponseAndHeaders(
101-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
101+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
102102
Flow.Action action = flow.getAction();
103103
if (action instanceof Flow.Action.RequestBlockingAction) {
104104
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ static class CommitResponseAdvice {
119119

120120
Flow<Void> flow =
121121
DECORATE.callIGCallbackResponseAndHeaders(
122-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
122+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
123123
Flow.Action action = flow.getAction();
124124
if (action instanceof Flow.Action.RequestBlockingAction) {
125125
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public class JettyCommitResponseHelper {
6969
Response resp = connection.getResponse();
7070
Flow<Void> flow =
7171
JettyDecorator.DECORATE.callIGCallbackResponseAndHeaders(
72-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
72+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
7373
Flow.Action action = flow.getAction();
7474
if (action instanceof Flow.Action.RequestBlockingAction) {
7575
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-9/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public class JettyCommitResponseHelper {
6969

7070
Flow<Void> flow =
7171
DECORATE.callIGCallbackResponseAndHeaders(
72-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
72+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
7373
Flow.Action action = flow.getAction();
7474
if (action instanceof Flow.Action.RequestBlockingAction) {
7575
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-9/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public class JettyCommitResponseHelper {
6868
Response resp = connection.getResponse();
6969
Flow<Void> flow =
7070
DECORATE.callIGCallbackResponseAndHeaders(
71-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
71+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
7272
Flow.Action action = flow.getAction();
7373
if (action instanceof Flow.Action.RequestBlockingAction) {
7474
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

dd-java-agent/instrumentation/jetty-9/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public class JettyCommitResponseHelper {
7171
Response resp = connection.getResponse();
7272
Flow<Void> flow =
7373
DECORATE.callIGCallbackResponseAndHeaders(
74-
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER);
74+
span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER, null);
7575
Flow.Action action = flow.getAction();
7676
if (action instanceof Flow.Action.RequestBlockingAction) {
7777
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;

0 commit comments

Comments
 (0)