happstack-server-7.9.3: Web related tools and services.

Safe Haskell | None
Language | Haskell2010

Happstack.Server.Internal.Compression

Description

Filter for compressing the `Response` body.

Synopsis

- compressedResponseFilter :: (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m, MonadFail m) => m String
- compressedResponseFilter' :: (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m, MonadFail m) => [(String, String -> Bool -> m ())] -> m String
- compressWithFilter :: FilterMonad Response m => (ByteString -> ByteString) -> String -> Bool -> m ()
- gzipFilter :: FilterMonad Response m => String -> Bool -> m ()
- deflateFilter :: FilterMonad Response m => String -> Bool -> m ()
- identityFilter :: FilterMonad Response m => String -> Bool -> m ()
- starFilter :: (FilterMonad Response m, MonadFail m) => String -> Bool -> m ()
- encodings :: GenParser Char st [(String, Maybe Double)]
- standardEncodingHandlers :: (FilterMonad Response m, MonadFail m) => [(String, String -> Bool -> m ())]

# Documentation

compressedResponseFilter Source #

Arguments

:: (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m, MonadFail m) |
=> m String | name of the encoding chosen

reads the `Accept-Encoding` header. Then, if possible will compress the response body with methods `gzip` or `deflate`.

This function uses `standardEncodingHandlers`. If you want to provide alternative handers (perhaps to change compression levels), see `compressedResponseFilter'`

    main =
      simpleHTTP nullConf $
         do str <- compressedResponseFilter
            return $ toResponse ("This response compressed using: " ++ str)

compressedResponseFilter' Source #

Arguments

:: (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m, MonadFail m) |
=> [(String, String -> Bool -> m ())] | compression filter assoc list
-> m String | name of the encoding chosen

reads the `Accept-Encoding` header. Then, if possible will compress the response body using one of the supplied filters.

A filter function takes two arguments. The first is a `String` with the value to be used as the 'Content-Encoding' header. The second is `Bool` which indicates if the compression filter is allowed to fallback to `identity`.

This is important if the resource being sent using sendfile, since sendfile does not provide a compression option. If `identity` is allowed, then the file can be sent uncompressed using sendfile. But if `identity` is not allowed, then the filter will need to return error 406.

You should probably always include the `identity` and `*` encodings as acceptable.

    myFilters :: (FilterMonad Response m) => [(String, String -> Bool -> m ()]
    myFilters = [ ("gzip"    , gzipFilter)
                , ("identity", identityFilter)
                , ("*"       , starFilter)
                ]

    main =
      simpleHTTP nullConf $
         do let filters =
    str <- compressedResponseFilter'
            return $ toResponse ("This response compressed using: " ++ str)

compressWithFilter Source #

Arguments

:: FilterMonad Response m |
=> (ByteString -> ByteString) | function to compress the body
-> String | encoding to use for Content-Encoding header
-> Bool | fallback to identity for SendFile
-> m () |

Ignore the `Accept-Encoding` header in the `Request` and attempt to compress the body of the response using the supplied compressor.

We can not compress files being transfered using `SendFile`. If `identity` is an allowed encoding, then just return the `Response` unmodified. Otherwise we return `406 Not Acceptable`.

see also: `gzipFilter`, `deflateFilter`, `identityFilter`, `starFilter`, `compressedResponseFilter'`

gzipFilter Source #

Arguments

:: FilterMonad Response m |
=> String | encoding to use for Content-Encoding header
-> Bool | fallback to identity for SendFile
-> m () |

Ignore the `Accept-Encoding` header in the `Request` and attempt to compress the body of the response with `gzip`.

calls `compressWithFilter` using `compress`.

see also: `compressedResponseFilter`

deflateFilter Source #

Arguments

:: FilterMonad Response m |
=> String | encoding to use for Content-Encoding header
-> Bool | fallback to identity for SendFile
-> m () |

Ignore the `Accept-Encoding` header in the `Request` and attempt compress the body of the response with zlib's `deflate` method

calls `compressWithFilter` using `compress`.

see also: `compressedResponseFilter`

identityFilter Source #

Arguments

:: FilterMonad Response m |
=> String | encoding to use for Content-Encoding header
-> Bool | fallback to identity for SendFile (irrelavant for this filter)
-> m () |

compression filter for the identity encoding (aka, do nothing)

see also: `compressedResponseFilter`

starFilter Source #

Arguments

:: (FilterMonad Response m, MonadFail m) |
=> String | encoding to use for Content-Encoding header
-> Bool | fallback to identity for SendFile (irrelavant for this filter)
-> m () |

compression filter for the * encoding

This filter always fails.

encodings :: GenParser Char st [(String, Maybe Double)] Source #

a parser for the Accept-Encoding header

standardEncodingHandlers :: (FilterMonad Response m, MonadFail m) => [(String, String -> Bool -> m ())] Source #

an assoc list of encodings and their corresponding compression functions.

e.g.

    [("gzip", gzipFilter), ("identity", identityFilter), ("*",starFilter)]