2011-03-02 08:43:05 +00:00
|
|
|
{-# OPTIONS_HADDOCK hide #-}
|
2011-08-12 17:31:58 +00:00
|
|
|
{-# 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(..)
|
|
|
|
, nullCompression
|
2011-08-12 17:31:58 +00:00
|
|
|
|
2012-03-27 07:57:51 +00:00
|
|
|
-- * member redefined for the class abstraction
|
|
|
|
, compressionID
|
|
|
|
, compressionDeflate
|
|
|
|
, compressionInflate
|
2011-08-12 17:31:58 +00:00
|
|
|
|
2012-03-27 07:57:51 +00:00
|
|
|
-- * helper
|
|
|
|
, compressionIntersectID
|
|
|
|
) where
|
2010-09-09 21:47:19 +00:00
|
|
|
|
|
|
|
import Data.Word
|
|
|
|
import Data.ByteString (ByteString)
|
2011-08-12 17:31:58 +00:00
|
|
|
import Control.Arrow (first)
|
|
|
|
|
|
|
|
-- | supported compression algorithms need to be part of this class
|
|
|
|
class CompressionC a where
|
2012-03-27 07:57:51 +00:00
|
|
|
compressionCID :: a -> Word8
|
|
|
|
compressionCDeflate :: a -> ByteString -> (a, ByteString)
|
|
|
|
compressionCInflate :: a -> ByteString -> (a, ByteString)
|
2011-08-12 17:31:58 +00:00
|
|
|
|
|
|
|
-- | 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 -> Word8
|
|
|
|
compressionID (Compression c) = compressionCID c
|
2010-09-09 21:47:19 +00:00
|
|
|
|
2011-08-12 17:31:58 +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
|
2011-03-01 20:01:40 +00:00
|
|
|
|
|
|
|
instance Show Compression where
|
2012-03-27 07:57:51 +00:00
|
|
|
show = show . compressionID
|
2011-03-01 20:01:40 +00:00
|
|
|
|
2011-08-12 17:31:58 +00:00
|
|
|
-- | 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
|
|
|
|
|
|
|
|
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-08-12 17:31:58 +00:00
|
|
|
|
2011-03-02 08:43:05 +00:00
|
|
|
-- | default null compression
|
2011-03-01 20:01:40 +00:00
|
|
|
nullCompression :: Compression
|
2011-08-12 17:31:58 +00:00
|
|
|
nullCompression = Compression NullCompression
|