DateCallback.kt

  1. package com.hexagonkt.http.server.callbacks

  2. import com.hexagonkt.http.model.Header
  3. import com.hexagonkt.http.handlers.HttpContext
  4. import com.hexagonkt.http.toHttpFormat
  5. import java.time.Instant
  6. import java.util.concurrent.atomic.AtomicLong
  7. import java.util.concurrent.atomic.AtomicReference

  8. /**
  9.  * Callback that adds the `date` header to the response (caching its value).
  10.  */
  11. class DateCallback(private val name: String = "date") : (HttpContext) -> HttpContext {

  12.     private var lastUpdate: AtomicLong = AtomicLong(0)
  13.     private var date: AtomicReference<String> = AtomicReference("")

  14.     override fun invoke(context: HttpContext): HttpContext {
  15.         val ms = System.currentTimeMillis()

  16.         if (lastUpdate.get() + 1_000 <= ms) {
  17.             lastUpdate.set(ms - (ms % 1_000))
  18.             date.set(Instant.ofEpochMilli(lastUpdate.get()).toHttpFormat())
  19.         }

  20.         return context.send(headers = context.response.headers + Header(name, date.get())).next()
  21.     }
  22. }