diff --git a/yesod-core/Yesod/Dispatch.hs b/yesod-core/Yesod/Dispatch.hs index e9ce2811..1851e0c7 100644 --- a/yesod-core/Yesod/Dispatch.hs +++ b/yesod-core/Yesod/Dispatch.hs @@ -89,8 +89,8 @@ mkYesodDataGeneral name clazzes isSub res = do let (name':rest) = words name (x, _) <- mkYesodGeneral name' rest clazzes isSub res let rname = mkName $ "resources" ++ name - eres <- [|fmap parseType $(lift res)|] - let y = [ SigD rname $ ListT `AppT` ConT ''Resource + eres <- lift res + let y = [ SigD rname $ ListT `AppT` (ConT ''Resource `AppT` ConT ''String) , FunD rname [Clause [] (NormalB eres) []] ] return $ x ++ y diff --git a/yesod-core/test/YesodCoreTest/Media.hs b/yesod-core/test/YesodCoreTest/Media.hs index 43033785..0b7e4190 100644 --- a/yesod-core/test/YesodCoreTest/Media.hs +++ b/yesod-core/test/YesodCoreTest/Media.hs @@ -1,6 +1,7 @@ {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} module YesodCoreTest.Media (mediaTest, Widget) where import Test.Hspec @@ -9,12 +10,9 @@ import Yesod.Core hiding (Request) import Network.Wai import Network.Wai.Test import Text.Lucius +import YesodCoreTest.MediaData -data Y = Y -mkYesod "Y" [parseRoutes| -/ RootR GET -/static StaticR GET -|] +mkYesodDispatch "Y" resourcesY instance Yesod Y where approot _ = "" diff --git a/yesod-core/test/YesodCoreTest/MediaData.hs b/yesod-core/test/YesodCoreTest/MediaData.hs new file mode 100644 index 00000000..6a33fab3 --- /dev/null +++ b/yesod-core/test/YesodCoreTest/MediaData.hs @@ -0,0 +1,12 @@ +{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE FlexibleInstances #-} +module YesodCoreTest.MediaData where + +import Yesod.Core + +data Y = Y +mkYesodData "Y" [parseRoutes| +/ RootR GET +/static StaticR GET +|] diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index dd9dad4e..f7f94152 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -18,6 +18,7 @@ extra-source-files: test/en.msg test/YesodCoreTest/NoOverloadedStrings.hs test/YesodCoreTest/Media.hs + test/YesodCoreTest/MediaData.hs test/YesodCoreTest/Exceptions.hs test/YesodCoreTest/Widget.hs test/YesodCoreTest/CleanPath.hs diff --git a/yesod-static/Yesod/Static.hs b/yesod-static/Yesod/Static.hs index 549e91af..ceb4833f 100644 --- a/yesod-static/Yesod/Static.hs +++ b/yesod-static/Yesod/Static.hs @@ -40,6 +40,7 @@ module Yesod.Static , staticFilesList , publicFiles -- * Hashing + , base64md5 #ifdef TEST , getFileListPieces #endif @@ -57,11 +58,12 @@ import Data.List (intercalate) import Language.Haskell.TH import Language.Haskell.TH.Syntax -import Crypto.Conduit (hashFile) +import Crypto.Conduit (hashFile, sinkHash) import Crypto.Hash.MD5 (MD5) import qualified Data.ByteString.Base64 import qualified Data.ByteString.Char8 as S8 +import qualified Data.ByteString.Lazy as L import qualified Data.Serialize import Data.Text (Text, pack) import Data.Monoid (mempty) @@ -74,6 +76,9 @@ import qualified Data.ByteString as S import Network.HTTP.Types (status301) import System.PosixCompat.Files (getFileStatus, modificationTime) import System.Posix.Types (EpochTime) +import Data.Conduit (($$), runResourceT) +import Data.Conduit.List (sourceList) +import Control.Monad.ST (runST) import Network.Wai.Application.Static ( StaticSettings (..) @@ -315,6 +320,14 @@ base64md5File :: Prelude.FilePath -> IO String base64md5File = fmap (base64 . encode) . hashFile where encode d = Data.Serialize.encode (d :: MD5) +base64md5 :: L.ByteString -> String +base64md5 lbs = + base64 $ encode + $ runST $ runResourceT + $ sourceList (L.toChunks lbs) $$ sinkHash + where + encode d = Data.Serialize.encode (d :: MD5) + base64 :: S.ByteString -> String base64 = map tr . take 8