1
1
/*
2
- * Copyright 2002-2024 the original author or authors.
2
+ * Copyright 2002-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -449,20 +449,21 @@ public <V> Flux<V> exchangeToFlux(Function<ClientResponse, ? extends Flux<V>> re
449
449
@ Override
450
450
public Mono <ClientResponse > exchange () {
451
451
ClientRequest .Builder requestBuilder = initRequestBuilder ();
452
- ClientRequestObservationContext observationContext = new ClientRequestObservationContext (requestBuilder );
453
452
return Mono .deferContextual (contextView -> {
454
453
Observation observation = ClientHttpObservationDocumentation .HTTP_REACTIVE_CLIENT_EXCHANGES .observation (observationConvention ,
455
- DEFAULT_OBSERVATION_CONVENTION , () -> observationContext , observationRegistry );
454
+ DEFAULT_OBSERVATION_CONVENTION , () -> new ClientRequestObservationContext ( requestBuilder ) , observationRegistry );
456
455
observation
457
456
.parentObservation (contextView .getOrDefault (ObservationThreadLocalAccessor .KEY , null ))
458
457
.start ();
459
- ExchangeFilterFunction filterFunction = new ObservationFilterFunction (observationContext );
458
+ ExchangeFilterFunction filterFunction = new ObservationFilterFunction (observation . getContext () );
460
459
if (filterFunctions != null ) {
461
460
filterFunction = filterFunctions .andThen (filterFunction );
462
461
}
463
462
ClientRequest request = requestBuilder .build ();
464
- observationContext .setUriTemplate ((String ) request .attribute (URI_TEMPLATE_ATTRIBUTE ).orElse (null ));
465
- observationContext .setRequest (request );
463
+ if (observation .getContext () instanceof ClientRequestObservationContext observationContext ) {
464
+ observationContext .setUriTemplate ((String ) request .attribute (URI_TEMPLATE_ATTRIBUTE ).orElse (null ));
465
+ observationContext .setRequest (request );
466
+ }
466
467
final ExchangeFilterFunction finalFilterFunction = filterFunction ;
467
468
Mono <ClientResponse > responseMono = Mono .defer (
468
469
() -> finalFilterFunction .apply (exchangeFunction ).exchange (request ))
@@ -478,7 +479,8 @@ public Mono<ClientResponse> exchange() {
478
479
.doOnNext (response -> responseReceived .set (true ))
479
480
.doOnError (observation ::error )
480
481
.doFinally (signalType -> {
481
- if (signalType == SignalType .CANCEL && !responseReceived .get ()) {
482
+ if (signalType == SignalType .CANCEL && !responseReceived .get () &&
483
+ observation .getContext () instanceof ClientRequestObservationContext observationContext ) {
482
484
observationContext .setAborted (true );
483
485
}
484
486
observation .stop ();
@@ -734,15 +736,19 @@ public Mono<? extends Throwable> apply(ClientResponse response) {
734
736
735
737
private static class ObservationFilterFunction implements ExchangeFilterFunction {
736
738
737
- private final ClientRequestObservationContext observationContext ;
739
+ private final Observation . Context observationContext ;
738
740
739
- ObservationFilterFunction (ClientRequestObservationContext observationContext ) {
741
+ ObservationFilterFunction (Observation . Context observationContext ) {
740
742
this .observationContext = observationContext ;
741
743
}
742
744
743
745
@ Override
744
746
public Mono <ClientResponse > filter (ClientRequest request , ExchangeFunction next ) {
745
- return next .exchange (request ).doOnNext (this .observationContext ::setResponse );
747
+ Mono <ClientResponse > exchange = next .exchange (request );
748
+ if (this .observationContext instanceof ClientRequestObservationContext clientContext ) {
749
+ exchange = exchange .doOnNext (clientContext ::setResponse );
750
+ }
751
+ return exchange ;
746
752
}
747
753
}
748
754
0 commit comments