ServletRequestAdapterSync.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.patterns.PathPattern
  5. import jakarta.servlet.ServletException
  6. import jakarta.servlet.http.HttpServletRequest
  7. import jakarta.servlet.http.Part
  8. import java.security.cert.X509Certificate
  9. import kotlin.UnsupportedOperationException

  10. internal class ServletRequestAdapterSync(req: HttpServletRequest) : ServletRequestAdapter(req) {

  11.     private val parameters: List<Pair<String, String>> by lazy {
  12.         req.parameterMap.flatMap { pm ->
  13.             pm.value.map { pm.key as String to it }
  14.         }
  15.     }

  16.     override val parts: List<HttpPart> by lazy {
  17.         try {
  18.             req.parts.map { servletPartAdapter(it) }
  19.         }
  20.         catch (_: ServletException) {
  21.             emptyList<HttpPart>()
  22.         }
  23.     }

  24.     override val formParameters: Parameters by lazy {
  25.         val fields = parameters
  26.             .filter { it.first !in queryParameters.keys }
  27.             .map { (k, v) -> Parameter(k, v) }

  28.         Parameters(fields)
  29.     }

  30.     override fun with(
  31.         body: Any,
  32.         headers: Headers,
  33.         contentType: ContentType?,
  34.         method: HttpMethod,
  35.         protocol: HttpProtocol,
  36.         host: String,
  37.         port: Int,
  38.         path: String,
  39.         queryParameters: Parameters,
  40.         parts: List<HttpPart>,
  41.         formParameters: Parameters,
  42.         cookies: List<Cookie>,
  43.         accept: List<ContentType>,
  44.         authorization: Authorization?,
  45.         certificateChain: List<X509Certificate>,
  46.         pathPattern: PathPattern?,
  47.         pathParameters: Map<String, Any>,
  48.     ): HttpRequestPort =
  49.         throw UnsupportedOperationException()

  50.     override val body: Any by lazy {
  51.         req.inputStream.readAllBytes()
  52.     }

  53.     override val pathPattern: PathPattern? = null

  54.     override val pathParameters: Map<String, Any> by lazy { throw UnsupportedOperationException() }

  55.     private fun servletPartAdapter(part: Part) : HttpPart {
  56.         val headerNames = part.headerNames.filterNotNull()
  57.         return HttpPart(
  58.             name = part.name,
  59.             body = part.inputStream.readAllBytes(),
  60.             headers = Headers(headerNames.map { Header(it, part.getHeaders(it).toList()) }),
  61.             contentType = part.contentType?.let { parseContentType(it) },
  62.             size = part.size,
  63.             submittedFileName = part.submittedFileName,
  64.         )
  65.     }
  66. }