All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.http4k.security.oauth.server.ResponseRender.kt Maven / Gradle / Ivy

package org.http4k.security.oauth.server

import org.http4k.core.Response
import org.http4k.core.Status.Companion.SEE_OTHER
import org.http4k.core.Uri
import org.http4k.core.query
import org.http4k.security.ResponseMode
import org.http4k.security.ResponseType
import org.http4k.security.State
import org.http4k.security.fragmentParameter

interface ResponseRender {

    fun withState(state: State?) =
        if (state == null || state.value.isBlank()) this else addParameter("state", state.value)

    fun withDocumentationUri(documentationUri: String?) =
        if (documentationUri.isNullOrEmpty()) this else addParameter("error_uri", documentationUri)

    fun addParameter(key: String, value: String?): ResponseRender

    fun complete(): Response

    companion object {
        fun forAuthRequest(authorizationRequest: AuthRequest) =
            forAuthRequest(
                authorizationRequest.responseMode,
                authorizationRequest.responseType,
                authorizationRequest.redirectUri!!
            )

        fun forAuthRequest(responseMode: ResponseMode?, responseType: ResponseType, redirectUri: Uri) =
            when (responseMode) {
                ResponseMode.Query -> QueryResponseRender(redirectUri)
                ResponseMode.Fragment -> FragmentResponseRender(redirectUri)
                null -> if (responseType == ResponseType.CodeIdToken) {
                    FragmentResponseRender(redirectUri)
                } else {
                    QueryResponseRender(redirectUri)
                }
            }
    }
}

class QueryResponseRender(private val uri: Uri) : ResponseRender {

    override fun addParameter(key: String, value: String?): ResponseRender = QueryResponseRender(uri.query(key, value))

    override fun complete(): Response = Response(SEE_OTHER).header("Location", uri.toString())
}

class FragmentResponseRender(private val uri: Uri) : ResponseRender {

    override fun addParameter(key: String, value: String?): ResponseRender =
        FragmentResponseRender(uri.fragmentParameter(key, value))

    override fun complete(): Response = Response(SEE_OTHER).header("Location", uri.toString())
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy