{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Network.HTTP2.Server (
run
, Config(..)
, allocSimpleConfig
, freeSimpleConfig
, makeSimpleConfig
, Server
, Request
, requestHeaders
, requestBodySize
, getRequestBodyChunk
, getRequestTrailers
, Aux
, auxTimeHandle
, Response
, responseNoBody
, responseFile
, responseStreaming
, responseBuilder
, responseStatus
, responseBodySize
, TrailersMaker
, NextTrailersMaker(..)
, defaultTrailersMaker
, setResponseTrailersMaker
, PushPromise
, pushPromise
, promiseRequestPath
, promiseResponse
, promiseWeight
, FileSpec(..)
, FileOffset
, ByteCount
, defaultReadN
, PositionReadMaker
, PositionRead
, Sentinel(..)
, defaultPositionReadMaker
) where
import Data.IORef (readIORef)
import Data.ByteString.Builder (Builder)
import qualified Network.HTTP.Types as H
import Imports
import Network.HPACK
import Network.HTTP2.Server.API
import Network.HTTP2.Server.Config
import Network.HTTP2.Server.File (defaultPositionReadMaker)
import Network.HTTP2.Server.ReadN (defaultReadN)
import Network.HTTP2.Server.Run (run)
import Network.HTTP2.Types
getRequestBodyChunk :: Request -> IO ByteString
getRequestBodyChunk :: Request -> IO ByteString
getRequestBodyChunk = Request -> IO ByteString
requestBody
getRequestTrailers :: Request -> IO (Maybe HeaderTable)
getRequestTrailers :: Request -> IO (Maybe HeaderTable)
getRequestTrailers = IORef (Maybe HeaderTable) -> IO (Maybe HeaderTable)
forall a. IORef a -> IO a
readIORef (IORef (Maybe HeaderTable) -> IO (Maybe HeaderTable))
-> (Request -> IORef (Maybe HeaderTable))
-> Request
-> IO (Maybe HeaderTable)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> IORef (Maybe HeaderTable)
requestTrailers_
responseNoBody :: H.Status -> H.ResponseHeaders -> Response
responseNoBody :: Status -> ResponseHeaders -> Response
responseNoBody st :: Status
st hdr :: ResponseHeaders
hdr = Status
-> ResponseHeaders -> ResponseBody -> TrailersMaker -> Response
Response Status
st ResponseHeaders
hdr ResponseBody
RspNoBody TrailersMaker
defaultTrailersMaker
responseFile :: H.Status -> H.ResponseHeaders -> FileSpec -> Response
responseFile :: Status -> ResponseHeaders -> FileSpec -> Response
responseFile st :: Status
st hdr :: ResponseHeaders
hdr fileSpec :: FileSpec
fileSpec = Status
-> ResponseHeaders -> ResponseBody -> TrailersMaker -> Response
Response Status
st ResponseHeaders
hdr (FileSpec -> ResponseBody
RspFile FileSpec
fileSpec) TrailersMaker
defaultTrailersMaker
responseBuilder :: H.Status -> H.ResponseHeaders -> Builder -> Response
responseBuilder :: Status -> ResponseHeaders -> Builder -> Response
responseBuilder st :: Status
st hdr :: ResponseHeaders
hdr builder :: Builder
builder = Status
-> ResponseHeaders -> ResponseBody -> TrailersMaker -> Response
Response Status
st ResponseHeaders
hdr (Builder -> ResponseBody
RspBuilder Builder
builder) TrailersMaker
defaultTrailersMaker
responseStreaming :: H.Status -> H.ResponseHeaders
-> ((Builder -> IO ()) -> IO () -> IO ())
-> Response
responseStreaming :: Status
-> ResponseHeaders
-> ((Builder -> IO ()) -> IO () -> IO ())
-> Response
responseStreaming st :: Status
st hdr :: ResponseHeaders
hdr strmbdy :: (Builder -> IO ()) -> IO () -> IO ()
strmbdy = Status
-> ResponseHeaders -> ResponseBody -> TrailersMaker -> Response
Response Status
st ResponseHeaders
hdr (((Builder -> IO ()) -> IO () -> IO ()) -> ResponseBody
RspStreaming (Builder -> IO ()) -> IO () -> IO ()
strmbdy) TrailersMaker
defaultTrailersMaker
responseBodySize :: Response -> Maybe Int
responseBodySize :: Response -> Maybe Int
responseBodySize (Response _ _ (RspFile (FileSpec _ _ len :: ByteCount
len)) _) = Int -> Maybe Int
forall a. a -> Maybe a
Just (ByteCount -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral ByteCount
len)
responseBodySize _ = Maybe Int
forall a. Maybe a
Nothing
setResponseTrailersMaker :: Response -> TrailersMaker -> Response
setResponseTrailersMaker :: Response -> TrailersMaker -> Response
setResponseTrailersMaker rsp :: Response
rsp tm :: TrailersMaker
tm = Response
rsp { responseTrailers :: TrailersMaker
responseTrailers = TrailersMaker
tm }
defaultTrailersMaker :: TrailersMaker
defaultTrailersMaker :: TrailersMaker
defaultTrailersMaker Nothing = NextTrailersMaker -> IO NextTrailersMaker
forall (m :: * -> *) a. Monad m => a -> m a
return (NextTrailersMaker -> IO NextTrailersMaker)
-> NextTrailersMaker -> IO NextTrailersMaker
forall a b. (a -> b) -> a -> b
$ ResponseHeaders -> NextTrailersMaker
Trailers []
defaultTrailersMaker _ = NextTrailersMaker -> IO NextTrailersMaker
forall (m :: * -> *) a. Monad m => a -> m a
return (NextTrailersMaker -> IO NextTrailersMaker)
-> NextTrailersMaker -> IO NextTrailersMaker
forall a b. (a -> b) -> a -> b
$ TrailersMaker -> NextTrailersMaker
NextTrailersMaker TrailersMaker
defaultTrailersMaker
pushPromise :: ByteString -> Response -> Weight -> PushPromise
pushPromise :: ByteString -> Response -> Int -> PushPromise
pushPromise path :: ByteString
path rsp :: Response
rsp w :: Int
w = ByteString -> Response -> Int -> PushPromise
PushPromise ByteString
path Response
rsp Int
w