summaryrefslogtreecommitdiff
path: root/src/server/FastCGIUtils.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/FastCGIUtils.hs')
-rw-r--r--src/server/FastCGIUtils.hs31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/server/FastCGIUtils.hs b/src/server/FastCGIUtils.hs
index e9824d099..615915787 100644
--- a/src/server/FastCGIUtils.hs
+++ b/src/server/FastCGIUtils.hs
@@ -1,6 +1,8 @@
{-# LANGUAGE DeriveDataTypeable #-}
module FastCGIUtils (initFastCGI, loopFastCGI,
- throwCGIError, handleCGIErrors) where
+ throwCGIError, handleCGIErrors,
+ outputJSONP,
+ splitBy) where
import Control.Concurrent
import Control.Exception
@@ -18,6 +20,10 @@ import System.Time
import Network.FastCGI
+import Text.JSON
+import qualified Codec.Binary.UTF8.String as UTF8 (encodeString, decodeString)
+
+
initFastCGI :: IO ()
initFastCGI = installSignalHandlers
@@ -118,3 +124,26 @@ handleCGIErrors x = x `catchCGI` \e -> case e of
Nothing -> throw e
Just (CGIError c m t) -> outputError c m t
_ -> throw e
+
+-- * General CGI and JSON stuff
+
+outputJSONP :: JSON a => a -> CGI CGIResult
+outputJSONP x =
+ do mc <- getInput "jsonp"
+ let str = case mc of
+ Nothing -> encode x
+ Just c -> c ++ "(" ++ encode x ++ ")"
+ setHeader "Content-Type" "text/json; charset=utf-8"
+ outputStrict $ UTF8.encodeString str
+
+outputStrict :: String -> CGI CGIResult
+outputStrict x | x == x = output x
+ | otherwise = fail "I am the pope."
+
+-- * General utilities
+
+splitBy :: (a -> Bool) -> [a] -> [[a]]
+splitBy _ [] = [[]]
+splitBy f list = case break f list of
+ (first,[]) -> [first]
+ (first,_:rest) -> first : splitBy f rest \ No newline at end of file