packages feed

yesod-core 1.4.31 → 1.4.32

raw patch · 33 files changed

+262/−114 lines, 33 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Yesod.Core.Types: instance (GHC.Base.Applicative m, Control.Monad.IO.Class.MonadIO m, Control.Monad.Base.MonadBase GHC.Types.IO m, Control.Monad.Catch.MonadThrow m) => Control.Monad.Trans.Resource.Internal.MonadResource (Yesod.Core.Types.WidgetT site m)
+ Yesod.Core.Handler: getPostParams :: MonadHandler m => m [(Text, Text)]
+ Yesod.Core.Types: instance (Control.Monad.IO.Class.MonadIO m, Control.Monad.Base.MonadBase GHC.Types.IO m, Control.Monad.Catch.MonadThrow m) => Control.Monad.Trans.Resource.Internal.MonadResource (Yesod.Core.Types.WidgetT site m)
- Yesod.Core: class RenderRoute site => Yesod site where approot = ApprootRelative errorHandler = defaultErrorHandler defaultLayout w = do { p <- widgetToPageContent w; msgs <- getMessages; withUrlRenderer (\ _render_a1hSZ -> do { id ((preEscapedText . pack) "<!DOCTYPE html>\n\ \<html><head><title>"); id (toHtml (pageTitle p)); id ((preEscapedText . pack) "</title>"); asHtmlUrl (pageHead p) _render_a1hSZ; id ((preEscapedText . pack) "</head><body>"); mapM_ (\ (status_a1hT0, msg_a1hT1) -> do { id ((preEscapedText . pack) "<p class=\"message "); id (toHtml status_a1hT0); id ((preEscapedText . pack) "\">"); id (toHtml msg_a1hT1); id ((preEscapedText . pack) "</p>") }) msgs; asHtmlUrl (pageBody p) _render_a1hSZ; id ((preEscapedText . pack) "</body></html>") }) } urlRenderOverride _ _ = Nothing urlParamRenderOverride y route params = addParams params <$> urlRenderOverride y route where addParams [] routeBldr = routeBldr addParams nonEmptyParams routeBldr = let routeBS = toByteString routeBldr qsSeparator = fromChar $ if elem '?' routeBS then '&' else '?' valueToMaybe t = if t == "" then Nothing else Just t queryText = map (id *** valueToMaybe) nonEmptyParams in copyByteString routeBS `mappend` qsSeparator `mappend` renderQueryText False queryText isAuthorized _ _ = return Authorized isWriteRequest _ = do { wai <- waiRequest; return $ W.requestMethod wai `notElem` ["GET", "HEAD", "OPTIONS", "TRACE"] } authRoute _ = Nothing cleanPath _ s = if corrected == s then Right $ map dropDash s else Left corrected where corrected = filter (not . null) s dropDash t | all (== '-') t = drop 1 t | otherwise = t joinPath _ ar pieces' qs' = fromText ar `mappend` encodePath pieces qs where pieces = if null pieces' then [""] else map addDash pieces' qs = map (encodeUtf8 *** go) qs' go "" = Nothing go x = Just $ encodeUtf8 x addDash t | all (== '-') t = cons '-' t | otherwise = t addStaticContent _ _ _ = return Nothing maximumContentLength _ _ = Just $ 2 * 1024 * 1024 makeLogger _ = defaultMakeLogger messageLoggerSource site = defaultMessageLoggerSource $ shouldLogIO site jsLoader _ = BottomOfBody jsAttributes _ = [] makeSessionBackend _ = Just <$> defaultClientSessionBackend 120 defaultKeyFile fileUpload _ (KnownLength size) | size <= 50000 = FileUploadMemory lbsBackEnd fileUpload _ _ = FileUploadDisk tempFileBackEnd shouldLog _ = defaultShouldLog shouldLogIO a b c = return (shouldLog a b c) yesodMiddleware = defaultYesodMiddleware yesodWithInternalState _ _ = bracket createInternalState closeInternalState defaultMessageWidget title body = do { setTitle title; toWidget (\ _render_a1hTD -> do { id ((preEscapedText . pack) "<h1>"); id (toHtml title); id ((preEscapedText . pack) "</h1>\n"); asHtmlUrl body _render_a1hTD }) }
+ Yesod.Core: class RenderRoute site => Yesod site where approot = ApprootRelative errorHandler = defaultErrorHandler defaultLayout w = do { p <- widgetToPageContent w; msgs <- getMessages; withUrlRenderer (\ _render_a1hWe -> do { id ((preEscapedText . pack) "<!DOCTYPE html>\n\ \<html><head><title>"); id (toHtml (pageTitle p)); id ((preEscapedText . pack) "</title>"); asHtmlUrl (pageHead p) _render_a1hWe; id ((preEscapedText . pack) "</head><body>"); mapM_ (\ (status_a1hWf, msg_a1hWg) -> do { id ((preEscapedText . pack) "<p class=\"message "); id (toHtml status_a1hWf); id ((preEscapedText . pack) "\">"); id (toHtml msg_a1hWg); id ((preEscapedText . pack) "</p>") }) msgs; asHtmlUrl (pageBody p) _render_a1hWe; id ((preEscapedText . pack) "</body></html>") }) } urlRenderOverride _ _ = Nothing urlParamRenderOverride y route params = addParams params <$> urlRenderOverride y route where addParams [] routeBldr = routeBldr addParams nonEmptyParams routeBldr = let routeBS = toByteString routeBldr qsSeparator = fromChar $ if elem '?' routeBS then '&' else '?' valueToMaybe t = if t == "" then Nothing else Just t queryText = map (id *** valueToMaybe) nonEmptyParams in copyByteString routeBS `mappend` qsSeparator `mappend` renderQueryText False queryText isAuthorized _ _ = return Authorized isWriteRequest _ = do { wai <- waiRequest; return $ W.requestMethod wai `notElem` ["GET", "HEAD", "OPTIONS", "TRACE"] } authRoute _ = Nothing cleanPath _ s = if corrected == s then Right $ map dropDash s else Left corrected where corrected = filter (not . null) s dropDash t | all (== '-') t = drop 1 t | otherwise = t joinPath _ ar pieces' qs' = fromText ar `mappend` encodePath pieces qs where pieces = if null pieces' then [""] else map addDash pieces' qs = map (encodeUtf8 *** go) qs' go "" = Nothing go x = Just $ encodeUtf8 x addDash t | all (== '-') t = cons '-' t | otherwise = t addStaticContent _ _ _ = return Nothing maximumContentLength _ _ = Just $ 2 * 1024 * 1024 makeLogger _ = defaultMakeLogger messageLoggerSource site = defaultMessageLoggerSource $ shouldLogIO site jsLoader _ = BottomOfBody jsAttributes _ = [] makeSessionBackend _ = Just <$> defaultClientSessionBackend 120 defaultKeyFile fileUpload _ (KnownLength size) | size <= 50000 = FileUploadMemory lbsBackEnd fileUpload _ _ = FileUploadDisk tempFileBackEnd shouldLog _ = defaultShouldLog shouldLogIO a b c = return (shouldLog a b c) yesodMiddleware = defaultYesodMiddleware yesodWithInternalState _ _ = bracket createInternalState closeInternalState defaultMessageWidget title body = do { setTitle title; toWidget (\ _render_a1hWS -> do { id ((preEscapedText . pack) "<h1>"); id (toHtml title); id ((preEscapedText . pack) "</h1>\n"); asHtmlUrl body _render_a1hWS }) }
- Yesod.Core: csrfCheckMiddleware :: Yesod site => HandlerT site IO res -> HandlerT site IO Bool -> CI ByteString -> Text -> HandlerT site IO res
+ Yesod.Core: csrfCheckMiddleware :: HandlerT site IO res -> HandlerT site IO Bool -> CI ByteString -> Text -> HandlerT site IO res
- Yesod.Core: csrfSetCookieMiddleware :: Yesod site => HandlerT site IO res -> SetCookie -> HandlerT site IO res
+ Yesod.Core: csrfSetCookieMiddleware :: HandlerT site IO res -> SetCookie -> HandlerT site IO res
- Yesod.Core: defaultCsrfSetCookieMiddleware :: Yesod site => HandlerT site IO res -> HandlerT site IO res
+ Yesod.Core: defaultCsrfSetCookieMiddleware :: HandlerT site IO res -> HandlerT site IO res
- Yesod.Core: sslOnlyMiddleware :: Yesod site => Int -> HandlerT site IO res -> HandlerT site IO res
+ Yesod.Core: sslOnlyMiddleware :: Int -> HandlerT site IO res -> HandlerT site IO res
- Yesod.Core: widgetToPageContent :: (Eq (Route site), Yesod site) => WidgetT site IO () -> HandlerT site IO (PageContent (Route site))
+ Yesod.Core: widgetToPageContent :: Yesod site => WidgetT site IO () -> HandlerT site IO (PageContent (Route site))
- Yesod.Core.Handler: lookupFile :: (MonadHandler m, MonadResource m) => Text -> m (Maybe FileInfo)
+ Yesod.Core.Handler: lookupFile :: MonadHandler m => Text -> m (Maybe FileInfo)
- Yesod.Core.Handler: lookupFiles :: (MonadHandler m, MonadResource m) => Text -> m [FileInfo]
+ Yesod.Core.Handler: lookupFiles :: MonadHandler m => Text -> m [FileInfo]

Files

ChangeLog.md view
@@ -1,3 +1,10 @@+## 1.4.32++* Fix warnings+* Route parsing handles CRLF line endings+* Add 'getPostParams' in Yesod.Core.Handler+* Haddock rendering improved.+ ## 1.4.31  * Add `parseCheckJsonBody` and `requireCheckJsonBody`
Yesod/Core/Class/Handler.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-} -- Because of ErrorT module Yesod.Core.Class.Handler     ( MonadHandler (..)     , MonadWidget (..)
Yesod/Core/Class/Yesod.hs view
@@ -442,10 +442,9 @@ -- headers are ignored over HTTP. -- -- Since 1.4.7-sslOnlyMiddleware :: Yesod site-                     => Int -- ^ minutes-                     -> HandlerT site IO res-                     -> HandlerT site IO res+sslOnlyMiddleware :: Int -- ^ minutes+                  -> HandlerT site IO res+                  -> HandlerT site IO res sslOnlyMiddleware timeout handler = do     addHeader "Strict-Transport-Security"               $ T.pack $ concat [ "max-age="@@ -496,8 +495,7 @@ -- For details, see the "AJAX CSRF protection" section of "Yesod.Core.Handler". -- -- Since 1.4.14-csrfCheckMiddleware :: Yesod site-                    => HandlerT site IO res+csrfCheckMiddleware :: HandlerT site IO res                     -> HandlerT site IO Bool -- ^ Whether or not to perform the CSRF check.                     -> CI S8.ByteString -- ^ The header name to lookup the CSRF token from.                     -> Text -- ^ The POST parameter name to lookup the CSRF token from.@@ -512,7 +510,7 @@ -- The cookie's path is set to @/@, making it valid for your whole website. -- -- Since 1.4.14-defaultCsrfSetCookieMiddleware :: Yesod site => HandlerT site IO res -> HandlerT site IO res+defaultCsrfSetCookieMiddleware :: HandlerT site IO res -> HandlerT site IO res defaultCsrfSetCookieMiddleware handler = setCsrfCookie >> handler  -- | Takes a 'SetCookie' and overrides its value with a CSRF token, then sets the cookie. See 'setCsrfCookieWithCookie'.@@ -522,7 +520,7 @@ -- Make sure to set the 'setCookiePath' to the root path of your application, otherwise you'll generate a new CSRF token for every path of your app. If your app is run from from e.g. www.example.com\/app1, use @app1@. The vast majority of sites will just use @/@. -- -- Since 1.4.14-csrfSetCookieMiddleware :: Yesod site => HandlerT site IO res -> SetCookie -> HandlerT site IO res+csrfSetCookieMiddleware :: HandlerT site IO res -> SetCookie -> HandlerT site IO res csrfSetCookieMiddleware handler cookie = setCsrfCookieWithCookie cookie >> handler  -- | Calls 'defaultCsrfSetCookieMiddleware' and 'defaultCsrfCheckMiddleware'.@@ -546,7 +544,7 @@ defaultCsrfMiddleware = defaultCsrfSetCookieMiddleware . defaultCsrfCheckMiddleware  -- | Convert a widget to a 'PageContent'.-widgetToPageContent :: (Eq (Route site), Yesod site)+widgetToPageContent :: Yesod site                     => WidgetT site IO ()                     -> HandlerT site IO (PageContent (Route site)) widgetToPageContent w = do
Yesod/Core/Handler.hs view
@@ -31,6 +31,7 @@     , getsYesod     , getUrlRender     , getUrlRenderParams+    , getPostParams     , getCurrentRoute     , getRequest     , waiRequest@@ -339,6 +340,18 @@     => m (Route (HandlerSite m) -> [(Text, Text)] -> Text) getUrlRenderParams = rheRender <$> askHandlerEnv +-- | Get all the post parameters passed to the handler. To also get+-- the submitted files (if any), you have to use 'runRequestBody'+-- instead of this function.+--+-- @since 1.4.33+getPostParams+  :: MonadHandler m+  => m [(Text, Text)]+getPostParams = do+  reqBodyContent <- runRequestBody+  return $ fst reqBodyContent+ -- | Get the route requested by the user. If this is a 404 response- where the -- user requested an invalid route- this function will return 'Nothing'. getCurrentRoute :: MonadHandler m => m (Maybe (Route (HandlerSite m)))@@ -425,7 +438,7 @@ -- Uses 'handlerToIO', liftResourceT, and resourceForkIO -- for correctness and efficiency ----- Since 1.2.8+-- @since 1.2.8 forkHandler :: (SomeException -> HandlerT site IO ()) -- ^ error handler               -> HandlerT site IO ()               -> HandlerT site IO ()@@ -617,7 +630,7 @@ -- | Bypass remaining handler code and output the given JSON with the given -- status code. ----- Since 1.4.18+-- @since 1.4.18 sendStatusJSON :: (MonadHandler m, ToJSON c) => H.Status -> c -> m a #if MIN_VERSION_aeson(0, 11, 0) sendStatusJSON s v = sendResponseStatus s (toEncoding v)@@ -642,7 +655,7 @@  -- | Switch over to handling the current request with a WAI @Application@. ----- Since 1.2.17+-- @since 1.2.17 sendWaiApplication :: MonadHandler m => W.Application -> m b sendWaiApplication = handlerError . HCWaiApp @@ -650,7 +663,7 @@ -- WebSockets. Requires WAI 3.0 or later, and a web server which supports raw -- responses (e.g., Warp). ----- Since 1.2.16+-- @since 1.2.16 sendRawResponseNoConduit     :: (MonadHandler m, MonadBaseControl IO m)     => (IO S8.ByteString -> (S8.ByteString -> IO ()) -> m ())@@ -666,7 +679,7 @@ -- WAI 2.1 or later, and a web server which supports raw responses (e.g., -- Warp). ----- Since 1.2.7+-- @since 1.2.7 sendRawResponse :: (MonadHandler m, MonadBaseControl IO m)                 => (Source IO S8.ByteString -> Sink S8.ByteString IO () -> m ())                 -> m a@@ -685,7 +698,7 @@ -- | Send a 304 not modified response immediately. This is a short-circuiting -- action. ----- Since 1.4.4+-- @since 1.4.4 notModified :: MonadHandler m => m a notModified = sendWaiResponse $ W.responseBuilder H.status304 [] mempty @@ -765,7 +778,7 @@ -- Note that, while the data type used here is 'Text', you must provide only -- ASCII value to be HTTP compliant. ----- Since 1.2.0+-- @since 1.2.0 addHeader :: MonadHandler m => Text -> Text -> m () addHeader a = addHeaderInternal . Header (encodeUtf8 a) . encodeUtf8 @@ -810,7 +823,7 @@ -- value is a value etag value, no sanity checking is performed by this -- function. ----- Since 1.4.4+-- @since 1.4.4 setEtag :: MonadHandler m => Text -> m () setEtag etag = do     mmatch <- lookupHeader "if-none-match"@@ -856,7 +869,7 @@  -- | Clear all session variables. ----- Since: 1.0.1+-- @since: 1.0.1 clearSession :: MonadHandler m => m () clearSession = modify $ \x -> x { ghsSession = Map.empty } @@ -896,7 +909,7 @@ -- -- > redirect (NewsfeedR :#: storyId) ----- Since 1.2.9.+-- @since 1.2.9. data Fragment a b = a :#: b deriving (Show, Typeable)  instance (RedirectUrl master a, PathPiece b) => RedirectUrl master (Fragment a b) where@@ -960,7 +973,7 @@  -- | Deprecated synonym for 'withUrlRenderer'. ----- Since 1.2.0+-- @since 1.2.0 giveUrlRenderer :: MonadHandler m                 => ((Route (HandlerSite m) -> [(Text, Text)] -> Text) -> output)                 -> m output@@ -970,7 +983,7 @@ -- | Provide a URL rendering function to the given function and return the -- result. Useful for processing Shakespearean templates. ----- Since 1.2.20+-- @since 1.2.20 withUrlRenderer :: MonadHandler m                 => ((Route (HandlerSite m) -> [(Text, Text)] -> Text) -> output)                 -> m output@@ -998,7 +1011,7 @@ -- -- See the original announcement: <http://www.yesodweb.com/blog/2013/03/yesod-1-2-cleaner-internals> ----- Since 1.2.0+-- @since 1.2.0 cached :: (MonadHandler m, Typeable a)        => m a        -> m a@@ -1022,7 +1035,7 @@ -- You can turn those parameters into a ByteString cache key. -- For example, caching a lookup of a Link by a token where multiple token lookups might be performed. ----- Since 1.4.0+-- @since 1.4.0 cachedBy :: (MonadHandler m, Typeable a) => S.ByteString -> m a -> m a cachedBy k action = do     cache <- ghsCacheBy <$> get@@ -1063,13 +1076,13 @@  -- | Lookup a request header. ----- Since 1.2.2+-- @since 1.2.2 lookupHeader :: MonadHandler m => CI S8.ByteString -> m (Maybe S8.ByteString) lookupHeader = fmap listToMaybe . lookupHeaders  -- | Lookup a request header. ----- Since 1.2.2+-- @since 1.2.2 lookupHeaders :: MonadHandler m => CI S8.ByteString -> m [S8.ByteString] lookupHeaders key = do     req <- waiRequest@@ -1078,7 +1091,7 @@ -- | Lookup basic authentication data from __Authorization__ header of -- request. Returns user name and password ----- Since 1.4.9+-- @since 1.4.9 lookupBasicAuth :: (MonadHandler m) => m (Maybe (Text, Text)) lookupBasicAuth = fmap (>>= getBA) (lookupHeader "Authorization")   where@@ -1088,7 +1101,7 @@ -- | Lookup bearer authentication datafrom __Authorization__ header of -- request. Returns bearer token value ----- Since 1.4.9+-- @since 1.4.9 lookupBearerAuth :: (MonadHandler m) => m (Maybe Text) lookupBearerAuth = fmap (>>= getBR)                    (lookupHeader "Authorization")@@ -1119,13 +1132,13 @@ lookupPostParam = fmap listToMaybe . lookupPostParams  -- | Lookup for POSTed files.-lookupFile :: (MonadHandler m, MonadResource m)+lookupFile :: MonadHandler m            => Text            -> m (Maybe FileInfo) lookupFile = fmap listToMaybe . lookupFiles  -- | Lookup for POSTed files.-lookupFiles :: (MonadHandler m, MonadResource m)+lookupFiles :: MonadHandler m             => Text             -> m [FileInfo] lookupFiles pn = do@@ -1162,7 +1175,7 @@ -- | Select a representation to send to the client based on the representations -- provided inside this do-block. Should be used together with 'provideRep'. ----- Since 1.2.0+-- @since 1.2.0 selectRep :: MonadHandler m           => Writer.Writer (Endo [ProvidedRep m]) ()           -> m TypedContent@@ -1218,13 +1231,13 @@  -- | Internal representation of a single provided representation. ----- Since 1.2.0+-- @since 1.2.0 data ProvidedRep m = ProvidedRep !ContentType !(m Content)  -- | Provide a single representation to be used, based on the request of the -- client. Should be used together with 'selectRep'. ----- Since 1.2.0+-- @since 1.2.0 provideRep :: (Monad m, HasContentType a)            => m a            -> Writer.Writer (Endo [ProvidedRep m]) ()@@ -1237,7 +1250,7 @@ -- -- > provideRepType "application/x-special-format" "This is the content" ----- Since 1.2.0+-- @since 1.2.0 provideRepType :: (Monad m, ToContent a)                => ContentType                -> m a@@ -1247,7 +1260,7 @@  -- | Stream in the raw request body without any parsing. ----- Since 1.2.0+-- @since 1.2.0 rawRequestBody :: MonadHandler m => Source m S.ByteString rawRequestBody = do     req <- lift waiRequest@@ -1267,7 +1280,7 @@ -- -- > respond ct = return . TypedContent ct . toContent ----- Since 1.2.0+-- @since 1.2.0 respond :: (Monad m, ToContent a) => ContentType -> a -> m TypedContent respond ct = return . TypedContent ct . toContent @@ -1279,7 +1292,7 @@ -- actions make no sense here. For example: short-circuit responses, setting -- headers, changing status codes, etc. ----- Since 1.2.0+-- @since 1.2.0 respondSource :: ContentType               -> Source (HandlerT site IO) (Flush Builder)               -> HandlerT site IO TypedContent@@ -1293,44 +1306,44 @@ -- | In a streaming response, send a single chunk of data. This function works -- on most datatypes, such as @ByteString@ and @Html@. ----- Since 1.2.0+-- @since 1.2.0 sendChunk :: Monad m => ToFlushBuilder a => a -> Producer m (Flush Builder) sendChunk = yield . toFlushBuilder  -- | In a streaming response, send a flush command, causing all buffered data -- to be immediately sent to the client. ----- Since 1.2.0+-- @since 1.2.0 sendFlush :: Monad m => Producer m (Flush Builder) sendFlush = yield Flush  -- | Type-specialized version of 'sendChunk' for strict @ByteString@s. ----- Since 1.2.0+-- @since 1.2.0 sendChunkBS :: Monad m => S.ByteString -> Producer m (Flush Builder) sendChunkBS = sendChunk  -- | Type-specialized version of 'sendChunk' for lazy @ByteString@s. ----- Since 1.2.0+-- @since 1.2.0 sendChunkLBS :: Monad m => L.ByteString -> Producer m (Flush Builder) sendChunkLBS = sendChunk  -- | Type-specialized version of 'sendChunk' for strict @Text@s. ----- Since 1.2.0+-- @since 1.2.0 sendChunkText :: Monad m => T.Text -> Producer m (Flush Builder) sendChunkText = sendChunk  -- | Type-specialized version of 'sendChunk' for lazy @Text@s. ----- Since 1.2.0+-- @since 1.2.0 sendChunkLazyText :: Monad m => TL.Text -> Producer m (Flush Builder) sendChunkLazyText = sendChunk  -- | Type-specialized version of 'sendChunk' for @Html@s. ----- Since 1.2.0+-- @since 1.2.0 sendChunkHtml :: Monad m => Html -> Producer m (Flush Builder) sendChunkHtml = sendChunk @@ -1374,7 +1387,7 @@  -- | The default cookie name for the CSRF token ("XSRF-TOKEN"). ----- Since 1.4.14+-- @since 1.4.14 defaultCsrfCookieName :: S8.ByteString defaultCsrfCookieName = "XSRF-TOKEN" @@ -1382,7 +1395,7 @@ -- -- The cookie's path is set to @/@, making it valid for your whole website. ----- Since 1.4.14+-- @since 1.4.14 setCsrfCookie :: MonadHandler m => m () setCsrfCookie = setCsrfCookieWithCookie def { setCookieName = defaultCsrfCookieName, setCookiePath = Just "/" } @@ -1390,7 +1403,7 @@ -- -- Make sure to set the 'setCookiePath' to the root path of your application, otherwise you'll generate a new CSRF token for every path of your app. If your app is run from from e.g. www.example.com\/app1, use @app1@. The vast majority of sites will just use @/@. ----- Since 1.4.14+-- @since 1.4.14 setCsrfCookieWithCookie :: MonadHandler m => SetCookie -> m () setCsrfCookieWithCookie cookie  = do     mCsrfToken <- reqToken <$> getRequest@@ -1398,14 +1411,14 @@  -- | The default header name for the CSRF token ("X-XSRF-TOKEN"). ----- Since 1.4.14+-- @since 1.4.14 defaultCsrfHeaderName :: CI S8.ByteString defaultCsrfHeaderName = "X-XSRF-TOKEN"  -- | Takes a header name to lookup a CSRF token. If the value doesn't match the token stored in the session, -- this function throws a 'PermissionDenied' error. ----- Since 1.4.14+-- @since 1.4.14 checkCsrfHeaderNamed :: MonadHandler m => CI S8.ByteString -> m () checkCsrfHeaderNamed headerName = do   valid <- hasValidCsrfHeaderNamed headerName@@ -1413,7 +1426,7 @@  -- | Takes a header name to lookup a CSRF token, and returns whether the value matches the token stored in the session. ----- Since 1.4.14+-- @since 1.4.14 hasValidCsrfHeaderNamed :: MonadHandler m => CI S8.ByteString -> m Bool hasValidCsrfHeaderNamed headerName = do   mCsrfToken  <- reqToken <$> getRequest@@ -1425,14 +1438,14 @@  -- | The default parameter name for the CSRF token ("_token") ----- Since 1.4.14+-- @since 1.4.14 defaultCsrfParamName :: Text defaultCsrfParamName = "_token"  -- | Takes a POST parameter name to lookup a CSRF token. If the value doesn't match the token stored in the session, -- this function throws a 'PermissionDenied' error. ----- Since 1.4.14+-- @since 1.4.14 checkCsrfParamNamed :: MonadHandler m => Text -> m () checkCsrfParamNamed paramName = do   valid <- hasValidCsrfParamNamed paramName@@ -1440,7 +1453,7 @@  -- | Takes a POST parameter name to lookup a CSRF token, and returns whether the value matches the token stored in the session. ----- Since 1.4.14+-- @since 1.4.14 hasValidCsrfParamNamed :: MonadHandler m => Text -> m Bool hasValidCsrfParamNamed paramName = do   mCsrfToken  <- reqToken <$> getRequest@@ -1451,7 +1464,7 @@ -- | Checks that a valid CSRF token is present in either the request headers or POST parameters. -- If the value doesn't match the token stored in the session, this function throws a 'PermissionDenied' error. ----- Since 1.4.14+-- @since 1.4.14 checkCsrfHeaderOrParam :: (MonadHandler m, MonadLogger m)                        => CI S8.ByteString -- ^ The header name to lookup the CSRF token                        -> Text -- ^ The POST parameter name to lookup the CSRF token
Yesod/Core/Json.hs view
@@ -189,7 +189,7 @@ jsonEncodingOrRedirect = jsonOrRedirect' J.toEncoding #endif -jsonOrRedirect' :: (MonadHandler m, J.ToJSON a)+jsonOrRedirect' :: MonadHandler m             => (a -> b)             -> Route (HandlerSite m) -- ^ Redirect target             -> a            -- ^ Data to send via JSON
Yesod/Core/Types.hs view
@@ -462,7 +462,12 @@     WidgetT $ \e -> uninterruptibleMask $ \u -> unWidgetT (a $ q u) e       where q u (WidgetT b) = WidgetT (u . b) +-- CPP to avoid a redundant constraints warning+#if MIN_VERSION_base(4,9,0)+instance (MonadIO m, MonadBase IO m, MonadThrow m) => MonadResource (WidgetT site m) where+#else instance (Applicative m, MonadIO m, MonadBase IO m, MonadThrow m) => MonadResource (WidgetT site m) where+#endif     liftResourceT f = WidgetT $ \hd -> liftIO $ (, mempty) <$> runInternalState f (handlerResource hd)  instance MonadIO m => MonadLogger (WidgetT site m) where
Yesod/Routes/Parse.hs view
@@ -63,7 +63,7 @@ -- invalid input. resourcesFromString :: String -> [ResourceTree String] resourcesFromString =-    fst . parse 0 . filter (not . all (== ' ')) . lines+    fst . parse 0 . filter (not . all (== ' ')) . lines . filter (/= '\r')   where     parse _ [] = ([], [])     parse indent (thisLine:otherLines)
bench/widget.hs view
@@ -7,20 +7,16 @@  import Criterion.Main import Text.Hamlet-import Numeric (showInt) import qualified Data.ByteString.Lazy as L import qualified Text.Blaze.Html.Renderer.Utf8 as Utf8 import Data.Monoid (mconcat) import Text.Blaze.Html5 (table, tr, td) import Text.Blaze.Html (toHtml) import Yesod.Core.Widget-import Control.Monad.Trans.Writer-import Control.Monad.Trans.RWS-import Data.Functor.Identity import Yesod.Core.Types-import Data.Monoid-import Data.IORef+import Data.Int +main :: IO () main = defaultMain     [ bench "bigTable html" $ nf bigTableHtml bigTableData     , bench "bigTable hamlet" $ nf bigTableHamlet bigTableData@@ -35,6 +31,7 @@     bigTableData = replicate rows [1..10]     {-# NOINLINE bigTableData #-} +bigTableHtml :: Show a => [[a]] -> Int64 bigTableHtml rows = L.length $ Utf8.renderHtml $ ($ id) [hamlet| <table>     $forall row <- rows@@ -43,6 +40,7 @@                 <td>#{show cell} |] +bigTableHamlet :: Show a => [[a]] ->  Int64 bigTableHamlet rows = L.length $ Utf8.renderHtml $ ($ id) [hamlet| <table>     $forall row <- rows@@ -51,6 +49,7 @@                 <td>#{show cell} |] +bigTableWidget :: Show a => [[a]] -> IO Int64 bigTableWidget rows = fmap (L.length . Utf8.renderHtml . ($ render)) (run [whamlet| <table>     $forall row <- rows@@ -64,6 +63,7 @@     (_, GWData { gwdBody = Body x }) <- w undefined     return x -bigTableBlaze t = L.length $ Utf8.renderHtml $ table $ mconcat $ map row t+bigTableBlaze :: Show a => [[a]] -> Int64+bigTableBlaze t = L.length $ Utf8.renderHtml $ table $ Data.Monoid.mconcat $ map row t   where     row r = tr $ mconcat $ map (td . toHtml . show) r
− test.hs
@@ -1,5 +0,0 @@-import Test.Hspec-import qualified YesodCoreTest--main :: IO ()-main = hspec YesodCoreTest.specs
test/Hierarchy.hs view
@@ -17,6 +17,9 @@     , toText     , Env (..)     , subDispatch+    -- to avoid warnings+    , deleteDelete2+    , deleteDelete3     ) where  import Test.Hspec
test/RouteSpec.hs view
@@ -118,7 +118,7 @@         route = MySubRoute (pieces, [])  instance Dispatcher MySubParam master where-    dispatcher env (pieces, method) =+    dispatcher env (pieces, _method) =         case map unpack pieces of             [[c]] ->                 let route = ParamRoute c@@ -234,56 +234,65 @@      describe "overlap checking" $ do         it "catches overlapping statics" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /foo Foo2 |]             findOverlapNames routes @?= [("Foo1", "Foo2")]         it "catches overlapping dynamics" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /#Int Foo1 /#String Foo2 |]             findOverlapNames routes @?= [("Foo1", "Foo2")]         it "catches overlapping statics and dynamics" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /#String Foo2 |]             findOverlapNames routes @?= [("Foo1", "Foo2")]         it "catches overlapping multi" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /##*Strings Foo2 |]             findOverlapNames routes @?= [("Foo1", "Foo2")]         it "catches overlapping subsite" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /foo Foo2 Subsite getSubsite |]             findOverlapNames routes @?= [("Foo1", "Foo2")]         it "no false positives" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /bar/#String Foo2 |]             findOverlapNames routes @?= []         it "obeys ignore rules" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /#!String Foo2 /!foo Foo3 |]             findOverlapNames routes @?= []         it "obeys multipiece ignore rules #779" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 /+![String] Foo2 |]             findOverlapNames routes @?= []         it "ignore rules for entire route #779" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /foo Foo1 !/+[String] Foo2 !/#String Foo3@@ -291,7 +300,8 @@ |]             findOverlapNames routes @?= []         it "ignore rules for hierarchy" $ do-            let routes = [parseRoutesNoCheck|+            let routes :: [ResourceTree String]+                routes = [parseRoutesNoCheck| /+[String] Foo1 !/foo Foo2:     /foo Foo3
test/YesodCoreTest/Auth.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses #-}-module YesodCoreTest.Auth (specs, Widget) where+module YesodCoreTest.Auth+    ( specs+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import Test.Hspec
test/YesodCoreTest/Cache.hs view
@@ -3,7 +3,11 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE Rank2Types #-}-module YesodCoreTest.Cache (cacheTest, Widget) where+module YesodCoreTest.Cache+    ( cacheTest+    , Widget+    , resourcesC+    ) where  import Test.Hspec 
test/YesodCoreTest/CleanPath.hs view
@@ -2,7 +2,11 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances, ViewPatterns #-} {-# LANGUAGE CPP #-}-module YesodCoreTest.CleanPath (cleanPathTest, Widget) where+module YesodCoreTest.CleanPath+    ( cleanPathTest+    , Widget+    , resourcesY+    ) where  import Test.Hspec @@ -60,7 +64,7 @@         corrected = filter (not . TS.null) s      joinPath Y ar pieces' qs' =-        fromText ar `mappend` encodePath pieces qs+        fromText ar `Data.Monoid.mappend` encodePath pieces qs       where         pieces = if null pieces' then [""] else pieces'         qs = map (TE.encodeUtf8 *** go) qs'
test/YesodCoreTest/ErrorHandling.hs view
@@ -4,6 +4,7 @@ module YesodCoreTest.ErrorHandling     ( errorHandlingTest     , Widget+    , resourcesApp     ) where import Yesod.Core import Test.Hspec@@ -98,7 +99,7 @@ getFileBadNameR = return $ TypedContent "ignored" $ ContentFile (error "filebadname") Nothing  goodBuilderContent :: Builder-goodBuilderContent = mconcat $ replicate 100 $ fromByteString "This is a test\n"+goodBuilderContent = Data.Monoid.mconcat $ replicate 100 $ fromByteString "This is a test\n"  getGoodBuilderR :: Handler TypedContent getGoodBuilderR = return $ TypedContent "text/plain" $ toContent goodBuilderContent@@ -114,6 +115,7 @@ getErrorR 8 = cacheSeconds undefined getErrorR 9 = setUltDest (undefined :: Text) getErrorR 10 = setMessage undefined+getErrorR x = error $ "getErrorR: " ++ show x  errorHandlingTest :: Spec errorHandlingTest = describe "Test.ErrorHandling" $ do
test/YesodCoreTest/Exceptions.hs view
@@ -1,7 +1,11 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-}-module YesodCoreTest.Exceptions (exceptionsTest, Widget) where+module YesodCoreTest.Exceptions+    ( exceptionsTest+    , Widget+    , resourcesY+    ) where  import Test.Hspec 
test/YesodCoreTest/InternalRequest.hs view
@@ -21,8 +21,8 @@  -- NOTE: this testcase may break on other systems/architectures if -- mkStdGen is not identical everywhere (is it?).-looksRandom :: Bool-looksRandom = runST $ do+_looksRandom :: Bool+_looksRandom = runST $ do     gen <- MWC.create     s <- randomString 20 gen     return $ s == "VH9SkhtptqPs6GqtofVg"@@ -57,7 +57,7 @@  noDisabledToken :: Bool noDisabledToken = reqToken r == Nothing where-  r = parseWaiRequest' defaultRequest mempty False 1000+  r = parseWaiRequest' defaultRequest Data.Monoid.mempty False 1000  ignoreDisabledToken :: Bool ignoreDisabledToken = reqToken r == Nothing where
test/YesodCoreTest/JsLoader.hs view
@@ -1,7 +1,11 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-}-module YesodCoreTest.JsLoader (specs, Widget) where+module YesodCoreTest.JsLoader+    ( specs+    , Widget+    , resourcesH+    ) where  import YesodCoreTest.JsLoaderSites.Bottom (B(..)) 
test/YesodCoreTest/JsLoaderSites/Bottom.hs view
@@ -1,7 +1,11 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-}-module YesodCoreTest.JsLoaderSites.Bottom (B(..), Widget) where+module YesodCoreTest.JsLoaderSites.Bottom+    ( B(..)+    , Widget+    , resourcesB -- avoid warning+    ) where  import Yesod.Core 
test/YesodCoreTest/Json.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses, ViewPatterns #-}-module YesodCoreTest.Json (specs, Widget) where+module YesodCoreTest.Json+    ( specs+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import Test.Hspec
test/YesodCoreTest/Links.hs view
@@ -1,7 +1,11 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances, ViewPatterns #-}-module YesodCoreTest.Links (linksTest, Widget) where+module YesodCoreTest.Links+    ( linksTest+    , Widget+    , resourcesY+    ) where  import Test.Hspec @@ -26,12 +30,16 @@ data Vector a = Vector     deriving (Show, Read, Eq) -instance PathMultiPiece (Vector a)+instance PathMultiPiece (Vector a) where+    toPathMultiPiece = error "toPathMultiPiece"+    fromPathMultiPiece = error "fromPathMultiPiece"  data Foo x y = Foo     deriving (Show, Read, Eq) -instance PathPiece (Foo x y)+instance PathPiece (Foo x y) where+    toPathPiece = error "toPathPiece"+    fromPathPiece = error "fromPathPiece"  instance Yesod Y 
test/YesodCoreTest/NoOverloadedStrings.hs view
@@ -1,7 +1,11 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances, ViewPatterns #-} {-# LANGUAGE OverloadedStrings #-} -- the module name is a lie!!!-module YesodCoreTest.NoOverloadedStrings (noOverloadedTest, Widget) where+module YesodCoreTest.NoOverloadedStrings+    ( noOverloadedTest+    , Widget+    , resourcesY+    ) where  import Test.Hspec import YesodCoreTest.NoOverloadedStringsSub@@ -60,7 +64,7 @@ case_sanity :: IO () case_sanity = runner $ do     res <- request defaultRequest-    assertBody mempty res+    assertBody Data.Monoid.mempty res  case_subsite :: IO () case_subsite = runner $ do
test/YesodCoreTest/RawResponse.hs view
@@ -1,13 +1,13 @@ {-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses, ScopedTypeVariables #-}-module YesodCoreTest.RawResponse (specs, Widget) where+module YesodCoreTest.RawResponse+    ( specs+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import Test.Hspec-import qualified Data.Map as Map-import Network.Wai.Test import Network.Wai (responseStream)-import Data.Text (Text)-import Data.ByteString.Lazy (ByteString) import qualified Data.Conduit.List as CL import qualified Data.ByteString.Char8 as S8 import Data.Conduit@@ -15,7 +15,7 @@ import Data.Char (toUpper) import Control.Exception (try, IOException) import Data.Conduit.Network-import Network.Socket (sClose)+import Network.Socket (close) import Control.Concurrent (threadDelay) import Control.Concurrent.Async (withAsync) import Control.Monad.Trans.Resource (register)@@ -36,7 +36,7 @@  getHomeR :: Handler () getHomeR = do-    ref <- liftIO $ newIORef 0+    ref <- liftIO $ newIORef (0 :: Int)     _ <- register $ writeIORef ref 1     sendRawResponse $ \src sink -> liftIO $ do         val <- readIORef ref@@ -66,7 +66,7 @@         case esocket of             Left (_ :: IOException) -> loop (succ port)             Right socket -> do-                sClose socket+                close socket                 return port  specs :: Spec
test/YesodCoreTest/Redirect.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, MultiParamTypeClasses, OverloadedStrings #-}-module YesodCoreTest.Redirect (specs, Widget) where+module YesodCoreTest.Redirect+    ( specs+    , Widget+    , resourcesY+    ) where  import YesodCoreTest.YesodTest import Yesod.Core.Handler (redirectWith, setEtag)
test/YesodCoreTest/Reps.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses, ViewPatterns #-}-module YesodCoreTest.Reps (specs, Widget) where+module YesodCoreTest.Reps+    ( specs+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import Test.Hspec
test/YesodCoreTest/RequestBodySize.hs view
@@ -1,7 +1,11 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-}-module YesodCoreTest.RequestBodySize (specs, Widget) where+module YesodCoreTest.RequestBodySize+    ( specs+    , Widget+    , resourcesY+    ) where  import Test.Hspec 
test/YesodCoreTest/StubLaxSameSite.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}-module YesodCoreTest.StubLaxSameSite ( App ( App ) ) where+module YesodCoreTest.StubLaxSameSite+    ( App ( App )+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import qualified Web.ClientSession                  as CS
test/YesodCoreTest/StubSslOnly.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}-module YesodCoreTest.StubSslOnly ( App ( App ) ) where+module YesodCoreTest.StubSslOnly+    ( App ( App )+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import qualified Web.ClientSession                  as CS
test/YesodCoreTest/StubStrictSameSite.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}-module YesodCoreTest.StubStrictSameSite ( App ( App ) ) where+module YesodCoreTest.StubStrictSameSite+    ( App ( App )+    , Widget+    , resourcesApp+    ) where  import Yesod.Core import qualified Web.ClientSession                  as CS
test/YesodCoreTest/StubUnsecured.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}-module YesodCoreTest.StubUnsecured ( App ( App ) ) where+module YesodCoreTest.StubUnsecured+    ( App ( App )+    , Widget+    , resourcesApp+    ) where  import Yesod.Core 
test/YesodCoreTest/WaiSubsite.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE CPP, QuasiQuotes, TemplateHaskell, TypeFamilies, MultiParamTypeClasses, OverloadedStrings, ViewPatterns #-}-module YesodCoreTest.WaiSubsite (specs, Widget) where+module YesodCoreTest.WaiSubsite+    ( specs+    , Widget+    , resourcesY+    ) where  import YesodCoreTest.YesodTest import Yesod.Core
test/YesodCoreTest/Widget.hs view
@@ -1,7 +1,10 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances, ViewPatterns #-}-module YesodCoreTest.Widget (widgetTest) where+module YesodCoreTest.Widget+    ( widgetTest+    , resourcesY+    ) where  import Test.Hspec 
yesod-core.cabal view
@@ -1,5 +1,5 @@ name:            yesod-core-version:         1.4.31+version:         1.4.32 license:         MIT license-file:    LICENSE author:          Michael Snoyman <michael@snoyman.com>@@ -12,7 +12,6 @@ build-type:      Simple homepage:        http://www.yesodweb.com/ extra-source-files:-  test.hs   test/YesodCoreTest.hs   test/YesodCoreTest/*.hs   test/YesodCoreTest/JsLoaderSites/Bottom.hs@@ -119,6 +118,15 @@     hs-source-dirs: test, .      other-modules: Hierarchy+                   Yesod.Routes.Class+                   Yesod.Routes.Overlap+                   Yesod.Routes.Parse+                   Yesod.Routes.TH+                   Yesod.Routes.TH.Dispatch+                   Yesod.Routes.TH.ParseRoute+                   Yesod.Routes.TH.RenderRoute+                   Yesod.Routes.TH.RouteAttrs+                   Yesod.Routes.TH.Types      -- Workaround for: http://ghc.haskell.org/trac/ghc/ticket/8443     extensions:      TemplateHaskell@@ -137,6 +145,37 @@     type: exitcode-stdio-1.0     main-is: test.hs     hs-source-dirs: test++    other-modules: YesodCoreTest+                   YesodCoreTest.Auth+                   YesodCoreTest.Cache+                   YesodCoreTest.CleanPath+                   YesodCoreTest.Csrf+                   YesodCoreTest.ErrorHandling+                   YesodCoreTest.Exceptions+                   YesodCoreTest.InternalRequest+                   YesodCoreTest.JsLoader+                   YesodCoreTest.JsLoaderSites.Bottom+                   YesodCoreTest.Json+                   YesodCoreTest.Links+                   YesodCoreTest.LiteApp+                   YesodCoreTest.Media+                   YesodCoreTest.MediaData+                   YesodCoreTest.NoOverloadedStrings+                   YesodCoreTest.NoOverloadedStringsSub+                   YesodCoreTest.RawResponse+                   YesodCoreTest.Redirect+                   YesodCoreTest.Reps+                   YesodCoreTest.RequestBodySize+                   YesodCoreTest.Ssl+                   YesodCoreTest.Streaming+                   YesodCoreTest.StubLaxSameSite+                   YesodCoreTest.StubSslOnly+                   YesodCoreTest.StubStrictSameSite+                   YesodCoreTest.StubUnsecured+                   YesodCoreTest.WaiSubsite+                   YesodCoreTest.Widget+                   YesodCoreTest.YesodTest      cpp-options:   -DTEST     build-depends: base