https://kotlinlang.org logo
#http4k
Title
d

dave

02/18/2018, 10:05 PM
@jdiaz here's an alternate version which uses request context keys to achieve the same thing with just a single emit filter (as you had originally):
Copy code
package quickstart

import org.http4k.core.Filter
import org.http4k.core.Method.DELETE
import org.http4k.core.Method.GET
import <http://org.http4k.core.Method.POST|org.http4k.core.Method.POST>
import org.http4k.core.Method.PUT
import org.http4k.core.Request
import org.http4k.core.RequestContexts
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.core.then
import org.http4k.filter.ResponseFilters
import org.http4k.filter.ServerFilters
import org.http4k.lens.RequestContextKey
import org.http4k.routing.bind
import org.http4k.routing.routes

val contexts = RequestContexts()

data class Dimension(val a: String, val v: String)

fun emitMetric(listOf: List<Dimension>, s: String, toMillis: Long) {
    println(listOf + s + toMillis)
}

val mapsRoute = routes(
    "/{id}" bind PUT to name("UpdateMap").then { _: Request -> Response(OK) },
    "/" bind POST to name("CreateMap").then { _: Request -> Response(OK) },
    "/{id}" bind DELETE to name("DeleteMap").then { _: Request -> Response(OK) },
    "/{id}" bind GET to name("ReadMap").then { _: Request -> Response(OK) }
)

val nameKey = RequestContextKey.required<String>(contexts)

val filters = ServerFilters.InitialiseRequestContext(contexts)
    .then(ResponseFilters.ReportHttpTransaction {
        emitMetric(listOf(
            Dimension("URI", nameKey(it.request)),
            Dimension("Method", it.request.method.name)
        ), "Latency", it.duration.toMillis())
    })

val app = filters.then(routes(
    "/maps" bind mapsRoute
    // More routes here
))

fun name(name: String) = Filter { next ->
    {
        nameKey[it] = name
        next(it)
    }
}

fun main(args: Array<String>) {
    app(Request(GET, "/maps/123"))
    app(Request(POST, "/maps/"))
}