@@ -33,34 +33,8 @@ data RouteResult a =
33 | Route !a
33 | Route !a
34 deriving (Eq, Show, Read, Functor)
34 deriving (Eq, Show, Read, Functor)
36−data ReqBodyState = Uncalled
37− | Called !B.ByteString
40toApplication :: RoutingApplication -> Application
36toApplication :: RoutingApplication -> Application
41−toApplication ra request respond = do
37+toApplication ra request respond = ra request routingRespond
42− reqBodyRef <- newIORef Uncalled
43− -- We may need to consume the requestBody more than once. In order to
44− -- maintain the illusion that 'requestBody' works as expected,
45− -- 'ReqBodyState' is introduced, and the complete body is memoized and
46− -- returned as many times as requested with empty "Done" marker chunks in
48− -- See https://github.com/haskell-servant/servant/issues/3
50− ior <- readIORef reqBodyRef
53− r <- BL.toStrict <$> strictRequestBody request
54− writeIORef reqBodyRef $ Done r
57− writeIORef reqBodyRef $ Done bs
60− writeIORef reqBodyRef $ Called bs
63− ra request{ requestBody = memoReqBody } routingRespond
65 routingRespond :: RouteResult Response -> IO ResponseReceived
39 routingRespond :: RouteResult Response -> IO ResponseReceived
66 routingRespond (Fail err) = respond $ responseServantErr err
40 routingRespond (Fail err) = respond $ responseServantErr err