]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/RequestReader.hs
Resource paths should not be assumed to be encoded in UTF-8. HTTP/1.1 says nothing...
[Lucu.git] / Network / HTTP / Lucu / RequestReader.hs
index 49317a99ea8343270f222b7061c8bdd8c00cb322..ecaaadb1d28a7f9ad479443c7b27e5dcc22493d1 100644 (file)
@@ -20,13 +20,13 @@ import Data.Sequence.Unicode
 import Data.Text (Text)
 import Network.HTTP.Lucu.Config
 import Network.HTTP.Lucu.Chunk
-import Network.HTTP.Lucu.DefaultPage
 import Network.HTTP.Lucu.HandleLike
 import Network.HTTP.Lucu.Interaction
 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.Internal
 import Network.HTTP.Lucu.Resource.Tree
 import Network.Socket
 import Network.URI
@@ -57,13 +57,25 @@ requestReader cnf tree fbs h port addr tQueue
     = do input ← hGetLBS h
          acceptRequest (Context cnf tree fbs h port addr tQueue) input
       `catches`
-      [ Handler $ \ (_ ∷ IOException)        → return ()
-      , Handler $ \ e → case e of
-                           ThreadKilled      → return ()
-                           _                 → hPutStrLn stderr (show e)
-      , Handler $ \ BlockedIndefinitelyOnSTM → hPutStrLn stderr "requestReader: blocked indefinitely"
-      , Handler $ \ (e ∷ SomeException)      → hPutStrLn stderr (show e)
+      [ Handler handleAsyncE
+      , Handler handleBIOS
+      , Handler handleOthers
       ]
+    where
+      handleAsyncE ∷ AsyncException → IO ()
+      handleAsyncE ThreadKilled = return ()
+      handleAsyncE e            = dump e
+
+      handleBIOS ∷ BlockedIndefinitelyOnSTM → IO ()
+      handleBIOS = dump
+
+      handleOthers ∷ SomeException → IO ()
+      handleOthers = dump
+
+      dump ∷ Exception e ⇒ e → IO ()
+      dump e
+          = do hPutStrLn stderr "requestReader caught an exception:"
+               hPutStrLn stderr (show $ toException e)
 
 acceptRequest ∷ HandleLike h ⇒ Context h → Lazy.ByteString → IO ()
 acceptRequest ctx@(Context {..}) input
@@ -85,7 +97,6 @@ acceptNonparsableRequest ctx@(Context {..}) sc
     = do itr ← newInteraction cConfig cPort cAddr Nothing (Left sc)
          atomically $
              do writeTVar (itrState itr) Done
-                writeDefaultPage itr
                 postprocess itr
                 enqueue ctx itr
 
@@ -111,7 +122,6 @@ acceptSemanticallyInvalidRequest ∷ HandleLike h
                                  → STM (IO ())
 acceptSemanticallyInvalidRequest ctx itr input
     = do writeTVar (itrState itr) Done
-         writeDefaultPage itr
          postprocess itr
          enqueue ctx itr
          return $ acceptRequest ctx input
@@ -139,7 +149,6 @@ acceptRequestForNonexistentResource ctx itr input
     = do atomically $
              do setResponseStatus itr NotFound
                 writeTVar (itrState itr) Done
-                writeDefaultPage itr
                 postprocess itr
                 enqueue ctx itr
          acceptRequest ctx input
@@ -154,8 +163,8 @@ acceptRequestForExistentResource ∷ HandleLike h
 acceptRequestForExistentResource ctx oldItr input rsrcPath rsrcDef
     = do let itr = oldItr { itrResourcePath = Just rsrcPath }
          atomically $ enqueue ctx itr
-         do _ ← runResource rsrcDef itr
-            if reqHasBody $ fromJust $ itrRequest itr then
+         do _ ← spawnResource rsrcDef itr
+            if reqMustHaveBody $ fromJust $ itrRequest itr then
                 observeRequest ctx itr input
             else
                 acceptRequest ctx input
@@ -273,7 +282,6 @@ chunkWasMalformed itr
       do setResponseStatus itr BadRequest
          writeTVar (itrWillClose itr) True
          writeTVar (itrState     itr) Done
-         writeDefaultPage itr
          postprocess itr
 
 observeNonChunkedRequest ∷ HandleLike h