hs-tls/core/Network/TLS/Compression.hs

74 lines
2.6 KiB
Haskell
Raw Normal View History

2011-03-02 08:43:05 +00:00
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE ExistentialQuantification #-}
2010-09-09 21:47:19 +00:00
-- |
-- Module : Network.TLS.Compression
-- License : BSD-style
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
-- Stability : experimental
-- Portability : unknown
--
module Network.TLS.Compression
2012-03-27 07:57:51 +00:00
( CompressionC(..)
, Compression(..)
, CompressionID
2012-03-27 07:57:51 +00:00
, nullCompression
, NullCompression
2012-03-27 07:57:51 +00:00
-- * member redefined for the class abstraction
, compressionID
, compressionDeflate
, compressionInflate
2012-03-27 07:57:51 +00:00
-- * helper
, compressionIntersectID
) where
2010-09-09 21:47:19 +00:00
import Data.Word
import Network.TLS.Types (CompressionID)
2010-09-09 21:47:19 +00:00
import Data.ByteString (ByteString)
import Control.Arrow (first)
-- | supported compression algorithms need to be part of this class
class CompressionC a where
compressionCID :: a -> CompressionID
2012-03-27 07:57:51 +00:00
compressionCDeflate :: a -> ByteString -> (a, ByteString)
compressionCInflate :: a -> ByteString -> (a, ByteString)
-- | every compression need to be wrapped in this, to fit in structure
data Compression = forall a . CompressionC a => Compression a
-- | return the associated ID for this algorithm
compressionID :: Compression -> CompressionID
compressionID (Compression c) = compressionCID c
2010-09-09 21:47:19 +00:00
-- | deflate (compress) a bytestring using a compression context and return the result
-- along with the new compression context.
compressionDeflate :: ByteString -> Compression -> (Compression, ByteString)
compressionDeflate bytes (Compression c) = first Compression $ compressionCDeflate c bytes
-- | inflate (decompress) a bytestring using a compression context and return the result
-- along the new compression context.
compressionInflate :: ByteString -> Compression -> (Compression, ByteString)
compressionInflate bytes (Compression c) = first Compression $ compressionCInflate c bytes
instance Show Compression where
2012-03-27 07:57:51 +00:00
show = show . compressionID
-- | intersect a list of ids commonly given by the other side with a list of compression
-- the function keeps the list of compression in order, to be able to find quickly the prefered
-- compression.
compressionIntersectID :: [Compression] -> [Word8] -> [Compression]
compressionIntersectID l ids = filter (\c -> elem (compressionID c) ids) l
2012-10-21 17:32:07 +00:00
-- | This is the default compression which is a NOOP.
data NullCompression = NullCompression
instance CompressionC NullCompression where
2012-03-27 07:57:51 +00:00
compressionCID _ = 0
compressionCDeflate s b = (s, b)
compressionCInflate s b = (s, b)
2011-03-02 08:43:05 +00:00
-- | default null compression
nullCompression :: Compression
nullCompression = Compression NullCompression