Web.kt

  1. package com.hexagontk.web

  2. import com.hexagontk.core.media.mediaTypeOfOrNull
  3. import com.hexagontk.http.handlers.HttpContext
  4. import com.hexagontk.http.model.*
  5. import com.hexagontk.templates.TemplateManager
  6. import com.hexagontk.templates.TemplatePort
  7. import java.net.URL
  8. import java.nio.charset.Charset.defaultCharset
  9. import java.util.Locale
  10. import java.util.Locale.forLanguageTag as localeFor

  11. fun HttpContext.templateType(url: URL): ContentType? =
  12.     response.contentType ?: run {
  13.         val mimeType = mediaTypeOfOrNull(url)
  14.         mimeType?.let { ContentType(it, charset = defaultCharset()) }
  15.     }

  16. fun HttpContext.callContext(): Map<String, *> =
  17.     mapOf(
  18.         "_path_" to request.path.removeSuffix("/"), // Do not allow trailing slash
  19.         "_lang_" to obtainLocale().language,
  20.     )

  21. /**
  22.  * TODO Review order precedence and complete code (now only taking request attribute)
  23.  *
  24.  * 1. Request
  25.  * 2. Accept-language
  26.  * 3. Cookie
  27.  * 4. Server default locale
  28.  */
  29. fun HttpContext.obtainLocale(): Locale = when {
  30.     attributes["lang"] as? String != null -> localeFor(attributes["lang"] as String)
  31.     else -> Locale.getDefault()
  32. }

  33. fun HttpContext.template(
  34.     templateEngine: TemplatePort,
  35.     url: URL,
  36.     context: Map<String, *> = emptyMap<String, Any>(),
  37.     locale: Locale = obtainLocale(),
  38.     headers: Headers = response.headers,
  39.     cookies: List<Cookie> = response.cookies,
  40.     attributes: Map<*, *> = this.attributes,
  41. ): HttpContext =
  42.     ok(
  43.         templateEngine.render(url, callContext() + context, locale),
  44.         headers,
  45.         templateType(url),
  46.         cookies,
  47.         attributes,
  48.     )

  49. fun HttpContext.template(
  50.     url: URL,
  51.     context: Map<String, *> = emptyMap<String, Any>(),
  52.     locale: Locale = obtainLocale(),
  53.     headers: Headers = response.headers,
  54.     cookies: List<Cookie> = response.cookies,
  55.     attributes: Map<*, *> = this.attributes,
  56. ): HttpContext =
  57.     ok(
  58.         TemplateManager.render(url, callContext() + context, locale),
  59.         headers,
  60.         templateType(url),
  61.         cookies,
  62.         attributes,
  63.     )