Utilities exposed by Ktor (URL-Encoding)

    URL-encoded strings look like: param=value&other=hi.

    There is an extension method for String that allows you to get a parsed Parameters object from it. You can limit the maximum number of parsed parameters with the optional limit parameter.

    Encoding:

    You can generate a URL-encoded string either from a List of Pairs of Strings or a Parameters instance:

    1. fun List<Pair<String, String?>>.formUrlEncode(): String
    2. fun List<Pair<String, String?>>.formUrlEncodeTo(out: Appendable)
    3. fun Parameters.formUrlEncode(): String
    4. fun Parameters.formUrlEncodeTo(out: Appendable)
    1. "error" to "invalid_request",
    2. "error_description" to "client_id is missing"
    3. ).formUrlEncode()

    You can also construct it from a instance that you can instantiate by using the Parameters.build builder and then calling the formUrlEncode extension, or with the parametersOf() builder method:

    The parametersOf builder has several signatures, and there is Parameters operator overloading (+) to join two Parameters instances:

    1. parametersOf("a" to "b1", "a" to "b2").formUrlEncode()
    2. (parametersOf("a", "b1") + parametersOf("a", "b2")).formUrlEncode()
    3. parametersOf("a", listOf("b1", "b2")).formUrlEncode()

    From a normal Map<String, String> you can also construct a URL-encoded string, but first you will have to create a List from it:

    1. mapOf(
    2. "error" to "invalid_request",

    You can also construct it from a Map<String, List<String>> by flatMapping it first:

    In case you want to avoid constructing a whole String with the content and instead want to write to somewhere directly, you can use the formUrlEncodeTo method.

    Responding URL-encoded

    You can do something like:

    1. call.respondUrlEncoded("hello" to listOf("world"))
    1. suspend fun ApplicationCall.respondUrlEncoded(vararg keys: Pair<String, List<String>>) =
    2. respondUrlEncoded(parametersOf(*keys))
    3. suspend fun ApplicationCall.respondUrlEncoded(parameters: Parameters) =
    4. respondTextWriter(ContentType.Application.FormUrlEncoded) {
    5. parameters.formUrlEncodeTo(this)