import Control.Monad
import qualified Data.ByteString.Lazy.Char8 as B
import Data.ByteString.Lazy.Char8 (ByteString)
-import Data.Map as M
-import Data.Map (Map)
import Data.Maybe
import qualified Data.Sequence as S
-import Data.Sequence (Seq, (<|), ViewR(..))
-import Network
+import Data.Sequence ((<|))
+import Network.Socket
import Network.HTTP.Lucu.Config
import Network.HTTP.Lucu.Chunk
import Network.HTTP.Lucu.DefaultPage
-import Network.HTTP.Lucu.HttpVersion
import Network.HTTP.Lucu.Interaction
import Network.HTTP.Lucu.Parser
import Network.HTTP.Lucu.Postprocess
import Network.HTTP.Lucu.Preprocess
import Network.HTTP.Lucu.Request
import Network.HTTP.Lucu.Response
-import Network.HTTP.Lucu.Resource
import Network.HTTP.Lucu.Resource.Tree
import Prelude hiding (catch)
import System.IO
-requestReader :: Config -> ResTree -> Handle -> HostName -> InteractionQueue -> IO ()
-requestReader cnf tree h host tQueue
- = do catch (do input <- B.hGetContents h
+requestReader :: Config -> ResTree -> Handle -> SockAddr -> InteractionQueue -> IO ()
+requestReader cnf tree h addr tQueue
+ = cnf `seq` tree `seq` h `seq` addr `seq` tQueue `seq`
+ do catch (do input <- B.hGetContents h
acceptRequest input) $ \ exc ->
case exc of
IOException _ -> return ()
acceptNonparsableRequest :: StatusCode -> IO ()
acceptNonparsableRequest status
- = do itr <- newInteraction cnf host Nothing
- let res = Response {
- resVersion = HttpVersion 1 1
- , resStatus = status
- , resHeaders = []
- }
- atomically $ do writeItr itr itrResponse $ Just res
+ = do itr <- newInteraction cnf addr Nothing
+ atomically $ do updateItr itr itrResponse
+ $ \ res -> res {
+ resStatus = status
+ }
writeItr itr itrWillClose True
writeItr itr itrState Done
writeDefaultPage itr
acceptParsableRequest :: Request -> ByteString -> IO ()
acceptParsableRequest req input
- = do itr <- newInteraction cnf host (Just req)
+ = do itr <- newInteraction cnf addr (Just req)
action
<- atomically $
do preprocess itr
- isErr <- readItrF itr itrResponse (isError . resStatus)
- if isErr == Just True then
+ isErr <- readItr itr itrResponse (isError . resStatus)
+ if isErr then
acceptSemanticallyInvalidRequest itr input
else
- case findResource tree $ (reqURI . fromJust . itrRequest) itr of
+ case findResource tree $ reqURI req of
Nothing -- Resource が無かった
-> acceptRequestForNonexistentResource itr input
acceptRequestForNonexistentResource :: Interaction -> ByteString -> STM (IO ())
acceptRequestForNonexistentResource itr input
- = do let res = Response {
- resVersion = HttpVersion 1 1
- , resStatus = NotFound
- , resHeaders = []
- }
- writeItr itr itrResponse $ Just res
+ = do updateItr itr itrResponse
+ $ \res -> res {
+ resStatus = NotFound
+ }
writeItr itr itrState Done
writeDefaultPage itr
postprocess itr
chunkWasMalformed :: Interaction -> IO ()
chunkWasMalformed itr
- = let res = Response {
- resVersion = HttpVersion 1 1
- , resStatus = BadRequest
- , resHeaders = []
- }
- in
- atomically $ do writeItr itr itrResponse $ Just res
- writeItr itr itrWillClose True
- writeItr itr itrState Done
- writeDefaultPage itr
- postprocess itr
+ = atomically $ do updateItr itr itrResponse
+ $ \ res -> res {
+ resStatus = BadRequest
+ }
+ writeItr itr itrWillClose True
+ writeItr itr itrState Done
+ writeDefaultPage itr
+ postprocess itr
observeNonChunkedRequest :: Interaction -> ByteString -> IO ()
observeNonChunkedRequest itr input