packages feed

http-tower-hs-0.1.0.0: src/Network/HTTP/Tower/Middleware/SetHeader.hs

{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      : Network.HTTP.Tower.Middleware.SetHeader
-- Description : Add headers to every request
-- License     : MIT
--
-- @
-- client '|>' 'withBearerAuth' \"my-token\"
-- client '|>' 'withUserAgent' \"my-app\/1.0\"
-- client '|>' 'withHeader' \"X-Custom\" \"value\"
-- @
module Network.HTTP.Tower.Middleware.SetHeader
  ( withHeader
  , withHeaders
  , withBearerAuth
  , withUserAgent
  ) where

import Data.ByteString (ByteString)
import qualified Network.HTTP.Client as HTTP
import qualified Network.HTTP.Types.Header as HTTP

import Network.HTTP.Tower.Client (HttpResponse)
import Network.HTTP.Tower.Core (Service(..), Middleware)

-- | Add a single header to every request.
withHeader :: HTTP.HeaderName -> ByteString -> Middleware HTTP.Request HttpResponse
withHeader name value inner = Service $ \req ->
  let req' = req { HTTP.requestHeaders = (name, value) : HTTP.requestHeaders req }
  in runService inner req'

-- | Add multiple headers to every request.
withHeaders :: [HTTP.Header] -> Middleware HTTP.Request HttpResponse
withHeaders hdrs inner = Service $ \req ->
  let req' = req { HTTP.requestHeaders = hdrs ++ HTTP.requestHeaders req }
  in runService inner req'

-- | Add a @Authorization: Bearer \<token\>@ header.
withBearerAuth :: ByteString -> Middleware HTTP.Request HttpResponse
withBearerAuth token = withHeader "Authorization" ("Bearer " <> token)

-- | Set the @User-Agent@ header.
withUserAgent :: ByteString -> Middleware HTTP.Request HttpResponse
withUserAgent = withHeader "User-Agent"