diff --git a/yesod-core/Yesod/Core.hs b/yesod-core/Yesod/Core.hs index 984fa321..affac9f6 100644 --- a/yesod-core/Yesod/Core.hs +++ b/yesod-core/Yesod/Core.hs @@ -49,7 +49,6 @@ module Yesod.Core , module Yesod.Content , module Yesod.Dispatch , module Yesod.Handler - , module Yesod.Request , module Yesod.Widget , module Yesod.Core.Json , module Text.Shakespeare.I18N @@ -60,7 +59,6 @@ import Yesod.Internal (Header(..)) import Yesod.Content import Yesod.Dispatch import Yesod.Handler -import Yesod.Request import Yesod.Widget import Yesod.Core.Json import Text.Shakespeare.I18N diff --git a/yesod-core/Yesod/Handler.hs b/yesod-core/Yesod/Handler.hs index a2f1bcc3..d45e95e9 100644 --- a/yesod-core/Yesod/Handler.hs +++ b/yesod-core/Yesod/Handler.hs @@ -37,6 +37,27 @@ module Yesod.Handler , getRequest , waiRequest , runRequestBody + -- ** Request information + -- *** Request datatype + , RequestBodyContents + , YesodRequest (..) + , FileInfo + , fileName + , fileContentType + , fileSource + , fileMove + -- *** Convenience functions + , languages + -- *** Lookup parameters + , lookupGetParam + , lookupPostParam + , lookupCookie + , lookupFile + -- **** Multi-lookup + , lookupGetParams + , lookupPostParams + , lookupCookies + , lookupFiles -- * Special responses -- ** Redirecting , RedirectUrl (..) @@ -156,6 +177,7 @@ import Control.Monad.Trans.Resource (ResourceT, runResourceT) import Yesod.Routes.Class (Route) import Yesod.Core.Types import Yesod.Core.Trans.Class +import Data.Maybe (listToMaybe) class YesodSubRoute s y where fromSubRoute :: s -> y -> Route s -> Route y @@ -716,3 +738,68 @@ cacheDelete k = modify $ \gs -> ask :: GHandler sub master (HandlerData sub master) ask = GHandler return + +-- | Get the list of supported languages supplied by the user. +-- +-- Languages are determined based on the following three (in descending order +-- of preference): +-- +-- * The _LANG get parameter. +-- +-- * The _LANG cookie. +-- +-- * The _LANG user session variable. +-- +-- * Accept-Language HTTP header. +-- +-- Yesod will seek the first language from the returned list matched with languages supporting by your application. This language will be used to render i18n templates. +-- If a matching language is not found the default language will be used. +-- +-- This is handled by parseWaiRequest (not exposed). +languages :: GHandler s m [Text] +languages = reqLangs `liftM` getRequest + +lookup' :: Eq a => a -> [(a, b)] -> [b] +lookup' a = map snd . filter (\x -> a == fst x) + +-- | Lookup for GET parameters. +lookupGetParams :: Text -> GHandler s m [Text] +lookupGetParams pn = do + rr <- getRequest + return $ lookup' pn $ reqGetParams rr + +-- | Lookup for GET parameters. +lookupGetParam :: Text -> GHandler s m (Maybe Text) +lookupGetParam = liftM listToMaybe . lookupGetParams + +-- | Lookup for POST parameters. +lookupPostParams :: Text -> GHandler s m [Text] +lookupPostParams pn = do + (pp, _) <- runRequestBody + return $ lookup' pn pp + +lookupPostParam :: Text + -> GHandler s m (Maybe Text) +lookupPostParam = liftM listToMaybe . lookupPostParams + +-- | Lookup for POSTed files. +lookupFile :: Text + -> GHandler s m (Maybe FileInfo) +lookupFile = liftM listToMaybe . lookupFiles + +-- | Lookup for POSTed files. +lookupFiles :: Text + -> GHandler s m [FileInfo] +lookupFiles pn = do + (_, files) <- runRequestBody + return $ lookup' pn files + +-- | Lookup for cookie data. +lookupCookie :: Text -> GHandler s m (Maybe Text) +lookupCookie = liftM listToMaybe . lookupCookies + +-- | Lookup for cookie data. +lookupCookies :: Text -> GHandler s m [Text] +lookupCookies pn = do + rr <- getRequest + return $ lookup' pn $ reqCookies rr diff --git a/yesod-core/Yesod/Request.hs b/yesod-core/Yesod/Request.hs deleted file mode 100644 index 7aec55ca..00000000 --- a/yesod-core/Yesod/Request.hs +++ /dev/null @@ -1,109 +0,0 @@ ---------------------------------------------------------- --- --- Module : Yesod.Request --- Copyright : Michael Snoyman --- License : BSD3 --- --- Maintainer : Michael Snoyman --- Stability : Stable --- Portability : portable --- --- | Provides a parsed version of the raw 'W.Request' data. --- ---------------------------------------------------------- -module Yesod.Request - ( - -- * Request datatype - RequestBodyContents - , YesodRequest (..) - , FileInfo - , fileName - , fileContentType - , fileSource - , fileMove - -- * Convenience functions - , languages - -- * Lookup parameters - , lookupGetParam - , lookupPostParam - , lookupCookie - , lookupFile - -- ** Multi-lookup - , lookupGetParams - , lookupPostParams - , lookupCookies - , lookupFiles - ) where - -import Yesod.Internal.Request -import Yesod.Handler -import Control.Monad (liftM) -import Control.Monad.Instances () -- I'm missing the instance Monad ((->) r -import Data.Maybe (listToMaybe) -import Data.Text (Text) -import Yesod.Core.Types - --- | Get the list of supported languages supplied by the user. --- --- Languages are determined based on the following three (in descending order --- of preference): --- --- * The _LANG get parameter. --- --- * The _LANG cookie. --- --- * The _LANG user session variable. --- --- * Accept-Language HTTP header. --- --- Yesod will seek the first language from the returned list matched with languages supporting by your application. This language will be used to render i18n templates. --- If a matching language is not found the default language will be used. --- --- This is handled by parseWaiRequest (not exposed). -languages :: GHandler s m [Text] -languages = reqLangs `liftM` getRequest - -lookup' :: Eq a => a -> [(a, b)] -> [b] -lookup' a = map snd . filter (\x -> a == fst x) - --- | Lookup for GET parameters. -lookupGetParams :: Text -> GHandler s m [Text] -lookupGetParams pn = do - rr <- getRequest - return $ lookup' pn $ reqGetParams rr - --- | Lookup for GET parameters. -lookupGetParam :: Text -> GHandler s m (Maybe Text) -lookupGetParam = liftM listToMaybe . lookupGetParams - --- | Lookup for POST parameters. -lookupPostParams :: Text -> GHandler s m [Text] -lookupPostParams pn = do - (pp, _) <- runRequestBody - return $ lookup' pn pp - -lookupPostParam :: Text - -> GHandler s m (Maybe Text) -lookupPostParam = liftM listToMaybe . lookupPostParams - --- | Lookup for POSTed files. -lookupFile :: Text - -> GHandler s m (Maybe FileInfo) -lookupFile = liftM listToMaybe . lookupFiles - --- | Lookup for POSTed files. -lookupFiles :: Text - -> GHandler s m [FileInfo] -lookupFiles pn = do - (_, files) <- runRequestBody - return $ lookup' pn files - --- | Lookup for cookie data. -lookupCookie :: Text -> GHandler s m (Maybe Text) -lookupCookie = liftM listToMaybe . lookupCookies - --- | Lookup for cookie data. -lookupCookies :: Text -> GHandler s m [Text] -lookupCookies pn = do - rr <- getRequest - return $ lookup' pn $ reqCookies rr diff --git a/yesod-core/test/YesodCoreTest/InternalRequest.hs b/yesod-core/test/YesodCoreTest/InternalRequest.hs index d32e4d46..0c3df884 100644 --- a/yesod-core/test/YesodCoreTest/InternalRequest.hs +++ b/yesod-core/test/YesodCoreTest/InternalRequest.hs @@ -7,11 +7,10 @@ import System.Random (StdGen, mkStdGen) import Network.Wai as W import Network.Wai.Test import Yesod.Internal.TestApi (randomString, parseWaiRequest) -import Yesod.Request (YesodRequest (..)) import Test.Hspec import Data.Monoid (mempty) import Data.Map (singleton) -import Yesod.Core (SessionMap) +import Yesod.Core import Data.Word (Word64) randomStringSpecs :: Spec diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index 247daad3..efd781fd 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -93,7 +93,6 @@ library Yesod.Core.Json Yesod.Dispatch Yesod.Handler - Yesod.Request Yesod.Widget Yesod.Internal.TestApi other-modules: Yesod.Internal