Skip to content

Commit

Permalink
Ignore parameters when checking if */* is accepted
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wilkinsona committed Oct 28, 2021
1 parent ce38d59 commit b375f9f
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 8 deletions.
Expand Up @@ -65,7 +65,7 @@ private Enum<? extends Producible<?>> resolveProducible(Class<Enum<? extends Pro
Enum<? extends Producible<?>> result = null;
for (String accept : accepts) {
for (String mimeType : MimeTypeUtils.tokenize(accept)) {
result = mostRecent(result, forMimeType(values, mimeType));
result = mostRecent(result, forMimeType(values, MimeTypeUtils.parseMimeType(mimeType)));
}
}
return result;
Expand All @@ -78,14 +78,10 @@ private Enum<? extends Producible<?>> mostRecent(Enum<? extends Producible<?>> e
return (candidateOrdinal > existingOrdinal) ? candidate : existing;
}

private Enum<? extends Producible<?>> forMimeType(List<Enum<? extends Producible<?>>> values, String mimeType) {
if ("*/*".equals(mimeType)) {
private Enum<? extends Producible<?>> forMimeType(List<Enum<? extends Producible<?>>> values, MimeType mimeType) {
if (mimeType.isWildcardType() && mimeType.isWildcardSubtype()) {
return getDefaultValue(values);
}
return forMimeType(values, MimeTypeUtils.parseMimeType(mimeType));
}

private Enum<? extends Producible<?>> forMimeType(List<Enum<? extends Producible<?>>> values, MimeType mimeType) {
for (Enum<? extends Producible<?>> candidate : values) {
if (mimeType.isCompatibleWith(((Producible<?>) candidate).getProducedMimeType())) {
return candidate;
Expand Down
Expand Up @@ -41,12 +41,25 @@ class PrometheusScrapeEndpointIntegrationTests {

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

@WebEndpointTest
void scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(WebTestClient client) {
String expectedContentType = TextFormat.CONTENT_TYPE_004;
String accept = "*/*;q=0.8";
assertThat(TextFormat.chooseContentType(accept)).isEqualTo(expectedContentType);
client.get().uri("/actuator/prometheus").accept(MediaType.parseMediaType(accept)).exchange().expectStatus()
.isOk().expectHeader().contentType(MediaType.parseMediaType(expectedContentType))
.expectBody(String.class).value((body) -> assertThat(body).contains("counter1_total")
.contains("counter2_total").contains("counter3_total"));
}

@WebEndpointTest
void scrapeCanProduceOpenMetrics100(WebTestClient client) {
MediaType openMetrics = MediaType.parseMediaType(TextFormat.CONTENT_TYPE_OPENMETRICS_100);
Expand Down

0 comments on commit b375f9f

Please sign in to comment.