diff --git a/openai-java-client-okhttp/build.gradle.kts b/openai-java-client-okhttp/build.gradle.kts index 4d1eb6170..c54e760a6 100644 --- a/openai-java-client-okhttp/build.gradle.kts +++ b/openai-java-client-okhttp/build.gradle.kts @@ -11,4 +11,11 @@ dependencies { testImplementation(kotlin("test")) testImplementation("org.assertj:assertj-core:3.27.7") testImplementation("com.github.tomakehurst:wiremock-jre8:2.35.2") + + constraints { + // Keep handlebars-helpers at 4.3.1: WireMock 2 links helper classes moved in 4.5.x. + testImplementation("com.github.jknack:handlebars:4.5.3") { + because("WireMock's transitive 4.3.1 dependency is affected by CVE-2026-55760") + } + } } diff --git a/openai-java-core/build.gradle.kts b/openai-java-core/build.gradle.kts index b386f1dbb..9828120db 100644 --- a/openai-java-core/build.gradle.kts +++ b/openai-java-core/build.gradle.kts @@ -55,6 +55,13 @@ dependencies { testImplementation("org.mockito:mockito-core:5.14.2") testImplementation("org.mockito:mockito-junit-jupiter:5.14.2") testImplementation("org.mockito.kotlin:mockito-kotlin:4.1.0") + + constraints { + // Keep handlebars-helpers at 4.3.1: WireMock 2 links helper classes moved in 4.5.x. + testImplementation("com.github.jknack:handlebars:4.5.3") { + because("WireMock's transitive 4.3.1 dependency is affected by CVE-2026-55760") + } + } } // Re-run the compiled tests against the Jackson version consumers receive by default. Service tests diff --git a/openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt new file mode 100644 index 000000000..a8c91b644 --- /dev/null +++ b/openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt @@ -0,0 +1,44 @@ +package com.openai.core + +import com.github.tomakehurst.wiremock.WireMockServer +import com.github.tomakehurst.wiremock.client.WireMock.aResponse +import com.github.tomakehurst.wiremock.client.WireMock.get +import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig +import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer +import java.net.HttpURLConnection +import java.net.URL +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +internal class WireMockHandlebarsCompatibilityTest { + + @Test + fun rendersResponseTemplate() { + val server = + WireMockServer( + wireMockConfig().dynamicPort().extensions(ResponseTemplateTransformer(false)) + ) + server.start() + + try { + server.stubFor( + get(urlEqualTo("/greeting")) + .willReturn( + aResponse() + .withTransformers("response-template") + .withBody("Hello {{request.headers.X-Name}}!") + ) + ) + + val connection = + URL("${server.baseUrl()}/greeting").openConnection() as HttpURLConnection + connection.setRequestProperty("X-Name", "SDK") + + assertThat(connection.inputStream.bufferedReader().use { it.readText() }) + .isEqualTo("Hello SDK!") + } finally { + server.stop() + } + } +}