Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Update Ktor to latest version #6

Merged
merged 2 commits into from
Aug 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
```

Expand Down Expand Up @@ -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)
Take a look at [a few examples](https://github.com/papsign/Ktor-OpenAPI-Generator/wiki/A-few-examples)
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import java.net.URL


plugins {
kotlin("jvm") version "1.6.21"
kotlin("jvm") version "1.7.10"

`maven-publish`
signing
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ private val cache = Collections.synchronizedMap(HashMap<KParameter, String?>())

val KParameter.openAPIName: String?
get() = cache.getOrPut(this) {
val caseSensitiveName = findAnnotation<OpenAPIName>()?.name ?: name
if (findAnnotation<HeaderParam>() != null) caseSensitiveName?.toLowerCase() else caseSensitiveName
val caseSensitiveName = findAnnotation<OpenAPIName>()?.name ?: name
if (findAnnotation<HeaderParam>() != null) caseSensitiveName?.lowercase(Locale.getDefault()) else caseSensitiveName
}

fun <T> KParameter.remapOpenAPINames(map: Map<String, T>): Map<String, T> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<LowerCase>(getKType<String>(), { LowerCaseValidator }), Validator {
override fun <T> validate(subject: T?): T? {
@Suppress("UNCHECKED_CAST")
return (subject as String?)?.toLowerCase() as T?
return (subject as String?)?.lowercase(Locale.getDefault()) as T?
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ object MultipartFormDataContentProvider : BodyParser, OpenAPIGenModuleExtension
private val typeContentTypes = HashMap<KType, Map<String, MediaTypeEncodingModel>>()


override suspend fun <T : Any> parseBody(type: KType, request: PipelineContext<Unit, ApplicationCall>): T {
override suspend fun <T : Any> parseBody(clazz: KType, request: PipelineContext<Unit, ApplicationCall>): T {
val objectMap = HashMap<String, Any>()
request.context.receiveMultipart().forEachPart {
val name = it.name
Expand All @@ -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<T>).primaryConstructor!!
val ctor = (clazz.classifier as KClass<T>).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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -25,7 +26,7 @@ object RouteHandler: HandlerModule {
val operationModules = provider.ofType<OperationModule>()
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -29,7 +30,11 @@ class ModularParameterHandler<T>(val parsers: Map<KParameter, Builder<*>>, 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 {
Expand Down