ServletRequestAdapter.kt

  1. package com.hexagontk.http.server.servlet

  2. import com.hexagontk.http.model.*
  3. import com.hexagontk.http.parseContentType
  4. import com.hexagontk.http.parseQueryString
  5. import java.security.cert.X509Certificate
  6. import jakarta.servlet.http.HttpServletRequest

  7. internal abstract class ServletRequestAdapter(req: HttpServletRequest) : HttpRequestPort {

  8.     private companion object {
  9.         const val CERTIFICATE_ATTRIBUTE = "jakarta.servlet.request.X509Certificate"
  10.     }

  11.     @Suppress("UNCHECKED_CAST")
  12.     override val certificateChain: List<X509Certificate> by lazy {
  13.         (req.getAttribute(CERTIFICATE_ATTRIBUTE) as? Array<X509Certificate>)
  14.             ?.toList()
  15.             ?: emptyList()
  16.     }

  17.     override val accept: List<ContentType> by lazy {
  18.         req.getHeaders("accept")
  19.             ?.toList()
  20.             ?.flatMap { it.split(",") }
  21.             ?.map { parseContentType(it) }
  22.             ?: emptyList()
  23.     }

  24.     override val contentLength: Long by lazy { req.contentLength.toLong() }

  25.     override val queryParameters: Parameters by lazy {
  26.         parseQueryString(req.queryString ?: "")
  27.     }

  28.     override val method: HttpMethod by lazy {
  29.         HttpMethod.valueOf(req.method)
  30.     }

  31.     override val protocol: HttpProtocol by lazy { HttpProtocol.valueOf(req.scheme.uppercase()) }
  32.     override val host: String by lazy { req.remoteHost }
  33.     override val port: Int by lazy { req.serverPort }
  34.     override val path: String by lazy { req.servletPath.ifEmpty { req.pathInfo } }
  35.     override val authorization: Authorization? by lazy { authorization() }

  36.     override val cookies: List<Cookie> by lazy {
  37.         req.cookies
  38.             ?.map {
  39.                 Cookie(
  40.                     it.name,
  41.                     it.value,
  42.                     it.maxAge.toLong(),
  43.                     it.secure,
  44.                     it.path ?: "/",
  45.                     it.isHttpOnly,
  46.                     it.domain,
  47.                 )
  48.             }
  49.             ?: emptyList()
  50.     }

  51.     override val headers: Headers by lazy {
  52.         Headers(
  53.             req.headerNames
  54.                 .toList()
  55.                 .map { it.lowercase() }
  56.                 .flatMap { req.getHeaders(it).toList().map { v -> Header(it, v) } }
  57.         )
  58.     }

  59.     override val contentType: ContentType? by lazy {
  60.         req.contentType?.let { parseContentType(it) }
  61.     }
  62. }