{-# LANGUAGE CPP #-}
module Network.GRPC.Server.Helpers where
import qualified Data.ByteString.Char8 as ByteString
import Data.Maybe (fromMaybe)
import Network.GRPC.HTTP2.Types (GRPCStatus(..), trailerForStatusCode, grpcStatusH, grpcMessageH)
#if MIN_VERSION_warp(3,3,0)
import Network.HTTP2.Server (NextTrailersMaker(..))
#endif
import Network.Wai (Request)
import Network.Wai.Handler.Warp (http2dataTrailers, defaultHTTP2Data, modifyHTTP2Data, HTTP2Data)
modifyGRPCStatus :: Request -> GRPCStatus -> IO ()
modifyGRPCStatus req = modifyHTTP2Data req . makeGRPCTrailers
makeGRPCTrailers :: GRPCStatus -> (Maybe HTTP2Data -> Maybe HTTP2Data)
makeGRPCTrailers (GRPCStatus s msg) h2data =
#if MIN_VERSION_warp(3,3,0)
Just $! (fromMaybe defaultHTTP2Data h2data) { http2dataTrailers = trailersMaker }
#else
Just $! (fromMaybe defaultHTTP2Data h2data) { http2dataTrailers = trailers }
#endif
where
#if MIN_VERSION_warp(3,3,0)
trailersMaker (Just _) = return $ NextTrailersMaker trailersMaker
trailersMaker Nothing = return $ Trailers trailers
#endif
trailers = if ByteString.null msg then [status] else [status, message]
status = (grpcStatusH, trailerForStatusCode s)
message = (grpcMessageH, msg)