wai-extra-3.1.14: Network/Wai/Middleware/StripHeaders.hs
-- This was written for one specific use case and then generalized.
-- The specific use case was a JSON API with a consumer that would choke on the
-- "Set-Cookie" response header. The solution was to test for the API's
-- `pathInfo` in the Request and if it matched, filter the response headers.
-- When using this, care should be taken not to strip out headers that are
-- required for correct operation of the client (eg Content-Type).
module Network.Wai.Middleware.StripHeaders (
stripHeader,
stripHeaders,
stripHeaderIf,
stripHeadersIf,
) where
import Data.ByteString (ByteString)
import qualified Data.CaseInsensitive as CI
import Network.Wai (
Middleware,
Request,
ifRequest,
mapResponseHeaders,
modifyResponse,
)
import Network.Wai.Internal (Response)
stripHeader :: ByteString -> (Response -> Response)
stripHeader h = mapResponseHeaders (filter (\hdr -> fst hdr /= CI.mk h))
stripHeaders :: [ByteString] -> (Response -> Response)
stripHeaders hs =
let hnames = map CI.mk hs
in mapResponseHeaders (filter (\hdr -> fst hdr `notElem` hnames))
-- | If the request satisifes the provided predicate, strip headers matching
-- the provided header name.
--
-- Since 3.0.8
stripHeaderIf :: ByteString -> (Request -> Bool) -> Middleware
stripHeaderIf h rpred =
ifRequest rpred (modifyResponse $ stripHeader h)
-- | If the request satisifes the provided predicate, strip all headers whose
-- header name is in the list of provided header names.
--
-- Since 3.0.8
stripHeadersIf :: [ByteString] -> (Request -> Bool) -> Middleware
stripHeadersIf hs rpred =
ifRequest rpred (modifyResponse $ stripHeaders hs)