]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Abortion.hs
staticFile
[Lucu.git] / Network / HTTP / Lucu / Abortion.hs
index ff6915762b41b3795f948274766de52b6686fda6..6c03e8b6732bf5332bbf14792edfda23631a03aa 100644 (file)
@@ -1,9 +1,9 @@
 module Network.HTTP.Lucu.Abortion
     ( Abortion(..)
-    , abort      -- MonadIO m => StatusCode -> [ (String, String) ] -> String -> m 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
 
@@ -17,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
@@ -28,11 +30,11 @@ 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
     = let abo = Abortion status headers msg
           exc = DynException (toDyn abo)
@@ -40,20 +42,38 @@ abort status headers msg
         liftIO $ throwIO exc
 
 
-abortSTM :: StatusCode -> [ (String, String) ] -> String -> STM a
+abortSTM :: StatusCode -> [ (String, String) ] -> Maybe String -> STM a
 abortSTM 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 $ abort status headers msg
 
 
-aboPage :: Config -> Abortion -> String
-aboPage conf abo
-    = let [html] = unsafePerformIO 
-                   $ runX ( mkDefaultPage conf (aboStatus abo) (txt $ aboMessage abo)
+-- aboMessage が Just なら單に mkDefaultPage に渡すだけで良いので樂だが、
+-- Nothing の場合は getDefaultPage を使ってデフォルトのメッセージを得な
+-- ければならない。しかもその時は resM から Response を捏造までする必要
+-- がある。
+abortPage :: Config -> Maybe Request -> Maybe Response -> Abortion -> String
+abortPage conf reqM resM abo
+    = let msg    = case aboMessage abo of
+                     Just msg -> msg
+                     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
+          [html] = unsafePerformIO 
+                   $ runX ( mkDefaultPage conf (aboStatus abo) (txt msg)
                             >>>
                             writeDocumentToString [(a_indent, v_1)]
                           )