diff --git a/CHANGELOG.md b/CHANGELOG.md index c255949536c..9a1c7c583fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.8.9 + +* `Ktor`: + * `Server`: + * Fixes in `uniloadMultipart` + * `Client`: + * Fixes in `unimultipart` +* `FSM`: + * Fixes in `DefaultUpdatableStatesMachine` + ## 0.8.8 * `Versions`: diff --git a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt index deadfb62324..8d5a53f41bb 100644 --- a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt +++ b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt @@ -28,12 +28,12 @@ open class DefaultUpdatableStatesMachine( override suspend fun performStateUpdate(previousState: Optional, actualState: T, scope: CoroutineScope) { statesJobsMutex.withLock { - if (previousState.dataOrNull() != actualState) { + if (compare(previousState, actualState)) { statesJobs[actualState] ?.cancel() } val job = previousState.mapOnPresented { statesJobs.remove(it) - } ?: scope.launch { + } ?.takeIf { it.isActive } ?: scope.launch { performUpdate(actualState) }.also { job -> job.invokeOnCompletion { _ -> @@ -52,6 +52,8 @@ open class DefaultUpdatableStatesMachine( } } + protected open suspend fun compare(previous: Optional, new: T): Boolean = previous.dataOrNull() != new + override suspend fun updateChain(currentState: T, newState: T) { statesManager.update(currentState, newState) } diff --git a/gradle.properties b/gradle.properties index df127369aba..11b070657eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -45,5 +45,5 @@ dokka_version=1.5.31 # Project data group=dev.inmo -version=0.8.8 -android_code_version=88 +version=0.8.9 +android_code_version=89 diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt index e6725a2ed24..0cc8af023aa 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt @@ -140,7 +140,7 @@ suspend fun HttpClient.unimultipart( inputProvider, Headers.build { append(HttpHeaders.ContentType, mimetype) - append(HttpHeaders.ContentDisposition, "filename=$filename") + append(HttpHeaders.ContentDisposition, "filename=\"$filename\"") dataHeadersBuilder() } ) diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt index 344092679c9..fac6c49af08 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt @@ -180,7 +180,13 @@ suspend fun ApplicationCall.uniloadMultipartFile( "bytes" -> { val name = FileName(it.originalFileName ?: error("File name is unknown for default part")) resultInput = MPPFile.createTempFile( - name.nameWithoutExtension, + name.nameWithoutExtension.let { + var resultName = it + while (resultName.length < 3) { + resultName += "_" + } + resultName + }, ".${name.extension}" ).apply { outputStream().use { fileStream -> @@ -216,7 +222,13 @@ suspend fun ApplicationCall.uniloadMultipartFile( if (it.name == "bytes") { val name = FileName(it.originalFileName ?: error("File name is unknown for default part")) resultInput = MPPFile.createTempFile( - name.nameWithoutExtension, + name.nameWithoutExtension.let { + var resultName = it + while (resultName.length < 3) { + resultName += "_" + } + resultName + }, ".${name.extension}" ).apply { outputStream().use { fileStream ->