ServletRequestAdapterSync.kt
- package com.hexagontk.http.server.servlet
- import com.hexagontk.http.model.*
- import com.hexagontk.http.parseContentType
- import com.hexagontk.http.patterns.PathPattern
- import jakarta.servlet.ServletException
- import jakarta.servlet.http.HttpServletRequest
- import jakarta.servlet.http.Part
- import java.security.cert.X509Certificate
- import kotlin.UnsupportedOperationException
- internal class ServletRequestAdapterSync(req: HttpServletRequest) : ServletRequestAdapter(req) {
- private val parameters: List<Pair<String, String>> by lazy {
- req.parameterMap.flatMap { pm ->
- pm.value.map { pm.key as String to it }
- }
- }
- override val parts: List<HttpPart> by lazy {
- try {
- req.parts.map { servletPartAdapter(it) }
- }
- catch (_: ServletException) {
- emptyList<HttpPart>()
- }
- }
- override val formParameters: Parameters by lazy {
- val fields = parameters
- .filter { it.first !in queryParameters.keys }
- .map { (k, v) -> Parameter(k, v) }
- Parameters(fields)
- }
- override fun with(
- body: Any,
- headers: Headers,
- contentType: ContentType?,
- method: HttpMethod,
- protocol: HttpProtocol,
- host: String,
- port: Int,
- path: String,
- queryParameters: Parameters,
- parts: List<HttpPart>,
- formParameters: Parameters,
- cookies: List<Cookie>,
- accept: List<ContentType>,
- authorization: Authorization?,
- certificateChain: List<X509Certificate>,
- pathPattern: PathPattern?,
- pathParameters: Map<String, Any>,
- ): HttpRequestPort =
- throw UnsupportedOperationException()
- override val body: Any by lazy {
- req.inputStream.readAllBytes()
- }
- override val pathPattern: PathPattern? = null
- override val pathParameters: Map<String, Any> by lazy { throw UnsupportedOperationException() }
- private fun servletPartAdapter(part: Part) : HttpPart {
- val headerNames = part.headerNames.filterNotNull()
- return HttpPart(
- name = part.name,
- body = part.inputStream.readAllBytes(),
- headers = Headers(headerNames.map { Header(it, part.getHeaders(it).toList()) }),
- contentType = part.contentType?.let { parseContentType(it) },
- size = part.size,
- submittedFileName = part.submittedFileName,
- )
- }
- }