From 6644ff8b8baf9705b0d02558b4841367e988b4bb Mon Sep 17 00:00:00 2001 From: Pascal Krause Date: Tue, 28 Jul 2026 20:34:21 +0200 Subject: [PATCH] feat: support wildcards in determineContentType --- .../contract/impl/RequestBodyImpl.java | 4 +++- .../contract/impl/RequestBodyImplTest.java | 23 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/vertx/openapi/contract/impl/RequestBodyImpl.java b/src/main/java/io/vertx/openapi/contract/impl/RequestBodyImpl.java index 12d1e0c..8bf7dc9 100644 --- a/src/main/java/io/vertx/openapi/contract/impl/RequestBodyImpl.java +++ b/src/main/java/io/vertx/openapi/contract/impl/RequestBodyImpl.java @@ -23,6 +23,7 @@ import io.vertx.json.schema.JsonSchema; import io.vertx.openapi.contract.MediaType; import io.vertx.openapi.contract.RequestBody; +import io.vertx.openapi.mediatype.MediaTypeInfo; import io.vertx.openapi.mediatype.MediaTypeRegistration; import io.vertx.openapi.mediatype.MediaTypeRegistry; import java.util.Map; @@ -95,7 +96,8 @@ public MediaType determineContentType(String contentType) { } for (Map.Entry declaredType : content.entrySet()) { - if (condensedIdentifier.startsWith(removeWhiteSpaces(declaredType.getKey()))) { + if (MediaTypeInfo.of(removeWhiteSpaces(declaredType.getKey())) + .doesInclude(MediaTypeInfo.of(condensedIdentifier))) { return declaredType.getValue(); } } diff --git a/src/test/java/io/vertx/tests/contract/impl/RequestBodyImplTest.java b/src/test/java/io/vertx/tests/contract/impl/RequestBodyImplTest.java index b456125..fc8a6e7 100644 --- a/src/test/java/io/vertx/tests/contract/impl/RequestBodyImplTest.java +++ b/src/test/java/io/vertx/tests/contract/impl/RequestBodyImplTest.java @@ -27,7 +27,10 @@ import io.vertx.openapi.contract.OpenAPIContractException; import io.vertx.openapi.contract.RequestBody; import io.vertx.openapi.contract.impl.RequestBodyImpl; +import io.vertx.openapi.mediatype.ContentAnalyserFactory; +import io.vertx.openapi.mediatype.MediaTypePredicate; import io.vertx.openapi.mediatype.MediaTypeRegistry; +import io.vertx.openapi.mediatype.impl.DefaultMediaTypeRegistration; import java.nio.file.Path; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeAll; @@ -104,13 +107,16 @@ void testExceptions(String testId, ContractErrorType type, String msg) { } private RequestBodyImpl buildWithContent(String... contentTypes) { + return buildWithContentAndRegistry(MediaTypeRegistry.createDefault(), contentTypes); + } + + private RequestBodyImpl buildWithContentAndRegistry(MediaTypeRegistry registry, String... contentTypes) { JsonObject dummySchema = new JsonObject().put("schema", new JsonObject().put("type", "string")); JsonObject content = new JsonObject(); for (String type : contentTypes) { content.put(type, dummySchema); } - return new RequestBodyImpl(new JsonObject().put("content", content), DUMMY_OPERATION_ID, - MediaTypeRegistry.createDefault()); + return new RequestBodyImpl(new JsonObject().put("content", content), DUMMY_OPERATION_ID, registry); } @Test @@ -133,5 +139,18 @@ void testDetermineContentType() { .isEqualTo(APPLICATION_JSON_UTF8); assertThat(bodyBoth.determineContentType("application/text")).isNull(); + + // With wildcard content type + } + + @Test + void testDetermineContentTypeWithMediaTypeRange() { + String imageWildcard = "image/*"; + MediaTypeRegistry registry = MediaTypeRegistry.createDefault() + .register(new DefaultMediaTypeRegistration( + MediaTypePredicate.ofRegexp("image/.*"), ContentAnalyserFactory.noop())); + RequestBody requestBody = buildWithContentAndRegistry(registry, imageWildcard); + + assertThat(requestBody.determineContentType("image/png").getIdentifier()).isEqualTo(imageWildcard); } }