X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FRequestReader.hs;h=c6cdc0e54198eee6f5bc1aaf49d24a03c30fcdaf;hb=50e8fe7af585a8d33d93b3721be8f8f01905b891;hp=8760cb80f45212bd041a9d0b454745fd1030ccd8;hpb=078fc2851ceae061fe368f2bc09fcd16d67ae00f;p=Lucu.git diff --git a/Network/HTTP/Lucu/RequestReader.hs b/Network/HTTP/Lucu/RequestReader.hs index 8760cb8..c6cdc0e 100644 --- a/Network/HTTP/Lucu/RequestReader.hs +++ b/Network/HTTP/Lucu/RequestReader.hs @@ -11,6 +11,7 @@ import Data.ByteString.Lazy.Char8 (ByteString) import Data.Maybe import qualified Data.Sequence as S import Data.Sequence ((<|)) +import GHC.Conc (unsafeIOToSTM) import Network.Socket import Network.HTTP.Lucu.Config import Network.HTTP.Lucu.Chunk @@ -26,9 +27,9 @@ import Prelude hiding (catch) import System.IO -requestReader :: Config -> ResTree -> Handle -> SockAddr -> InteractionQueue -> IO () -requestReader cnf tree h addr tQueue - = cnf `seq` tree `seq` h `seq` addr `seq` tQueue `seq` +requestReader :: Config -> ResTree -> [FallbackHandler] -> Handle -> SockAddr -> InteractionQueue -> IO () +requestReader cnf tree fbs h addr tQueue + = cnf `seq` tree `seq` fbs `seq` h `seq` addr `seq` tQueue `seq` do catch (do input <- B.hGetContents h acceptRequest input) $ \ exc -> case exc of @@ -79,12 +80,13 @@ requestReader cnf tree h addr tQueue if isErr then acceptSemanticallyInvalidRequest itr input else - case findResource tree $ reqURI req of - Nothing -- Resource が無かった - -> acceptRequestForNonexistentResource itr input + do rsrcM <- unsafeIOToSTM $ findResource tree fbs $ reqURI req + case rsrcM of + Nothing -- Resource が無かった + -> acceptRequestForNonexistentResource itr input - Just (rsrcPath, rsrcDef) -- あった - -> acceptRequestForExistentResource itr input rsrcPath rsrcDef + Just (rsrcPath, rsrcDef) -- あった + -> acceptRequestForExistentResource itr input rsrcPath rsrcDef action acceptSemanticallyInvalidRequest :: Interaction -> ByteString -> STM (IO ())