JdkRequestAdapter.kt
- package com.hexagontk.http.server.jdk
- import com.hexagontk.http.model.*
- import com.hexagontk.http.model.HttpProtocol.HTTP
- import com.hexagontk.http.model.HttpProtocol.HTTPS
- import com.hexagontk.http.parseContentType
- import com.hexagontk.http.parseQueryString
- import com.hexagontk.http.patterns.PathPattern
- import com.sun.net.httpserver.HttpExchange
- import com.sun.net.httpserver.HttpsExchange
- import java.security.cert.X509Certificate
- import javax.net.ssl.SSLSession
- internal class JdkRequestAdapter(
- methodName: String,
- exchange: HttpExchange,
- ) : HttpRequestPort {
- private val sslSession: SSLSession by lazy {
- val x = exchange as? HttpsExchange ?: error("SSL session cannot be access in HTTP request")
- x.sslSession
- }
- override val certificateChain: List<X509Certificate> by lazy {
- sslSession.localCertificates.map { it as X509Certificate }
- }
- override val accept: List<ContentType> by lazy {
- headers.all["accept"]?.map { parseContentType(it.text) } ?: emptyList()
- }
- override val contentLength: Long by lazy {
- (body as ByteArray).size.toLong()
- }
- override val queryParameters: Parameters by lazy {
- exchange.requestURI.query?.let {parseQueryString(it) } ?: Parameters()
- }
- override val parts: List<HttpPart> by lazy {
- emptyList()
- }
- override val formParameters: Parameters by lazy {
- Parameters()
- }
- override val method: HttpMethod by lazy {
- HttpMethod.valueOf(methodName)
- }
- override val protocol: HttpProtocol by lazy {
- if (exchange.protocol.startsWith("HTTPS")) HTTPS
- else HTTP
- }
- override val host: String by lazy {
- exchange.remoteAddress.hostName
- }
- override val port: Int by lazy {
- exchange.requestURI.port
- }
- override val path: String by lazy {
- exchange.requestURI.path
- }
- override val cookies: List<Cookie> by lazy {
- emptyList()
- }
- override val body: Any by lazy {
- exchange.requestBody.readAllBytes()
- }
- override val headers: Headers by lazy {
- Headers(exchange.requestHeaders.flatMap { (k, v) -> v.map { Header(k, it) }})
- }
- override val contentType: ContentType? by lazy {
- headers["content-type"]?.let { parseContentType(it.text) }
- }
- override val authorization: Authorization? by lazy { authorization() }
- override val pathPattern: PathPattern? = null
- override val pathParameters: Map<String, Any> by lazy { throw UnsupportedOperationException() }
- 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()
- }