88import static java .util .Collections .emptyList ;
99
1010import io .opentelemetry .instrumentation .api .semconv .http .HttpClientAttributesGetter ;
11+ import java .lang .invoke .MethodHandle ;
12+ import java .lang .invoke .MethodHandles ;
13+ import java .lang .invoke .MethodType ;
1114import java .util .List ;
1215import javax .annotation .Nullable ;
16+ import org .springframework .http .HttpHeaders ;
1317import org .springframework .web .reactive .function .client .ClientRequest ;
1418import org .springframework .web .reactive .function .client .ClientResponse ;
1519
@@ -21,6 +25,28 @@ public enum WebClientHttpAttributesGetter
2125 implements HttpClientAttributesGetter <ClientRequest , ClientResponse > {
2226 INSTANCE ;
2327
28+ private static final MethodHandle GET_HEADERS ;
29+
30+ static {
31+ // since webflux 7.0
32+ MethodHandle methodHandle =
33+ findGetHeadersMethod (MethodType .methodType (List .class , String .class , List .class ));
34+ if (methodHandle == null ) {
35+ // up to webflux 7.0
36+ methodHandle =
37+ findGetHeadersMethod (MethodType .methodType (Object .class , Object .class , Object .class ));
38+ }
39+ GET_HEADERS = methodHandle ;
40+ }
41+
42+ private static MethodHandle findGetHeadersMethod (MethodType methodType ) {
43+ try {
44+ return MethodHandles .lookup ().findVirtual (HttpHeaders .class , "getOrDefault" , methodType );
45+ } catch (Throwable t ) {
46+ return null ;
47+ }
48+ }
49+
2450 @ Override
2551 public String getUrlFull (ClientRequest request ) {
2652 return request .url ().toString ();
@@ -32,8 +58,16 @@ public String getHttpRequestMethod(ClientRequest request) {
3258 }
3359
3460 @ Override
61+ @ SuppressWarnings ("unchecked" ) // casting MethodHandle.invoke result
3562 public List <String > getHttpRequestHeader (ClientRequest request , String name ) {
36- return request .headers ().getOrDefault (name , emptyList ());
63+ if (GET_HEADERS != null ) {
64+ try {
65+ return (List <String >) GET_HEADERS .invoke (request .headers (), name , emptyList ());
66+ } catch (Throwable t ) {
67+ // ignore
68+ }
69+ }
70+ return emptyList ();
3771 }
3872
3973 @ Override
0 commit comments