packages feed

sproxy-0.9.4: src/Util.hs

{-# LANGUAGE OverloadedStrings #-}
module Util where

import           Data.Char
import           Data.String
import           Data.Monoid
import           Data.Map (Map)
import qualified Data.Map as Map
import           Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import           Network.HTTP.Types
import           Network.Socket

formatSockAddr :: SockAddr -> IO HostName
formatSockAddr addr = (fst <$> getNameInfo [NI_NUMERICHOST] True False addr) >>= maybe err return
  where
    err = error "Util.formatSockAddr: impossible internal error"

addForwardedForHeader :: HostName -> Map HeaderName ByteString -> Map HeaderName ByteString
addForwardedForHeader ip = Map.insertWith combine "X-Forwarded-For" (fromString ip)
  where
    combine new old = mconcat [old, ", ", new]

removeConnectionHeader :: [Header] -> [Header]
removeConnectionHeader = filter ((/= hConnection) . fst)

strip :: String -> String
strip = reverse . dropWhile isSpace . reverse . dropWhile isSpace

baseUri :: [Header] -> Maybe ByteString
baseUri headers = ("https://" <>) <$> lookup "Host" headers

isConnectionClose :: [Header] -> Bool
isConnectionClose = any p
  where
    p (k, v) = k == hConnection && B.map toLower (stripBS v) == "close"
    stripBS = B.reverse . B.dropWhile isSpace . B.reverse . B.dropWhile isSpace