{-# LANGUAGE OverloadedStrings #-}
-- |Utility functions for routing.
module Data.IterIO.Http.Support.Routing (
    runLHttpRoute
    ) where

import Data.Char
import qualified Data.ByteString.Lazy.Char8 as L
import qualified Data.ByteString.Char8 as S
import Data.Maybe
import Data.IterIO.Http
import Data.IterIO.HttpRoute
import Data.IterIO.Iter

-- |Converts a 'ByteString' to upper-case
upcase :: S.ByteString -> S.ByteString
upcase = S.map toUpper

-- |Like 'runHttpRoute' but replaces @GET@ and @POST@ request headers with the
-- value of the @X-HTTP-Method-Override@ HTTP header if it is present. This
-- allows applicaitons to respond to @DELETE@ and @PUT@ methods even though
-- many browsers do not support those methods.
runLHttpRoute :: Monad m
              => HttpRoute m s
              -> HttpReq s
              -> Iter L.ByteString m (HttpResp m)
runLHttpRoute route req = runHttpRoute route $ transformedReq
  where method = upcase $ reqMethod req
        overrideHeader = lookup "X-HTTP-Method-Override" (reqHeaders req)
        transformedReq
          | method /= "GET" && method /= "POST" = req
          | isJust overrideHeader =
              req{reqMethod = (upcase . fromJust $ overrideHeader)}
          | otherwise = req