]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Abortion.hs
Small fix
[Lucu.git] / Network / HTTP / Lucu / Abortion.hs
index ef704771a7f0164950b52f83700ec9849db49cfd..dc33eb125bfda4027413bb5782aaac51b09cca8c 100644 (file)
@@ -5,6 +5,7 @@
 module Network.HTTP.Lucu.Abortion
     ( Abortion(..)
     , abort
+    , abortPurely
     , abortSTM
     , abortA
     , abortPage
@@ -16,14 +17,14 @@ import           Control.Arrow.ArrowIO
 import           Control.Concurrent.STM
 import           Control.Exception
 import           Control.Monad.Trans
-import           GHC.Conc (unsafeIOToSTM)
+import qualified Data.ByteString.Char8 as C8
 import           Data.Dynamic
+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 {-# SOURCE #-} Network.HTTP.Lucu.Resource
 import           System.IO.Unsafe
 import           Text.XML.HXT.Arrow.WriteDocument
 import           Text.XML.HXT.Arrow.XmlArrow
@@ -64,11 +65,17 @@ data Abortion = Abortion {
 abort :: MonadIO m => StatusCode -> [ (String, String) ] -> Maybe String -> m a
 abort status headers msg
     = status `seq` headers `seq` msg `seq`
-      let abo = Abortion status headers msg
+      let abo = Abortion status (toHeaders $ map pack headers) msg
           exc = DynException (toDyn abo)
       in
         liftIO $ throwIO exc
-{-# SPECIALIZE abort :: StatusCode -> [ (String, String) ] -> Maybe String -> Resource a #-}
+    where
+      pack (x, y) = (C8.pack x, C8.pack y)
+
+-- |This is similar to 'abort' but computes it with
+-- 'System.IO.Unsafe.unsafePerformIO'.
+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.
@@ -82,7 +89,6 @@ abortSTM status headers msg
 abortA :: ArrowIO a => a (StatusCode, ([ (String, String) ], Maybe String)) c
 abortA 
     = arrIO3 abort
-{-# SPECIALIZE abortA :: IOSArrow (StatusCode, ([ (String, String) ], Maybe String)) c #-}
 
 -- aboMessage が Just なら單に mkDefaultPage に渡すだけで良いので樂だが、
 -- Nothing の場合は getDefaultPage を使ってデフォルトのメッセージを得な
@@ -102,7 +108,7 @@ abortPage conf reqM res abo
         Nothing
             -> let res'  = res { resStatus = aboStatus abo }
                    res'' = foldl (.) id [setHeader name value
-                                             | (name, value) <- aboHeaders abo]
+                                             | (name, value) <- fromHeaders $ aboHeaders abo]
                            $ res'
                in
                  getDefaultPage conf reqM res''