--- #prune
+{-# OPTIONS_HADDOCK prune #-}
-- |Aborting the computation of 'Network.HTTP.Lucu.Resource.Resource'
-- in any 'Prelude.IO' monads or arrows.
import System.IO.Unsafe
import Text.XML.HXT.Arrow.WriteDocument
import Text.XML.HXT.Arrow.XmlArrow
-import Text.XML.HXT.Arrow.XmlIOStateArrow
-import Text.XML.HXT.DOM.XmlKeywords
+import Text.XML.HXT.Arrow.XmlState
data Abortion = Abortion {
, aboMessage :: !(Maybe String)
} deriving (Show, Typeable)
+instance Exception Abortion
+
-- |Computation of @'abort' status headers msg@ aborts the
-- 'Network.HTTP.Lucu.Resource.Resource' monad with given status,
-- additional response headers, and optional message string.
--
--- What this really does is to just throw a special
--- 'Control.Exception.DynException'. The exception will be caught by
--- the Lucu.
+-- What this really does is to throw a special
+-- 'Control.Exception.Exception'. The exception will be caught by the
+-- Lucu system.
--
-- 1. If the 'Network.HTTP.Lucu.Resource.Resource' is in the /Deciding
-- Header/ or any precedent states, it is possible to use the
abort status headers msg
= status `seq` headers `seq` msg `seq`
let abo = Abortion status (toHeaders $ map pack headers) msg
- exc = DynException (toDyn abo)
in
- liftIO $ throwIO exc
+ liftIO $ throwIO abo
where
pack (x, y) = (C8.pack x, C8.pack y)
-> let [html] = unsafePerformIO
$ runX ( mkDefaultPage conf (aboStatus abo) (txt msg)
>>>
- writeDocumentToString [(a_indent, v_1)]
+ writeDocumentToString [ withIndent True ]
)
in
html
Nothing
-> let res' = res { resStatus = aboStatus abo }
res'' = foldl (.) id [setHeader name value
- | (name, value) <- fromHeaders $ aboHeaders abo]
- $ res'
+ | (name, value) <- fromHeaders $ aboHeaders abo] res'
in
getDefaultPage conf reqM res''