module Network.GRPC.Server.Context (
ServerContext(..)
, newServerContext
, ServerParams(..)
) where
import Control.Exception
import System.IO
import Network.GRPC.Common
import Network.GRPC.Common.Compression qualified as Compr
import Network.GRPC.Server.RequestHandler.API
import Network.GRPC.Spec
import Data.Text (Text)
import Data.Text qualified as Text
data ServerContext = ServerContext {
ServerContext -> ServerParams
serverParams :: ServerParams
}
newServerContext :: ServerParams -> IO ServerContext
newServerContext :: ServerParams -> IO ServerContext
newServerContext ServerParams
serverParams = do
ServerContext -> IO ServerContext
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ServerContext{
ServerParams
serverParams :: ServerParams
serverParams :: ServerParams
serverParams
}
data ServerParams = ServerParams {
ServerParams -> Negotation
serverCompression :: Compr.Negotation
, ServerParams -> RequestHandler () -> RequestHandler ()
serverTopLevel :: RequestHandler () -> RequestHandler ()
, ServerParams -> SomeException -> IO (Maybe Text)
serverExceptionToClient :: SomeException -> IO (Maybe Text)
, ServerParams -> Maybe ContentType
serverContentType :: Maybe ContentType
, :: Bool
}
instance Default ServerParams where
def :: ServerParams
def = ServerParams {
serverCompression :: Negotation
serverCompression = Negotation
forall a. Default a => a
def
, serverTopLevel :: RequestHandler () -> RequestHandler ()
serverTopLevel = RequestHandler () -> RequestHandler ()
defaultServerTopLevel
, serverExceptionToClient :: SomeException -> IO (Maybe Text)
serverExceptionToClient = SomeException -> IO (Maybe Text)
defaultServerExceptionToClient
, serverContentType :: Maybe ContentType
serverContentType = ContentType -> Maybe ContentType
forall a. a -> Maybe a
Just ContentType
ContentTypeDefault
, serverVerifyHeaders :: Bool
serverVerifyHeaders = Bool
False
}
defaultServerTopLevel :: RequestHandler () -> RequestHandler ()
defaultServerTopLevel :: RequestHandler () -> RequestHandler ()
defaultServerTopLevel RequestHandler ()
h forall x. IO x -> IO x
unmask Request
req Response -> IO ()
resp =
RequestHandler ()
h IO x -> IO x
forall x. IO x -> IO x
unmask Request
req Response -> IO ()
resp IO () -> (SomeException -> IO ()) -> IO ()
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`catch` SomeException -> IO ()
handler
where
handler :: SomeException -> IO ()
handler :: SomeException -> IO ()
handler = Handle -> SomeException -> IO ()
forall a. Show a => Handle -> a -> IO ()
hPrint Handle
stderr
defaultServerExceptionToClient :: SomeException -> IO (Maybe Text)
defaultServerExceptionToClient :: SomeException -> IO (Maybe Text)
defaultServerExceptionToClient (SomeException e
e) =
Maybe Text -> IO (Maybe Text)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Text -> IO (Maybe Text)) -> Maybe Text -> IO (Maybe Text)
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text
forall a. a -> Maybe a
Just (String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"Server-side exception: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ e -> String
forall e. Exception e => e -> String
displayException e
e)