http2-0.1.1: Network/HPACK.hs
-- | HPACK: encoding and decoding a header set.
module Network.HPACK (
-- * Encoding and decoding
HPACKEncoding
, HPACKDecoding
-- * Request
, encodeRequestHeader
, decodeRequestHeader
-- * Response
, encodeResponseHeader
, decodeResponseHeader
-- * Contenxt
, Context
, newContext
-- * Errors for decoding
, DecodeError(..)
-- * Headers
, HeaderSet
, Header
, HeaderName
, HeaderValue
-- * Basic types
, ByteStream
, Size
, Index
) where
import Control.Applicative ((<$>))
import Control.Arrow (second)
import Control.Exception (throwIO)
import Network.HPACK.Context (Context, newContext, HeaderSet)
import Network.HPACK.HeaderBlock (toHeaderBlock, fromHeaderBlock, toByteStream, fromByteStream)
import Network.HPACK.Huffman (huffmanEncodeInRequest, huffmanDecodeInRequest, huffmanEncodeInResponse, huffmanDecodeInResponse)
import Network.HPACK.Table (Size)
import Network.HPACK.Types (ByteStream, DecodeError(..), Header, HeaderName, HeaderValue, Index)
----------------------------------------------------------------
-- | HPACK encoding, from 'HeaderSet' to 'ByteStream'.
type HPACKEncoding = Context -> HeaderSet -> IO (Context, ByteStream)
-- | HPACK decoding, from 'ByteStream' to 'HeaderSet'.
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