X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FRequestReader.hs;h=8830b5c010f8adf9d562207dfb1b43a33543a7d9;hb=b495d6b8b7647b719eceef2f3e50d5bf87c430cf;hp=7f48c9b0f4774ff853286bda721420dceb2fc678;hpb=a362be1c8664306b970c32e1df9b62081498feb1;p=Lucu.git diff --git a/Network/HTTP/Lucu/RequestReader.hs b/Network/HTTP/Lucu/RequestReader.hs index 7f48c9b..8830b5c 100644 --- a/Network/HTTP/Lucu/RequestReader.hs +++ b/Network/HTTP/Lucu/RequestReader.hs @@ -1,5 +1,6 @@ {-# LANGUAGE - DoAndIfThenElse + CPP + , DoAndIfThenElse , OverloadedStrings , RecordWildCards , ScopedTypeVariables @@ -20,7 +21,6 @@ import Data.List import Data.Maybe import Data.Monoid.Unicode import qualified Data.Sequence as S -import Data.Sequence.Unicode hiding ((∅)) import qualified Data.Text as T import Network.HTTP.Lucu.Abortion import Network.HTTP.Lucu.Config @@ -32,6 +32,7 @@ import Network.HTTP.Lucu.Request import Network.HTTP.Lucu.Response import Network.HTTP.Lucu.Resource.Internal import Network.HTTP.Lucu.Resource.Tree +import Network.HTTP.Lucu.Utils import Network.Socket import Prelude.Unicode import System.IO (hPutStrLn, stderr) @@ -87,18 +88,21 @@ requestReader cnf tree fbs h port addr tQueue acceptRequest ∷ HandleLike h ⇒ Context h → Lazy.ByteString → IO () acceptRequest ctx@(Context {..}) input - -- キューに最大パイプライン深度以上のリクエストが溜まってゐる時は、 - -- それが限度以下になるまで待つ。 = do atomically $ do queue ← readTVar cQueue - when (S.length queue ≥ cnfMaxPipelineDepth cConfig) $ + when (S.length queue ≥ cnfMaxPipelineDepth cConfig) + -- Too many requests in the pipeline... retry - -- リクエストを讀む。パースできない場合は直ちに 400 Bad - -- Request 應答を設定し、それを出力してから切斷するやうに - -- ResponseWriter に通知する。 - case LP.parse request input of - LP.Done input' req → acceptParsableRequest ctx req input' - LP.Fail _ _ _ → acceptNonparsableRequest ctx + if Lazy.null input then + endOfRequests ctx + else + case LP.parse request input of + LP.Done input' req → acceptParsableRequest ctx req input' + LP.Fail _ _ _ → acceptNonparsableRequest ctx + +endOfRequests ∷ HandleLike h ⇒ Context h → IO () +endOfRequests ctx + = enqueue ctx EndOfInteraction acceptNonparsableRequest ∷ HandleLike h ⇒ Context h → IO () acceptNonparsableRequest ctx@(Context {..}) @@ -118,7 +122,9 @@ acceptParsableRequest ctx@(Context {..}) req input do rsrc ← findResource cResTree cFallbacks $ reqURI $ arRequest ar case rsrc of Nothing - → do let ar' = ar { arInitialStatus = NotFound } + → do let ar' = ar { + arInitialStatus = fromStatusCode NotFound + } acceptSemanticallyInvalidRequest ctx ar' input Just (path, def) → acceptRequestForResource ctx ar input path def @@ -141,8 +147,13 @@ acceptRequestForResource ∷ HandleLike h → ResourceDef → IO () acceptRequestForResource ctx@(Context {..}) ar@(AugmentedRequest {..}) input rsrcPath rsrcDef - = do cert ← hGetPeerCert cHandle + = do +#if defined(HAVE_SSL) + cert ← hGetPeerCert cHandle ni ← mkNormalInteraction cConfig cAddr cert ar rsrcPath +#else + ni ← mkNormalInteraction cConfig cAddr ar rsrcPath +#endif tid ← spawnResource rsrcDef ni enqueue ctx ni if reqMustHaveBody arRequest then