]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Interaction.hs
Many many changes
[Lucu.git] / Network / HTTP / Lucu / Interaction.hs
index 4ac7c093607729fe8784acc3f8e914c96fed1b66..4d153d14e579df2a5d8bc9e410b0e53054f8db0e 100644 (file)
@@ -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