{-# 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 Status
st 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 Status
st ResponseHeaders
hdr 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 Status
st ResponseHeaders
hdr 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 Status
st ResponseHeaders
hdr (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 Status
_ ResponseHeaders
_ (RspFile (FileSpec FilePath
_ FileOffset
_ FileOffset
len)) TrailersMaker
_) = Int -> Maybe Int
forall a. a -> Maybe a
Just (FileOffset -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral FileOffset
len)
responseBodySize Response
_ = Maybe Int
forall a. Maybe a
Nothing
setResponseTrailersMaker :: Response -> TrailersMaker -> Response
setResponseTrailersMaker :: Response -> TrailersMaker -> Response
setResponseTrailersMaker Response
rsp TrailersMaker
tm = Response
rsp { responseTrailers :: TrailersMaker
responseTrailers = TrailersMaker
tm }
defaultTrailersMaker :: TrailersMaker
defaultTrailersMaker :: TrailersMaker
defaultTrailersMaker Maybe ByteString
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 Maybe ByteString
_ = 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 ByteString
path Response
rsp Int
w = ByteString -> Response -> Int -> PushPromise
PushPromise ByteString
path Response
rsp Int
w