Skip to content

Commit b375f9f

Browse files
committed
Ignore parameters when checking if */* is accepted
Previously the parameters were not ignored so */*;q=0.8 was not identified as accepting */*. As a result, the most recent producible content type was returned rather than the default. This commit updates the argument resolver to ignore parameters. The default content type is now produced in response to a request that accepts */*, irrespective of its parameters. Fixes gh-28446
1 parent ce38d59 commit b375f9f

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ProducibleOperationArgumentResolver.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private Enum<? extends Producible<?>> resolveProducible(Class<Enum<? extends Pro
6565
Enum<? extends Producible<?>> result = null;
6666
for (String accept : accepts) {
6767
for (String mimeType : MimeTypeUtils.tokenize(accept)) {
68-
result = mostRecent(result, forMimeType(values, mimeType));
68+
result = mostRecent(result, forMimeType(values, MimeTypeUtils.parseMimeType(mimeType)));
6969
}
7070
}
7171
return result;
@@ -78,14 +78,10 @@ private Enum<? extends Producible<?>> mostRecent(Enum<? extends Producible<?>> e
7878
return (candidateOrdinal > existingOrdinal) ? candidate : existing;
7979
}
8080

81-
private Enum<? extends Producible<?>> forMimeType(List<Enum<? extends Producible<?>>> values, String mimeType) {
82-
if ("*/*".equals(mimeType)) {
81+
private Enum<? extends Producible<?>> forMimeType(List<Enum<? extends Producible<?>>> values, MimeType mimeType) {
82+
if (mimeType.isWildcardType() && mimeType.isWildcardSubtype()) {
8383
return getDefaultValue(values);
8484
}
85-
return forMimeType(values, MimeTypeUtils.parseMimeType(mimeType));
86-
}
87-
88-
private Enum<? extends Producible<?>> forMimeType(List<Enum<? extends Producible<?>>> values, MimeType mimeType) {
8985
for (Enum<? extends Producible<?>> candidate : values) {
9086
if (mimeType.isCompatibleWith(((Producible<?>) candidate).getProducedMimeType())) {
9187
return candidate;

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusScrapeEndpointIntegrationTests.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,25 @@ class PrometheusScrapeEndpointIntegrationTests {
4141

4242
@WebEndpointTest
4343
void scrapeHasContentTypeText004ByDefault(WebTestClient client) {
44+
String expectedContentType = TextFormat.CONTENT_TYPE_004;
45+
assertThat(TextFormat.chooseContentType(null)).isEqualTo(expectedContentType);
4446
client.get().uri("/actuator/prometheus").exchange().expectStatus().isOk().expectHeader()
45-
.contentType(MediaType.parseMediaType(TextFormat.CONTENT_TYPE_004)).expectBody(String.class)
47+
.contentType(MediaType.parseMediaType(expectedContentType)).expectBody(String.class)
4648
.value((body) -> assertThat(body).contains("counter1_total").contains("counter2_total")
4749
.contains("counter3_total"));
4850
}
4951

52+
@WebEndpointTest
53+
void scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(WebTestClient client) {
54+
String expectedContentType = TextFormat.CONTENT_TYPE_004;
55+
String accept = "*/*;q=0.8";
56+
assertThat(TextFormat.chooseContentType(accept)).isEqualTo(expectedContentType);
57+
client.get().uri("/actuator/prometheus").accept(MediaType.parseMediaType(accept)).exchange().expectStatus()
58+
.isOk().expectHeader().contentType(MediaType.parseMediaType(expectedContentType))
59+
.expectBody(String.class).value((body) -> assertThat(body).contains("counter1_total")
60+
.contains("counter2_total").contains("counter3_total"));
61+
}
62+
5063
@WebEndpointTest
5164
void scrapeCanProduceOpenMetrics100(WebTestClient client) {
5265
MediaType openMetrics = MediaType.parseMediaType(TextFormat.CONTENT_TYPE_OPENMETRICS_100);

0 commit comments

Comments
 (0)