ServletRequestAdapterSync.kt

  1. package com.hexagonkt.http.server.servlet

  2. import com.hexagonkt.http.model.*
  3. import com.hexagonkt.http.parseContentType
  4. import jakarta.servlet.http.HttpServletRequest
  5. import jakarta.servlet.http.Part
  6. import java.security.cert.X509Certificate
  7. import kotlin.UnsupportedOperationException

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

  9.     private val parameters: Map<String, List<String>> by lazy {
  10.         req.parameterMap.map { it.key as String to it.value.toList() }.toMap()
  11.     }

  12.     override val parts: List<HttpPart> by lazy {
  13.         req.parts.map { servletPartAdapter(it) }
  14.     }

  15.     override val formParameters: FormParameters by lazy {
  16.         val fields = parameters
  17.             .filter { it.key !in queryParameters.httpFields.keys }
  18.             .map { (k, v) -> FormParameter(k, v) }

  19.         FormParameters(fields)
  20.     }

  21.     override fun with(
  22.         body: Any,
  23.         headers: Headers,
  24.         contentType: ContentType?,
  25.         method: HttpMethod,
  26.         protocol: HttpProtocol,
  27.         host: String,
  28.         port: Int,
  29.         path: String,
  30.         queryParameters: QueryParameters,
  31.         parts: List<HttpPart>,
  32.         formParameters: FormParameters,
  33.         cookies: List<Cookie>,
  34.         accept: List<ContentType>,
  35.         authorization: Authorization?,
  36.         certificateChain: List<X509Certificate>,
  37.     ): HttpRequestPort =
  38.         throw UnsupportedOperationException()

  39.     override val body: Any by lazy {
  40.         req.inputStream.readAllBytes()
  41.     }

  42.     private fun servletPartAdapter(part: Part) : HttpPart {
  43.         val headerNames = part.headerNames.filterNotNull()
  44.         return HttpPart(
  45.             name = part.name,
  46.             body = part.inputStream.readAllBytes(),
  47.             headers = Headers(headerNames.map { Header(it, part.getHeaders(it).toList()) }),
  48.             contentType = part.contentType?.let { parseContentType(it) },
  49.             size = part.size,
  50.             submittedFileName = part.submittedFileName,
  51.         )
  52.     }
  53. }