-----------------------------------------------------------------------------
-- |
-- Module      :  HSP.Env.Request
-- Copyright   :  (c) Niklas Broberg 2006,
-- License     :  BSD-style (see the file LICENSE.txt)
-- 
-- Maintainer  :  Niklas Broberg, nibro@cs.chalmers.se
-- Stability   :  experimental
-- Portability :  Haskell 98
--
-- An interface to a request object as held in the HSP environment.
-----------------------------------------------------------------------------

module HSP.Env.Request (
	Request(..),
	getParameter,
	getParameter_,
	readParameter,
	readParameterL,
	readParameter_
	) where

import HSP.Exception (throwHSP, Exception(..))

-- | A record representing an interface to an HTTP request. This allows us to use
-- many different underlying types for these requests, all we need is to supply
-- conversions to this interface. This is useful for when we run as CGI, or when
-- we run inside a server app.
data Request = Request {
          getParameterL         :: String -> [String]
        , getHeaders		:: [(String, String)]
	}

-- | Get a parameter from the request query string (GET) or body (POST).
-- | Returns @Nothing@ if the parameter is not set.
getParameter :: Request -> String -> Maybe String
getParameter r k = case getParameterL r k of
		    (v:_) -> Just v
		    _     -> Nothing

-- | Unsafe version of getParameter, essentially fromJust.(getParameter r) but throws
-- a ParameterLookupFailed exception if the parameter is not set.
getParameter_ :: Request -> String -> String
getParameter_ r s = maybe (throwHSP $ ParameterLookupFailed s) id $ getParameter r s

-- | Return a value instead of a string.
readParameter :: Read a => Request -> String -> Maybe a
readParameter r s = fmap read $ getParameter r s

-- | Return a list of values read from their string representations.
readParameterL :: Read a => Request -> String -> [a]
readParameterL r s = map read $ getParameterL r s

-- | Unsafe version of readParameter
readParameter_ :: Read a => Request -> String -> a
readParameter_ r s = read $ getParameter_ r s