diff --git a/build.gradle.kts b/build.gradle.kts index f9c71dbe..90b6d112 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "io.github.smiley4" -version = "0.5.1" +version = "0.5.2" repositories { mavenCentral() diff --git a/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerPlugin.kt b/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerPlugin.kt index 4bf6559c..b773480c 100644 --- a/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerPlugin.kt +++ b/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerPlugin.kt @@ -44,6 +44,7 @@ val SwaggerUI = createApplicationPlugin(name = "SwaggerUI", createConfiguration pluginConfig.getSwaggerUI().swaggerUrl, pluginConfig.getSwaggerUI().forwardRoot, pluginConfig.getSwaggerUI().authentication, + application.environment.config, SWAGGER_UI_WEBJARS_VERSION, ) { apiSpecJson }.setup(application) diff --git a/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerRouting.kt b/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerRouting.kt index cd24eea3..c21d6af3 100644 --- a/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerRouting.kt +++ b/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerRouting.kt @@ -3,6 +3,7 @@ package io.github.smiley4.ktorswaggerui import io.ktor.server.application.Application import io.ktor.server.application.call import io.ktor.server.auth.authenticate +import io.ktor.server.config.ApplicationConfig import io.ktor.server.response.respondRedirect import io.ktor.server.routing.Route import io.ktor.server.routing.get @@ -17,6 +18,7 @@ class SwaggerRouting( private val swaggerUrl: String, private val forwardRoot: Boolean, private val authentication: String?, + appConfig: ApplicationConfig, swaggerWebjarVersion: String, jsonSpecProvider: () -> String ) { @@ -25,10 +27,22 @@ class SwaggerRouting( private val controller = SwaggerController( swaggerWebjarVersion = swaggerWebjarVersion, - apiSpecUrl = "/" + (if (swaggerUrl.startsWith("/")) swaggerUrl.substring(1) else swaggerUrl) + "/api.json", + apiSpecUrl = getApiSpecUrl(appConfig), jsonSpecProvider = jsonSpecProvider ) + private fun getApiSpecUrl(appConfig: ApplicationConfig): String { + val rootPath = appConfig.propertyOrNull("ktor.deployment.rootPath")?.getString()?.let { "/${dropSlashes(it)}" } ?: "" + return "$rootPath/${dropSlashes(swaggerUrl)}/api.json" + } + + private fun dropSlashes(str: String): String { + var value = str + value = if (value.startsWith("/")) value.substring(1) else value + value = if (value.endsWith("/")) value.substring(0, value.length - 1) else value + return value + } + /** * registers the required routes diff --git a/src/test/kotlin/io/github/smiley4/ktorswaggerui/examples/RootPathExample.kt b/src/test/kotlin/io/github/smiley4/ktorswaggerui/examples/RootPathExample.kt new file mode 100644 index 00000000..97fd559d --- /dev/null +++ b/src/test/kotlin/io/github/smiley4/ktorswaggerui/examples/RootPathExample.kt @@ -0,0 +1,47 @@ +package io.github.smiley4.ktorswaggerui.examples + +import io.github.smiley4.ktorswaggerui.SwaggerUI +import io.github.smiley4.ktorswaggerui.dsl.get +import io.ktor.http.HttpStatusCode +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.netty.EngineMain +import io.ktor.server.response.respondText +import io.ktor.server.routing.routing + + +fun main(args: Array): Unit = EngineMain.main(args) + +fun Application.module() { + + install(SwaggerUI) { + swagger { + swaggerUrl = "swagger-ui" + forwardRoot = true + } + info { + title = "Example API" + version = "latest" + description = "Example api for testing" + } + server { + url = "http://localhost:8080" + description = "Development server" + } + } + + routing { + get("hello", { + description = "Simple 'Hello World'- Route" + response { + HttpStatusCode.OK to { + description = "Successful Response" + } + } + }) { + call.respondText("Hello World!") + } + } +} + diff --git a/src/test/resources/application.conf b/src/test/resources/application.conf new file mode 100644 index 00000000..a04928e5 --- /dev/null +++ b/src/test/resources/application.conf @@ -0,0 +1,10 @@ +ktor { + deployment { + host = "localhost" + port = 8080 + rootPath = "/root" + } + application { + modules = [io.github.smiley4.ktorswaggerui.examples.RootPathExampleKt.module] + } +} \ No newline at end of file