1313import java .lang .invoke .MethodType ;
1414import java .util .List ;
1515import javax .annotation .Nullable ;
16+ import org .springframework .http .HttpHeaders ;
1617import org .springframework .http .HttpRequest ;
1718import org .springframework .http .client .ClientHttpResponse ;
1819
1920enum SpringWebHttpAttributesGetter
2021 implements HttpClientAttributesGetter <HttpRequest , ClientHttpResponse > {
2122 INSTANCE ;
2223
23- @ Override
24- public String getHttpRequestMethod (HttpRequest httpRequest ) {
25- return httpRequest .getMethod ().name ();
26- }
27-
28- @ Override
29- @ Nullable
30- public String getUrlFull (HttpRequest httpRequest ) {
31- return httpRequest .getURI ().toString ();
32- }
33-
34- @ Override
35- public List <String > getHttpRequestHeader (HttpRequest httpRequest , String name ) {
36- return httpRequest .getHeaders ().getOrDefault (name , emptyList ());
37- }
38-
3924 @ Nullable private static final MethodHandle GET_STATUS_CODE ;
40-
4125 @ Nullable private static final MethodHandle STATUS_CODE_VALUE ;
26+ @ Nullable private static final MethodHandle GET_HEADERS ;
4227
4328 static {
29+ MethodHandles .Lookup lookup = MethodHandles .publicLookup ();
30+
4431 MethodHandle getStatusCode = null ;
4532 MethodHandle statusCodeValue = null ;
4633 Class <?> httpStatusCodeClass = null ;
4734
48- MethodHandles .Lookup lookup = MethodHandles .publicLookup ();
49-
5035 try {
5136 httpStatusCodeClass = Class .forName ("org.springframework.http.HttpStatusCode" );
5237 } catch (ClassNotFoundException e ) {
@@ -73,6 +58,52 @@ public List<String> getHttpRequestHeader(HttpRequest httpRequest, String name) {
7358
7459 GET_STATUS_CODE = getStatusCode ;
7560 STATUS_CODE_VALUE = statusCodeValue ;
61+
62+ // since spring web 7.0
63+ MethodHandle methodHandle =
64+ findGetHeadersMethod (MethodType .methodType (List .class , String .class , List .class ));
65+ if (methodHandle == null ) {
66+ // up to spring web 7.0
67+ methodHandle =
68+ findGetHeadersMethod (MethodType .methodType (Object .class , Object .class , Object .class ));
69+ }
70+ GET_HEADERS = methodHandle ;
71+ }
72+
73+ private static MethodHandle findGetHeadersMethod (MethodType methodType ) {
74+ try {
75+ return MethodHandles .lookup ().findVirtual (HttpHeaders .class , "getOrDefault" , methodType );
76+ } catch (Throwable t ) {
77+ return null ;
78+ }
79+ }
80+
81+ @ Override
82+ public String getHttpRequestMethod (HttpRequest httpRequest ) {
83+ return httpRequest .getMethod ().name ();
84+ }
85+
86+ @ Override
87+ @ Nullable
88+ public String getUrlFull (HttpRequest httpRequest ) {
89+ return httpRequest .getURI ().toString ();
90+ }
91+
92+ @ Override
93+ public List <String > getHttpRequestHeader (HttpRequest httpRequest , String name ) {
94+ return getHeader (httpRequest .getHeaders (), name );
95+ }
96+
97+ @ SuppressWarnings ("unchecked" ) // casting MethodHandle.invoke result
98+ private static List <String > getHeader (HttpHeaders headers , String name ) {
99+ if (GET_HEADERS != null ) {
100+ try {
101+ return (List <String >) GET_HEADERS .invoke (headers , name , emptyList ());
102+ } catch (Throwable t ) {
103+ // ignore
104+ }
105+ }
106+ return emptyList ();
76107 }
77108
78109 @ Override
@@ -94,7 +125,7 @@ public Integer getHttpResponseStatusCode(
94125 @ Override
95126 public List <String > getHttpResponseHeader (
96127 HttpRequest httpRequest , ClientHttpResponse clientHttpResponse , String name ) {
97- return clientHttpResponse .getHeaders (). getOrDefault ( name , emptyList () );
128+ return getHeader ( clientHttpResponse .getHeaders (), name );
98129 }
99130
100131 @ Override
0 commit comments