X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FInteraction.hs;h=4d153d14e579df2a5d8bc9e410b0e53054f8db0e;hp=4ac7c093607729fe8784acc3f8e914c96fed1b66;hb=1f0a19cbad7c4b64a773d7f1c1ae9180448624e6;hpb=1789cee5ee66d2f7f2b26280be2f13eac4df7980 diff --git a/Network/HTTP/Lucu/Interaction.hs b/Network/HTTP/Lucu/Interaction.hs index 4ac7c09..4d153d1 100644 --- a/Network/HTTP/Lucu/Interaction.hs +++ b/Network/HTTP/Lucu/Interaction.hs @@ -7,6 +7,7 @@ module Network.HTTP.Lucu.Interaction ( Interaction(..) , InteractionState(..) , InteractionQueue + , GetBodyRequest(..) , newInteractionQueue , newInteraction @@ -15,7 +16,7 @@ module Network.HTTP.Lucu.Interaction where import Blaze.ByteString.Builder (Builder) import Control.Concurrent.STM -import qualified Data.ByteString as BS +import qualified Data.ByteString as Strict import Data.Monoid.Unicode import Data.Sequence (Seq) import qualified Data.Sequence as S @@ -39,11 +40,8 @@ data Interaction = Interaction { , itrExpectedContinue ∷ !(Maybe Bool) , itrReqBodyLength ∷ !(Maybe RequestBodyLength) - , itrReqBodyWanted ∷ !(TVar Int) - , itrReqBodyWasteAll ∷ !(TVar Bool) - , itrReqChunkIsOver ∷ !(TVar Bool) - , itrReceivedBody ∷ !(TVar (Seq BS.ByteString)) - , itrReceivedBodyLen ∷ !(TVar Int) + , itrGetBodyRequest ∷ !(TMVar GetBodyRequest) + , itrGotBody ∷ !(TMVar Strict.ByteString) , itrResponse ∷ !(TVar Response) , itrWillChunkBody ∷ !(TVar Bool) @@ -57,15 +55,21 @@ data Interaction = Interaction { -- |The interaction state of Resource monad. 'ExaminingRequest' is the -- initial state. -data InteractionState = ExaminingRequest - | GettingBody - | DecidingHeader - | DecidingBody - | Done - deriving (Show, Eq, Ord, Enum) +data InteractionState + = ExaminingRequest + | GettingBody + | DecidingHeader + | DecidingBody + | Done + deriving (Show, Eq, Ord, Enum) type InteractionQueue = TVar (Seq Interaction) +data GetBodyRequest + = GetBody !Int -- ^ Maximum number of bytes. + | WasteAll + deriving (Show, Eq) + newInteractionQueue ∷ IO InteractionQueue newInteractionQueue = newTVarIO S.empty @@ -83,11 +87,8 @@ newInteraction conf@(Config {..}) port addr cert request , resHeaders = (∅) } - reqBodyWanted ← newTVarIO 0 - reqBodyWasteAll ← newTVarIO False - reqChunkIsOver ← newTVarIO False - receivedBody ← newTVarIO S.empty - receivedBodyLen ← newTVarIO 0 + getBodyRequest ← newEmptyTMVarIO + gotBody ← newEmptyTMVarIO response ← newTVarIO res willChunkBody ← newTVarIO False @@ -99,21 +100,18 @@ newInteraction conf@(Config {..}) port addr cert request state ← newTVarIO ExaminingRequest return Interaction { - itrConfig = conf - , itrLocalPort = port - , itrRemoteAddr = addr - , itrRemoteCert = cert - , itrResourcePath = Nothing - , itrRequest = arRequest ar + itrConfig = conf + , itrLocalPort = port + , itrRemoteAddr = addr + , itrRemoteCert = cert + , itrResourcePath = Nothing + , itrRequest = arRequest ar , itrExpectedContinue = arExpectedContinue ar , itrReqBodyLength = arReqBodyLength ar - , itrReqBodyWanted = reqBodyWanted - , itrReqBodyWasteAll = reqBodyWasteAll - , itrReqChunkIsOver = reqChunkIsOver - , itrReceivedBody = receivedBody - , itrReceivedBodyLen = receivedBodyLen + , itrGetBodyRequest = getBodyRequest + , itrGotBody = gotBody , itrResponse = response , itrWillChunkBody = willChunkBody