+{-# LANGUAGE
+ BangPatterns
+ , UnboxedTuples
+ , UnicodeSyntax
+ #-}
module Network.HTTP.Lucu.RequestReader
( requestReader
)
import Prelude hiding (catch)
import System.IO (stderr)
-
-requestReader :: HandleLike h => Config -> ResTree -> [FallbackHandler] -> h -> SockAddr -> InteractionQueue -> IO ()
-requestReader !cnf !tree !fbs !h !addr !tQueue
+requestReader :: HandleLike h => Config -> ResTree -> [FallbackHandler] -> h -> PortNumber -> SockAddr -> InteractionQueue -> IO ()
+requestReader !cnf !tree !fbs !h !port !addr !tQueue
= do input <- hGetLBS h
acceptRequest input
`catches`
[ Handler (( \ _ -> return () ) :: IOException -> IO ())
, Handler ( \ ThreadKilled -> return () )
- , Handler ( \ BlockedIndefinitely -> hPutStrLn stderr "requestReader: blocked indefinitely" )
+ , Handler ( \ BlockedIndefinitelyOnSTM -> hPutStrLn stderr "requestReader: blocked indefinitely" )
, Handler (( \ e -> hPutStrLn stderr (show e) ) :: SomeException -> IO ())
]
where
acceptNonparsableRequest :: StatusCode -> IO ()
acceptNonparsableRequest status
= {-# SCC "acceptNonparsableRequest" #-}
- do itr <- newInteraction cnf addr Nothing Nothing
+ do itr <- newInteraction cnf port addr Nothing Nothing
atomically $ do updateItr itr itrResponse
$ \ res -> res {
resStatus = status
acceptParsableRequest req input
= {-# SCC "acceptParsableRequest" #-}
do cert <- hGetPeerCert h
- itr <- newInteraction cnf addr cert (Just req)
+ itr <- newInteraction cnf port addr cert (Just req)
action
<- atomically $
do preprocess itr
do let itr = oldItr { itrResourcePath = Just rsrcPath }
requestHasBody <- readItr itr itrRequestHasBody id
enqueue itr
- return $ do runResource rsrcDef itr
+ return $ do _ <- runResource rsrcDef itr
if requestHasBody then
observeRequest itr input
else