Skip to content

Commit 187c585

Browse files
authored
Fix spring web latest dep test (#15301)
1 parent c4abb5a commit 187c585

File tree

1 file changed

+51
-20
lines changed

1 file changed

+51
-20
lines changed

instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebHttpAttributesGetter.java

Lines changed: 51 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,25 @@
1313
import java.lang.invoke.MethodType;
1414
import java.util.List;
1515
import javax.annotation.Nullable;
16+
import org.springframework.http.HttpHeaders;
1617
import org.springframework.http.HttpRequest;
1718
import org.springframework.http.client.ClientHttpResponse;
1819

1920
enum 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

Comments
 (0)