Web.kt

  1. package com.hexagonkt.web

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

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

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

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

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

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