http2-0.1.0: Network/HPACK.hs
module Network.HPACK (
-- * Type
ByteStream
, HeaderSet
, Context
, newContext
, DecodeError(..)
, HPACKEncoding
, HPACKDecoding
-- * Request
, encodeRequestHeader
, decodeRequestHeader
-- * Response
, encodeResponseHeader
, decodeResponseHeader
) where
import Control.Applicative ((<$>))
import Control.Arrow (second)
import Control.Exception (throwIO)
import Network.HPACK.Context
import Network.HPACK.HeaderBlock
import Network.HPACK.Huffman
import Network.HPACK.Types
----------------------------------------------------------------
type HPACKEncoding = Context -> HeaderSet -> IO (Context, ByteStream)
type HPACKDecoding = Context -> ByteStream -> IO (Context, HeaderSet)
----------------------------------------------------------------
-- | Converting 'HeaderSet' for HTTP request to the low level format.
encodeRequestHeader :: HPACKEncoding
encodeRequestHeader ctx hs = second toBS <$> toHeaderBlock ctx hs
where
toBS = toByteStream huffmanEncodeInRequest
-- | Converting the low level format for HTTP request to 'HeaderSet'.
-- 'DecodeError' would be thrown.
decodeRequestHeader :: HPACKDecoding
decodeRequestHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb
where
ehb = fromByteStream huffmanDecodeInRequest bs
----------------------------------------------------------------
-- | Converting 'HeaderSet' for HTTP response to the low level format.
encodeResponseHeader :: HPACKEncoding
encodeResponseHeader ctx hs = second toBS <$> toHeaderBlock ctx hs
where
toBS = toByteStream huffmanEncodeInResponse
-- | Converting the low level format for HTTP response to 'HeaderSet'.
-- 'DecodeError' would be thrown.
decodeResponseHeader :: HPACKDecoding
decodeResponseHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb
where
ehb = fromByteStream huffmanDecodeInResponse bs