Size: a a a

2020 July 20

M

Mi in Kotlin JVM
io.ktor.utils.io.charsets.MalformedInputException: Input length = 1
at io.ktor.utils.io.charsets.CharsetJVMKt.throwExceptionWrapped(CharsetJVM.kt:323)
at io.ktor.utils.io.charsets.CharsetJVMKt.encodeImpl(CharsetJVM.kt:48)
at io.ktor.utils.io.charsets.EncodingKt.encodeToImpl(Encoding.kt:202)
at io.ktor.utils.io.charsets.EncodingKt.encode(Encoding.kt:58)
at io.ktor.utils.io.charsets.EncodingKt.encode$default(Encoding.kt:57)
at io.ktor.http.CodecsKt.encodeURLParameter(Codecs.kt:113)
at io.ktor.http.HttpUrlEncodedKt$formUrlEncodeTo$1.invoke(HttpUrlEncoded.kt:49)
at io.ktor.http.HttpUrlEncodedKt$formUrlEncodeTo$1.invoke(HttpUrlEncoded.kt)
at kotlin.text.StringsKt__AppendableKt.appendElement(Appendable.kt:71)
at kotlin.collections.CollectionsKt___CollectionsKt.joinTo(_Collections.kt:2519)
at kotlin.collections.CollectionsKt___CollectionsKt.joinTo$default(_Collections.kt:2513)
at io.ktor.http.HttpUrlEncodedKt.formUrlEncodeTo(HttpUrlEncoded.kt:41)
at io.ktor.http.HttpUrlEncodedKt.formUrlEncodeTo(HttpUrlEncoded.kt:68)
at io.ktor.http.URLUtilsKt.appendUrlFullPath(URLUtils.kt:99)
at io.ktor.http.URLUtilsKt.getFullPath(URLUtils.kt:77)
at io.ktor.http.Url.toString(URLBuilder.kt:127)
at io.ktor.http.URLUtilsJvmKt.toURI(URLUtilsJvm.kt:51)
at io.ktor.client.engine.apache.ApacheRequestProducer.setupRequest(ApacheRequestProducer.kt:125)
at io.ktor.client.engine.apache.ApacheRequestProducer.<init>(ApacheRequestProducer.kt:37)
at io.ktor.client.engine.apache.ApacheEngine.execute(ApacheEngine.kt:36)
at io.ktor.client.engine.HttpClientEngine$executeWithinCallContext$2.invokeSuspend(HttpClientEngine.kt:83)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
источник

M

Mi in Kotlin JVM
при отправке запроса который содержи эмоджи флага
источник

RI

Ruslan Ibragimov in Kotlin JVM
В query params?
источник

M

Mi in Kotlin JVM
да, в пост запросе через
parameter("text", text)
источник

M

Mi in Kotlin JVM
но при этом странно, что в большинстве случаев оно адекватно обрабатывается, даже те же самые эмоджи
источник

RI

Ruslan Ibragimov in Kotlin JVM
Баг в энкодере, 100%
источник

AN

Alexander Nozik in Kotlin JVM
У меня что-то такое было. Но не помню по какому поводу
источник

OY

Oleg Yakovlev in Kotlin JVM
Всем привет, вопрос знатокам ktor

Открываю соединение, и устанавливаю ожидание на получение команды.

Допустим чат у меня, а вызвав команду /calc запускается функция совместного калькулятора (это чисто для примера, чтоб понятна была концепция).

Подключаются клиенты, чат работает корректно, один из клиентов пишет /calc и вызывается функция, ему пишет 0. Теперь этот клиент пишет +2, выводит ответ 2, пишет +5, ответ 7. Но другие клиенты еще на моменте (incoming.receive() as Frame.Text).readText(). Есть каакой-то способ прервать им это со стороны сервера и чтобы они могли продолжить работать уже с вызваанной функцией.

Сейчас это работает через статус клиента, что не очень удобно и клиенту все равно нужно ввести комнаду, а дальше уже проверяя статус его введет в ту же функцию, но тогда и считать каждому будет отдельно, а нужна “совместная работа”.

webSocket("/") {
while (true) {
val text = (incoming.receive() as Frame.Text).readText()
when {
text.contains(‘/calc’) -> {
// запускаю функцию калькулятора
}
else -> {
if () {…} // Здесь проверяю статус клиента и вызываю ту же самую функцию
}
}
}
}
источник

AM

Andrew Mikhaylov in Kotlin JVM
Oleg Yakovlev
Всем привет, вопрос знатокам ktor

Открываю соединение, и устанавливаю ожидание на получение команды.

Допустим чат у меня, а вызвав команду /calc запускается функция совместного калькулятора (это чисто для примера, чтоб понятна была концепция).

Подключаются клиенты, чат работает корректно, один из клиентов пишет /calc и вызывается функция, ему пишет 0. Теперь этот клиент пишет +2, выводит ответ 2, пишет +5, ответ 7. Но другие клиенты еще на моменте (incoming.receive() as Frame.Text).readText(). Есть каакой-то способ прервать им это со стороны сервера и чтобы они могли продолжить работать уже с вызваанной функцией.

Сейчас это работает через статус клиента, что не очень удобно и клиенту все равно нужно ввести комнаду, а дальше уже проверяя статус его введет в ту же функцию, но тогда и считать каждому будет отдельно, а нужна “совместная работа”.

webSocket("/") {
while (true) {
val text = (incoming.receive() as Frame.Text).readText()
when {
text.contains(‘/calc’) -> {
// запускаю функцию калькулятора
}
else -> {
if () {…} // Здесь проверяю статус клиента и вызываю ту же самую функцию
}
}
}
}
Не могу сказать, что прям хорошо понял суть, но: если вам нужна кооперация между несколькими клиентами — заводите общий способ общения между ними. В корутинах очередь сообщений обычно реализуется как канал.
Создаёте канал.
Делаете так, что при подключении корутина ждёт либо сообщение из вебсокета, либо объект из канала (читать про select в доке по корутинам).
При получении сообщения что из канала, что из вебсокета, обрабатываете его с учётом вашей логики. Опционально постите другие сообщения в канал.
При надобности, конечно, можно организовать несколько каналов. Как только вырисуется конкретный код, который оперирует каналами — уносите его в саспенд-функцию, которую впредь можно будет спокойно протестировать.
Конкретнее трудно что-либо сказать, так как ни описание, ни код я не особо понял, к сожалению.
Надеюсь, натолкнул вас на мысли.
источник

OY

Oleg Yakovlev in Kotlin JVM
Andrew Mikhaylov
Не могу сказать, что прям хорошо понял суть, но: если вам нужна кооперация между несколькими клиентами — заводите общий способ общения между ними. В корутинах очередь сообщений обычно реализуется как канал.
Создаёте канал.
Делаете так, что при подключении корутина ждёт либо сообщение из вебсокета, либо объект из канала (читать про select в доке по корутинам).
При получении сообщения что из канала, что из вебсокета, обрабатываете его с учётом вашей логики. Опционально постите другие сообщения в канал.
При надобности, конечно, можно организовать несколько каналов. Как только вырисуется конкретный код, который оперирует каналами — уносите его в саспенд-функцию, которую впредь можно будет спокойно протестировать.
Конкретнее трудно что-либо сказать, так как ни описание, ни код я не особо понял, к сожалению.
Надеюсь, натолкнул вас на мысли.
спасибо за ответ!
поизучаю про каналы
источник

AM

Andrew Mikhaylov in Kotlin JVM
Oleg Yakovlev
спасибо за ответ!
поизучаю про каналы
Я б советовал взять официальную документацию и пробежаться по ней.
https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html
С первого раза, само собой, все концепты в общую картину не сложатся, но хоть какое-то представление об аппарате должно начать формироваться. Дальше уже можно идти и читать тырнетики.
источник

AM

Andrew Mikhaylov in Kotlin JVM
Можно, конечно, как альтернативу курс какой-нибудь хороший взять, но тут я советом не помогу.
источник

AM

Andrew Mikhaylov in Kotlin JVM
Почему сначала доку — потому что в интернете о корутинах пишут как умные люди, так и глупые. Последних на медиуме больше, к сожалению.
источник

OY

Oleg Yakovlev in Kotlin JVM
в любом случае спасибо!)
источник
2020 July 21

З

Захар in Kotlin JVM
Существуют ли готовые библиотеки для авторизации в кторе через firebase? я нашел только такую, но непонятно как ей пользоваться.
Попытался сам как-то заставить это работать, но выбрасывает исключение: Caused by: java.lang.IllegalArgumentException: Default authentication configuration was not found. Возможно я что-то не так делаю...
источник

RK

Roman Khlebnov in Kotlin JVM
Захар
Существуют ли готовые библиотеки для авторизации в кторе через firebase? я нашел только такую, но непонятно как ей пользоваться.
Попытался сам как-то заставить это работать, но выбрасывает исключение: Caused by: java.lang.IllegalArgumentException: Default authentication configuration was not found. Возможно я что-то не так делаю...
Дефолтная admin-sdk с тем же принципом подключения что и у вас в Micronaut приложении у меня работала нормально
источник

З

Захар in Kotlin JVM
Roman Khlebnov
Дефолтная admin-sdk с тем же принципом подключения что и у вас в Micronaut приложении у меня работала нормально
У меня оказался лишний блок authentication { }
возможно в ридми он подразумевал install(Authentication) { }
источник

З

Захар in Kotlin JVM
Где можно почитать про авторизацию и аутентификацию именно в кторе? В доке дают сухие примеры, которые без контекста. Мне бы понять хоть как выглядит модель авторизации. Читал про jwt здесь, но запутался при проекции знаний на ктор.
источник

З

Захар in Kotlin JVM
Roman Khlebnov
Дефолтная admin-sdk с тем же принципом подключения что и у вас в Micronaut приложении у меня работала нормально
остался исходный код авторизации?
источник

AA

Andrew Alexandroff in Kotlin JVM
Всем привет! Имеется проект в стадии ~90% по словам разработчика. Но у него случился нервный срыв на фоне семейных проблем и он слился. Проект изначально подразумевался как парсер соц.сетей, но в процессе стало понятно, что это универсальный шедулер.
Код в гитлабе с полной историей изменений. Есть немного документации. Надо врубиться и довести проект до рабочего состояния. В общем, кому интересно - вэлком
источник