diff --git a/README.md b/README.md index 0a491222e..ef2a269ad 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Central_. ```kotlin dependencies { - implementation("dev.forst", "ktor-openapi-generator", "0.4.4") + implementation("dev.forst", "ktor-openapi-generator", "0.4.5") } ``` @@ -88,4 +88,4 @@ Extra Features: ## Examples -Take a look at [a few examples](https://github.com/papsign/Ktor-OpenAPI-Generator/wiki/A-few-examples) \ No newline at end of file +Take a look at [a few examples](https://github.com/papsign/Ktor-OpenAPI-Generator/wiki/A-few-examples) diff --git a/build.gradle.kts b/build.gradle.kts index 820273a10..47295d1c6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import java.net.URL plugins { - kotlin("jvm") version "1.6.21" + kotlin("jvm") version "1.7.10" `maven-publish` signing @@ -25,7 +25,7 @@ dependencies { implementation(kotlin("stdlib-jdk8")) // Ktor server dependencies - val ktorVersion = "2.0.3" + val ktorVersion = "2.1.0" implementation("io.ktor", "ktor-server-core", ktorVersion) implementation("io.ktor", "ktor-server-auth", ktorVersion) implementation("io.ktor", "ktor-serialization-jackson", ktorVersion) diff --git a/src/main/kotlin/com/papsign/ktor/openapigen/annotations/mapping/OpenAPIName.kt b/src/main/kotlin/com/papsign/ktor/openapigen/annotations/mapping/OpenAPIName.kt index c0b3a66dc..5b874cbaf 100644 --- a/src/main/kotlin/com/papsign/ktor/openapigen/annotations/mapping/OpenAPIName.kt +++ b/src/main/kotlin/com/papsign/ktor/openapigen/annotations/mapping/OpenAPIName.kt @@ -12,8 +12,8 @@ private val cache = Collections.synchronizedMap(HashMap()) val KParameter.openAPIName: String? get() = cache.getOrPut(this) { - val caseSensitiveName = findAnnotation()?.name ?: name - if (findAnnotation() != null) caseSensitiveName?.toLowerCase() else caseSensitiveName + val caseSensitiveName = findAnnotation()?.name ?: name + if (findAnnotation() != null) caseSensitiveName?.lowercase(Locale.getDefault()) else caseSensitiveName } fun KParameter.remapOpenAPINames(map: Map): Map { diff --git a/src/main/kotlin/com/papsign/ktor/openapigen/annotations/type/string/lowercase/LowerCaseValidator.kt b/src/main/kotlin/com/papsign/ktor/openapigen/annotations/type/string/lowercase/LowerCaseValidator.kt index ddc173698..be0699e8f 100644 --- a/src/main/kotlin/com/papsign/ktor/openapigen/annotations/type/string/lowercase/LowerCaseValidator.kt +++ b/src/main/kotlin/com/papsign/ktor/openapigen/annotations/type/string/lowercase/LowerCaseValidator.kt @@ -3,10 +3,11 @@ package com.papsign.ktor.openapigen.annotations.type.string.lowercase import com.papsign.ktor.openapigen.getKType import com.papsign.ktor.openapigen.validation.Validator import com.papsign.ktor.openapigen.annotations.type.SingleTypeValidator +import java.util.Locale object LowerCaseValidator : SingleTypeValidator(getKType(), { LowerCaseValidator }), Validator { override fun validate(subject: T?): T? { @Suppress("UNCHECKED_CAST") - return (subject as String?)?.toLowerCase() as T? + return (subject as String?)?.lowercase(Locale.getDefault()) as T? } } diff --git a/src/main/kotlin/com/papsign/ktor/openapigen/content/type/multipart/MultipartFormDataContentProvider.kt b/src/main/kotlin/com/papsign/ktor/openapigen/content/type/multipart/MultipartFormDataContentProvider.kt index 070badf21..e93e0bba7 100644 --- a/src/main/kotlin/com/papsign/ktor/openapigen/content/type/multipart/MultipartFormDataContentProvider.kt +++ b/src/main/kotlin/com/papsign/ktor/openapigen/content/type/multipart/MultipartFormDataContentProvider.kt @@ -68,7 +68,7 @@ object MultipartFormDataContentProvider : BodyParser, OpenAPIGenModuleExtension private val typeContentTypes = HashMap>() - override suspend fun parseBody(type: KType, request: PipelineContext): T { + override suspend fun parseBody(clazz: KType, request: PipelineContext): T { val objectMap = HashMap() request.context.receiveMultipart().forEachPart { val name = it.name @@ -83,11 +83,12 @@ object MultipartFormDataContentProvider : BodyParser, OpenAPIGenModuleExtension is PartData.BinaryItem -> { objectMap[name] = ContentInputStream(it.contentType, it.provider().asStream()) } + else -> {} } } } @Suppress("UNCHECKED_CAST") - val ctor = (type.classifier as KClass).primaryConstructor!! + val ctor = (clazz.classifier as KClass).primaryConstructor!! return ctor.callBy(ctor.parameters.associateWith { val raw = objectMap[it.openAPIName] if ((raw == null || (raw !is InputStream && streamTypes.contains(it.type))) && it.type.isMarkedNullable) { diff --git a/src/main/kotlin/com/papsign/ktor/openapigen/modules/handlers/RouteHandler.kt b/src/main/kotlin/com/papsign/ktor/openapigen/modules/handlers/RouteHandler.kt index a763cdbfb..5d0eb2a87 100644 --- a/src/main/kotlin/com/papsign/ktor/openapigen/modules/handlers/RouteHandler.kt +++ b/src/main/kotlin/com/papsign/ktor/openapigen/modules/handlers/RouteHandler.kt @@ -10,6 +10,7 @@ import com.papsign.ktor.openapigen.modules.openapi.HandlerModule import com.papsign.ktor.openapigen.modules.openapi.OperationModule import com.papsign.ktor.openapigen.modules.providers.MethodProvider import com.papsign.ktor.openapigen.modules.providers.PathProvider +import java.util.Locale import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -25,7 +26,7 @@ object RouteHandler: HandlerModule { val operationModules = provider.ofType() apiGen.api.paths.getOrPut(path) { PathItemModel() }.also {pathItem -> methods.forEach { - val name = it.method.value.toLowerCase() + val name = it.method.value.lowercase(Locale.getDefault()) //if (pathItem.containsKey(name)) error("$path::$name already defined") val op = pathItem.getOrPut(name) { OperationModel() } as OperationModel operationModules.forEach { diff --git a/src/main/kotlin/com/papsign/ktor/openapigen/parameters/handlers/ModularParameterHandler.kt b/src/main/kotlin/com/papsign/ktor/openapigen/parameters/handlers/ModularParameterHandler.kt index c4b21bcae..50ff515c9 100644 --- a/src/main/kotlin/com/papsign/ktor/openapigen/parameters/handlers/ModularParameterHandler.kt +++ b/src/main/kotlin/com/papsign/ktor/openapigen/parameters/handlers/ModularParameterHandler.kt @@ -19,6 +19,7 @@ import com.papsign.ktor.openapigen.schema.builder.provider.FinalSchemaBuilderPro import io.ktor.http.Headers import io.ktor.http.Parameters import io.ktor.util.toMap +import java.util.Locale import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.full.findAnnotation @@ -29,7 +30,11 @@ class ModularParameterHandler(val parsers: Map>, val c override fun parse(parameters: Parameters, headers: Headers): T { return constructor.callBy(parsers.mapValues { - val value = it.value.build(it.key.name.toString(), it.key.remapOpenAPINames(parameters.toMap() + headers.toMap().entries.groupBy { it.key.toLowerCase() }.mapValues { it.value.flatMap { it.value } })) + val value = it.value.build(it.key.name.toString(), it.key.remapOpenAPINames(parameters.toMap() + headers.toMap().entries.groupBy { + it.key.lowercase( + Locale.getDefault() + ) + }.mapValues { it.value.flatMap { it.value } })) if (value != null || it.key.type.isMarkedNullable) { value } else {