@@ -10,8 +10,10 @@ module Servant.Server.Internal where
10import Control.Applicative
10import Control.Applicative
11import Control.Monad.Trans.Either
11import Control.Monad.Trans.Either
12import Data.Aeson
12import Data.Aeson
13+import qualified Data.ByteString as B
14+import qualified Data.ByteString.Lazy as BL
13import Data.IORef
15import Data.IORef
14−import Data.Maybe (catMaybes, fromMaybe)
16+import Data.Maybe (catMaybes)
15import Data.Monoid
17import Data.Monoid
16import Data.Proxy
18import Data.Proxy
17import Data.String
19import Data.String
@@ -24,13 +26,27 @@ import Network.Wai
24import Servant.API
26import Servant.API
25import Servant.Common.Text
27import Servant.Common.Text
29+data ReqBodyState = Uncalled
30+ | Called B.ByteString
27toApplication :: RoutingApplication -> Application
33toApplication :: RoutingApplication -> Application
28toApplication ra request respond = do
34toApplication ra request respond = do
29− reqBodyRef <- newIORef Nothing
35+ reqBodyRef <- newIORef Uncalled
30− let memoReqBody = fromMaybe <$> (do
36+ let memoReqBody = do
31− r <- requestBody request
37+ ior <- readIORef reqBodyRef
40+ r <- BL.toStrict <$> strictRequestBody request
32− writeIORef reqBodyRef $ Just r
41+ writeIORef reqBodyRef $ Done r
33− return r ) <*> readIORef reqBodyRef
42+ return r
44+ writeIORef reqBodyRef $ Done bs
47+ writeIORef reqBodyRef $ Called bs
34 ra request{ requestBody = memoReqBody } (routingRespond . routeResult)
50 ra request{ requestBody = memoReqBody } (routingRespond . routeResult)
36 routingRespond :: Either RouteMismatch Response -> IO ResponseReceived
52 routingRespond :: Either RouteMismatch Response -> IO ResponseReceived