module IHP.Controller.Response
( respondAndExit
, respondAndExitWithHeaders
, addResponseHeaders
, addResponseHeadersFromContext
, ResponseException (..)
, responseHeadersVaultKey
)
where
import ClassyPrelude
import Network.HTTP.Types.Header
import qualified Network.Wai
import Network.Wai (Response, Request)
import qualified Control.Exception as Exception
import qualified Data.Vault.Lazy as Vault
import System.IO.Unsafe (unsafePerformIO)
import IHP.RequestVault.Helper (lookupRequestVault)
respondAndExit :: Response -> IO ()
respondAndExit :: Response -> IO ()
respondAndExit Response
response = ResponseException -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
Exception.throwIO (Response -> ResponseException
ResponseException Response
response)
{-# INLINE respondAndExit #-}
respondAndExitWithHeaders :: (?request :: Request) => Response -> IO ()
respondAndExitWithHeaders :: (?request::Request) => Response -> IO ()
respondAndExitWithHeaders Response
response = do
responseWithHeaders <- (?request::Request) => Response -> IO Response
Response -> IO Response
addResponseHeadersFromContext Response
response
Exception.throwIO (ResponseException responseWithHeaders)
{-# INLINE respondAndExitWithHeaders #-}
addResponseHeaders :: [Header] -> Response -> Response
ResponseHeaders
headers = (ResponseHeaders -> ResponseHeaders) -> Response -> Response
Network.Wai.mapResponseHeaders (\ResponseHeaders
hs -> ResponseHeaders
headers ResponseHeaders -> ResponseHeaders -> ResponseHeaders
forall a. Semigroup a => a -> a -> a
<> ResponseHeaders
hs)
{-# INLINE addResponseHeaders #-}
addResponseHeadersFromContext :: (?request :: Request) => Response -> IO Response
Response
response = do
headers <- IORef ResponseHeaders -> IO ResponseHeaders
forall (m :: * -> *) a. MonadIO m => IORef a -> m a
readIORef (Key (IORef ResponseHeaders) -> Request -> IORef ResponseHeaders
forall value. Typeable value => Key value -> Request -> value
lookupRequestVault Key (IORef ResponseHeaders)
responseHeadersVaultKey ?request::Request
Request
?request)
let responseWithHeaders = ResponseHeaders -> Response -> Response
addResponseHeaders ResponseHeaders
headers Response
response
pure responseWithHeaders
{-# INLINE addResponseHeadersFromContext #-}
newtype ResponseException = ResponseException Response
instance Show ResponseException where show :: ResponseException -> String
show ResponseException
_ = String
"ResponseException { .. }"
instance Exception ResponseException
responseHeadersVaultKey :: Vault.Key (IORef [Header])
= IO (Key (IORef ResponseHeaders)) -> Key (IORef ResponseHeaders)
forall a. IO a -> a
unsafePerformIO IO (Key (IORef ResponseHeaders))
forall a. IO (Key a)
Vault.newKey
{-# NOINLINE responseHeadersVaultKey #-}