]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Abortion.hs
DefaultPage
[Lucu.git] / Network / HTTP / Lucu / Abortion.hs
index 26ea8b01e9bc4c6f5da8735e2af12046493dd324..6e74bea21d40d8d473a28645aecdf13c8278fbb2 100644 (file)
@@ -15,33 +15,31 @@ module Network.HTTP.Lucu.Abortion
     , abortPage
     )
     where
-
-import           Control.Arrow
-import           Control.Arrow.ArrowIO
-import           Control.Concurrent.STM
-import           Control.Exception
-import           Control.Monad.Trans
+import Control.Arrow
+import Control.Arrow.ArrowIO
+import Control.Concurrent.STM
+import Control.Exception
+import Control.Monad.Trans
 import qualified Data.ByteString.Char8 as C8
-import           Data.Typeable
-import           GHC.Conc (unsafeIOToSTM)
-import           Network.HTTP.Lucu.Config
-import           Network.HTTP.Lucu.DefaultPage
-import           Network.HTTP.Lucu.Headers
-import           Network.HTTP.Lucu.Request
-import           Network.HTTP.Lucu.Response
-import           System.IO.Unsafe
-import           Text.XML.HXT.Arrow.WriteDocument
-import           Text.XML.HXT.Arrow.XmlArrow
-import           Text.XML.HXT.Arrow.XmlState
-
+import qualified Data.Text as T
+import Data.Text.Encoding
+import Data.Typeable
+import Network.HTTP.Lucu.Config
+import Network.HTTP.Lucu.DefaultPage
+import Network.HTTP.Lucu.Headers
+import Network.HTTP.Lucu.Request
+import Network.HTTP.Lucu.Response
+import Text.XML.HXT.Arrow.WriteDocument
+import Text.XML.HXT.Arrow.XmlArrow
+import Text.XML.HXT.Arrow.XmlState
 
 data Abortion = Abortion {
       aboStatus  :: !StatusCode
     , aboHeaders :: !Headers
     , aboMessage :: !(Maybe String)
-    } deriving (Show, Typeable)
+    } deriving (Eq, Show, Typeable, Exception)
 
-instance Exception Abortion
+--instance Exception Abortion
 
 -- |Computation of @'abort' status headers msg@ aborts the
 -- 'Network.HTTP.Lucu.Resource.Resource' monad with given status,
@@ -67,7 +65,7 @@ instance Exception Abortion
 -- > abort MovedPermanently
 -- >       [("Location", "http://example.net/")]
 -- >       (Just "It has been moved to example.net")
-abort :: MonadIO m => StatusCode -> [ (String, String) ] -> Maybe String -> m a
+abort :: MonadIO m ⇒ StatusCode → [ (String, String) ] → Maybe String → m a
 abort status headers msg
     = status `seq` headers `seq` msg `seq`
       let abo = Abortion status (toHeaders $ map pack headers) msg
@@ -78,31 +76,31 @@ abort status headers msg
 
 -- |This is similar to 'abort' but computes it with
 -- 'System.IO.Unsafe.unsafePerformIO'.
-abortPurely :: StatusCode -> [ (String, String) ] -> Maybe String -> a
+abortPurely :: StatusCode → [ (String, String) ] → Maybe String → a
 abortPurely = ((unsafePerformIO .) .) . abort
 
 -- |Computation of @'abortSTM' status headers msg@ just computes
 -- 'abort' in a 'Control.Monad.STM.STM' monad.
-abortSTM :: StatusCode -> [ (String, String) ] -> Maybe String -> STM a
+abortSTM :: StatusCode → [ (String, String) ] → Maybe String → STM a
 abortSTM status headers msg
     = status `seq` headers `seq` msg `seq`
       unsafeIOToSTM $! abort status headers msg
 
 -- | Computation of @'abortA' -< (status, (headers, msg))@ just
 -- computes 'abort' in an 'Control.Arrow.ArrowIO.ArrowIO'.
-abortA :: ArrowIO a => a (StatusCode, ([ (String, String) ], Maybe String)) c
+abortA :: ArrowIO a  a (StatusCode, ([ (String, String) ], Maybe String)) c
 abortA 
     = arrIO3 abort
 
 -- aboMessage が Just なら單に mkDefaultPage に渡すだけで良いので樂だが、
 -- Nothing の場合は getDefaultPage を使ってデフォルトのメッセージを得な
 -- ければならない。
-abortPage :: Config -> Maybe Request -> Response -> Abortion -> String
+abortPage :: Config → Maybe Request → Response → Abortion → String
 abortPage conf reqM res abo
     = conf `seq` reqM `seq` res `seq` abo `seq`
       case aboMessage abo of
         Just msg
-            -> let [html] = unsafePerformIO 
+             let [html] = unsafePerformIO 
                             $ runX ( mkDefaultPage conf (aboStatus abo) (txt msg)
                                      >>>
                                      writeDocumentToString [ withIndent True ]
@@ -110,7 +108,7 @@ abortPage conf reqM res abo
                in
                  html
         Nothing
-            -> let res'  = res { resStatus = aboStatus abo }
+             let res'  = res { resStatus = aboStatus abo }
                    res'' = foldl (.) id [setHeader name value
                                              | (name, value) <- fromHeaders $ aboHeaders abo] res'
                in