From 7e2ca33ed53ceb7ed5978b6c02b86d513f4a6724 Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 13:58:15 +0900 Subject: [PATCH 1/7] added: fileSourceByteString This function is to get `FileInfo` raw body. --- yesod-core/Yesod/Core/Handler.hs | 13 ++++++++++++- yesod-core/yesod-core.cabal | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index 5b9cb3b7..cad9e2a8 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -47,6 +47,7 @@ module Yesod.Core.Handler , fileName , fileContentType , fileSource + , fileSourceByteString , fileMove -- *** Convenience functions , languages @@ -252,7 +253,7 @@ import Data.CaseInsensitive (CI, original) import qualified Data.Conduit.List as CL import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO) import qualified System.PosixCompat.Files as PC -import Data.Conduit (ConduitT, transPipe, Flush (Flush), yield, Void) +import Data.Conduit (ConduitT, connect, transPipe, Flush (Flush), yield, Void) import qualified Yesod.Core.TypeCache as Cache import qualified Data.Word8 as W8 import qualified Data.Foldable as Fold @@ -1360,6 +1361,16 @@ rawRequestBody = do fileSource :: MonadResource m => FileInfo -> ConduitT () S.ByteString m () fileSource = transPipe liftResourceT . fileSourceRaw +-- | Strict `ByteString` body from `FileInfo`. +-- This function blocking while read file. +-- +-- > do +-- > fileByteString <- fileSourceByteString fileInfo +-- +-- @since 1.6.4 +fileSourceByteString :: MonadResource m => FileInfo -> m S.ByteString +fileSourceByteString fileInfo = fileSource fileInfo `connect` CL.foldMap id + -- | Provide a pure value for the response body. -- -- > respond ct = return . TypedContent ct . toContent diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index c61e7aad..f9788e6d 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -1,5 +1,5 @@ name: yesod-core -version: 1.6.3 +version: 1.6.4 license: MIT license-file: LICENSE author: Michael Snoyman From 955b21d7ea3c2166a139631a58656b0bd89d511b Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 14:24:57 +0900 Subject: [PATCH 2/7] added: ChangeLog 1.6.4 --- yesod-core/ChangeLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/yesod-core/ChangeLog.md b/yesod-core/ChangeLog.md index 5952081a..6e80a859 100644 --- a/yesod-core/ChangeLog.md +++ b/yesod-core/ChangeLog.md @@ -1,3 +1,7 @@ +## 1.6.4 + +* Add `fileSourceByteString` [#1503](https://github.com/yesodweb/yesod/pull/1503) + ## 1.6.3 * Add missing export for `SubHandlerFor` From 11159f3a751f7023a6af53812616c49a448453ee Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 17:58:49 +0900 Subject: [PATCH 3/7] cleaned: use runConduit and .| instead of connect from code review. --- yesod-core/Yesod/Core/Handler.hs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index cad9e2a8..d054c87e 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -253,7 +253,8 @@ import Data.CaseInsensitive (CI, original) import qualified Data.Conduit.List as CL import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO) import qualified System.PosixCompat.Files as PC -import Data.Conduit (ConduitT, connect, transPipe, Flush (Flush), yield, Void) +import Conduit ((.|), runConduit) +import Data.Conduit (ConduitT, transPipe, Flush (Flush), yield, Void) import qualified Yesod.Core.TypeCache as Cache import qualified Data.Word8 as W8 import qualified Data.Foldable as Fold @@ -1369,7 +1370,7 @@ fileSource = transPipe liftResourceT . fileSourceRaw -- -- @since 1.6.4 fileSourceByteString :: MonadResource m => FileInfo -> m S.ByteString -fileSourceByteString fileInfo = fileSource fileInfo `connect` CL.foldMap id +fileSourceByteString fileInfo = runConduit $ fileSource fileInfo .| CL.foldMap id -- | Provide a pure value for the response body. -- From 1e89f4d4c363763503fd2bf927bef19186c57e47 Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 18:01:36 +0900 Subject: [PATCH 4/7] cleaned: fileSourceByteString: document comment from code review. --- yesod-core/Yesod/Core/Handler.hs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index d054c87e..c3c19f69 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -1362,8 +1362,9 @@ rawRequestBody = do fileSource :: MonadResource m => FileInfo -> ConduitT () S.ByteString m () fileSource = transPipe liftResourceT . fileSourceRaw --- | Strict `ByteString` body from `FileInfo`. --- This function blocking while read file. +-- | Extract a strict `ByteString` body from a `FileInfo`. +-- +-- This function will block while reading the file. -- -- > do -- > fileByteString <- fileSourceByteString fileInfo From 33b5171b758b9d748a37a5deef4f4935e8c9c51c Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 18:54:18 +0900 Subject: [PATCH 5/7] modified: fileSourceByteString: use sinkLazy --- yesod-core/Yesod/Core/Handler.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index c3c19f69..1e9cba46 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -253,7 +253,7 @@ import Data.CaseInsensitive (CI, original) import qualified Data.Conduit.List as CL import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO) import qualified System.PosixCompat.Files as PC -import Conduit ((.|), runConduit) +import Conduit ((.|), runConduit, sinkLazy) import Data.Conduit (ConduitT, transPipe, Flush (Flush), yield, Void) import qualified Yesod.Core.TypeCache as Cache import qualified Data.Word8 as W8 @@ -1371,7 +1371,7 @@ fileSource = transPipe liftResourceT . fileSourceRaw -- -- @since 1.6.4 fileSourceByteString :: MonadResource m => FileInfo -> m S.ByteString -fileSourceByteString fileInfo = runConduit $ fileSource fileInfo .| CL.foldMap id +fileSourceByteString fileInfo = L.toStrict <$> runConduit (fileSource fileInfo .| sinkLazy) -- | Provide a pure value for the response body. -- From e664ae2e0efb3e0da58db4315f8207ddebd12b38 Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 24 Apr 2018 12:55:55 +0900 Subject: [PATCH 6/7] changed: use foldC --- yesod-core/Yesod/Core/Handler.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index b3058f5e..36dc762b 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -254,7 +254,7 @@ import Data.CaseInsensitive (CI, original) import qualified Data.Conduit.List as CL import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO) import qualified System.PosixCompat.Files as PC -import Conduit ((.|), runConduit, sinkLazy) +import Conduit ((.|), runConduit, foldC) import Data.Conduit (ConduitT, transPipe, Flush (Flush), yield, Void) import qualified Yesod.Core.TypeCache as Cache import qualified Data.Word8 as W8 @@ -1392,7 +1392,7 @@ fileSource = transPipe liftResourceT . fileSourceRaw -- -- @since 1.6.5 fileSourceByteString :: MonadResource m => FileInfo -> m S.ByteString -fileSourceByteString fileInfo = L.toStrict <$> runConduit (fileSource fileInfo .| sinkLazy) +fileSourceByteString fileInfo = runConduit $ fileSource fileInfo .| foldC -- | Provide a pure value for the response body. -- From a8df3c48c2dc0898659d6723e173e69ba3b9ebbb Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 1 May 2018 17:15:13 +0900 Subject: [PATCH 7/7] modified: use sinkLazy and toStrict Because performance problem. --- yesod-core/Yesod/Core/Handler.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index 36dc762b..f888ac94 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -254,7 +254,7 @@ import Data.CaseInsensitive (CI, original) import qualified Data.Conduit.List as CL import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO) import qualified System.PosixCompat.Files as PC -import Conduit ((.|), runConduit, foldC) +import Conduit ((.|), runConduit, sinkLazy) import Data.Conduit (ConduitT, transPipe, Flush (Flush), yield, Void) import qualified Yesod.Core.TypeCache as Cache import qualified Data.Word8 as W8 @@ -1392,7 +1392,7 @@ fileSource = transPipe liftResourceT . fileSourceRaw -- -- @since 1.6.5 fileSourceByteString :: MonadResource m => FileInfo -> m S.ByteString -fileSourceByteString fileInfo = runConduit $ fileSource fileInfo .| foldC +fileSourceByteString fileInfo = runConduit (L.toStrict <$> (fileSource fileInfo .| sinkLazy)) -- | Provide a pure value for the response body. --