]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Abortion.hs
Network.HTTP.Lucu
[Lucu.git] / Network / HTTP / Lucu / Abortion.hs
index 75ce437bf4159ae2536f224c0860ba6f14343ce7..6f09f534429afc9a0f0428d228161e50c1b05744 100644 (file)
@@ -1,10 +1,9 @@
 module Network.HTTP.Lucu.Abortion
     ( Abortion(..)
-    , abort      -- MonadIO m => StatusCode -> [ (String, String) ] -> String -> m a
-    , abortIO    -- StatusCode -> [ (String, String) ] -> String -> IO a
-    , abortSTM   -- StatusCode -> [ (String, String) ] -> String -> STM a
-    , abortA     -- ArrowIO a => StatusCode -> [ (String, String) ] -> String -> a b c
-    , aboPage    -- Config -> Abortion -> String
+    , abort      -- MonadIO m => StatusCode -> [ (String, String) ] -> Maybe String -> m a
+    , abortSTM   -- StatusCode -> [ (String, String) ] -> Maybe String -> STM a
+    , abortA     -- ArrowIO a => StatusCode -> [ (String, String) ] -> Maybe String -> a b c
+    , abortPage  -- Config -> Maybe Request -> Maybe Response -> Abortion -> String
     )
     where
 
@@ -18,6 +17,8 @@ import           Data.Dynamic
 import           Network.HTTP.Lucu.Config
 import           Network.HTTP.Lucu.DefaultPage
 import           Network.HTTP.Lucu.Headers
+import           Network.HTTP.Lucu.HttpVersion
+import           Network.HTTP.Lucu.Request
 import           Network.HTTP.Lucu.Response
 import           System.IO.Unsafe
 import           Text.XML.HXT.Arrow.WriteDocument
@@ -29,39 +30,53 @@ import           Text.XML.HXT.DOM.XmlKeywords
 data Abortion = Abortion {
       aboStatus  :: StatusCode
     , aboHeaders :: Headers
-    , aboMessage ::  String
+    , aboMessage :: Maybe String
     } deriving (Show, Typeable)
 
 
-abort :: MonadIO m => StatusCode -> [ (String, String) ] -> String -> m a
+abort :: MonadIO m => StatusCode -> [ (String, String) ] -> Maybe String -> m a
 abort status headers msg
-    = liftIO $ abortIO status headers msg
-
-
-abortIO :: StatusCode -> [ (String, String) ] -> String -> IO a
-abortIO status headers msg
     = let abo = Abortion status headers msg
           exc = DynException (toDyn abo)
       in
-        throwIO exc
+        liftIO $ throwIO exc
 
 
-abortSTM :: StatusCode -> [ (String, String) ] -> String -> STM a
+abortSTM :: StatusCode -> [ (String, String) ] -> Maybe String -> STM a
 abortSTM status headers msg
-    = unsafeIOToSTM $ abortIO status headers msg
+    = unsafeIOToSTM $ abort status headers msg
 
 
-abortA :: ArrowIO a => StatusCode -> [ (String, String) ] -> String -> a b c
+abortA :: ArrowIO a => StatusCode -> [ (String, String) ] -> Maybe String -> a b c
 abortA status headers msg
-    = arrIO0 $ abortIO status headers msg
+    = arrIO0 $ abort status headers msg
 
 
-aboPage :: Config -> Abortion -> String
-aboPage conf abo
-    = let [html] = unsafePerformIO 
-                   $ runX ( mkDefaultPage conf (aboStatus abo) (txt $ aboMessage abo)
-                            >>>
-                            writeDocumentToString [(a_indent, v_1)]
-                          )
-      in
-        html
+-- aboMessage が Just なら單に mkDefaultPage に渡すだけで良いので樂だが、
+-- Nothing の場合は getDefaultPage を使ってデフォルトのメッセージを得な
+-- ければならない。しかもその時は resM から Response を捏造までする必要
+-- がある。
+abortPage :: Config -> Maybe Request -> Maybe Response -> Abortion -> String
+abortPage conf reqM resM abo
+    = case aboMessage abo of
+        Just msg
+            -> let [html] = unsafePerformIO 
+                            $ runX ( mkDefaultPage conf (aboStatus abo) (txt msg)
+                                     >>>
+                                     writeDocumentToString [(a_indent, v_1)]
+                                   )
+               in
+                 html
+        Nothing
+            -> let res' = case resM of
+                            Just res -> res { resStatus = aboStatus abo }
+                            Nothing  -> Response {
+                                          resVersion = HttpVersion 1 1
+                                        , resStatus  = aboStatus abo
+                                        , resHeaders = []
+                                        }
+                   res  = foldl (.) id [setHeader name value
+                                            | (name, value) <- aboHeaders abo]
+                          $ res'
+               in
+                 getDefaultPage conf reqM res