All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lightstreamer.kotlin.socket.internal.TlcpEncoder.kt Maven / Gradle / Ivy

The newest version!
package com.lightstreamer.kotlin.socket.internal

import com.lightstreamer.kotlin.socket.message.*

/**
 * Encode the message to [Appendable]
 */
internal fun Appendable.appendTlcpEncoded(message: LightstreamerClientMessage) {
    val name = when (message.name) {
        LightstreamerClientRequestName.BIND_SESSION -> "bind_session"
        LightstreamerClientRequestName.CONTROL -> "control"
        LightstreamerClientRequestName.CREATE_SESSION -> "create_session"
        LightstreamerClientRequestName.HEARTBEAT -> "heartbeat"
        LightstreamerClientRequestName.MESSAGE -> "msg"
    }
    append(name)
    append('\r')
    append('\n')
    appendTlcpEncodedParameters(message)
}

/**
 * Encode only the message's parameter to [Appendable]
 */
internal fun Appendable.appendTlcpEncodedParameters(message: LightstreamerClientMessage) {
    var firstParameter = true
    for ((key, value, requireEncoding) in message.parameters()) {
        if (firstParameter) firstParameter = false
        else append('&')
        append(key)
        append('=')
        if (requireEncoding) appendTlcpEncoded(value)
        else append(value)
    }
    append('\r')
    append('\n')
}

internal fun Appendable.appendTlcpEncoded(value: CharSequence) {
    for (char in value) {
        when (char) {
            // line delimiters
            '\r' -> append("%0D")
            '\n' -> append("%0A")
            // used for percent-encoding
            '%' -> append("%25")
            '+' -> append("%2B")
            // parameter delimiters
            '&' -> append("%26")
            '=' -> append("%3D")
            // otherwise encoding is not required,
            // all non-ascii characters included
            else -> append(char)
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy