Spock 0.6.3.0 → 0.6.4.0
raw patch · 4 files changed
+26/−4 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Web.Spock: jsonBody' :: (MonadIO m, FromJSON a) => ActionT m a
Files
- Spock.cabal +1/−1
- src/Web/Spock.hs +1/−1
- src/Web/Spock/Core.hs +21/−2
- src/Web/Spock/Wire.hs +3/−0
Spock.cabal view
@@ -1,5 +1,5 @@ name: Spock-version: 0.6.3.0+version: 0.6.4.0 synopsis: Another Haskell web framework for rapid development description: This toolbox provides everything you need to get a quick start into web hacking with haskell: routing, middleware, json, blaze, sessions, cookies, database helper, csrf-protection, global state Homepage: https://github.com/agrafix/Spock
src/Web/Spock.hs view
@@ -12,7 +12,7 @@ , subcomponent, Http.StdMethod (..) , combineRoute -- * Handeling requests- , request, header, cookie, body, jsonBody, files, UploadedFile (..)+ , request, header, cookie, body, jsonBody, jsonBody', files, UploadedFile (..) , params, param -- * Sending responses , setStatus, setHeader, redirect, jumpNext, setCookie, setCookie', bytes, lazyBytes
src/Web/Spock/Core.hs view
@@ -1,10 +1,11 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-}+{-# LANGUAGE DoAndIfThenElse #-} module Web.Spock.Core ( SpockT, ActionT, spockT , middleware, UploadedFile (..) , defRoute, get, post, head, put, delete, patch- , request, header, cookie, body, jsonBody+ , request, header, cookie, body, jsonBody, jsonBody' , files, params, param, setStatus, setHeader, redirect , jumpNext , setCookie, setCookie'@@ -98,13 +99,31 @@ body :: MonadIO m => ActionT m BS.ByteString body = do req <- request- liftIO $ Wai.requestBody req+ let parseBody = liftIO $ Wai.requestBody req+ parseAll chunks =+ do bs <- parseBody+ if BS.null bs+ then return chunks+ else parseAll (chunks `BS.append` bs)+ parseAll BS.empty -- | Parse the request body as json jsonBody :: (MonadIO m, A.FromJSON a) => ActionT m (Maybe a) jsonBody = do b <- body return $ A.decodeStrict b++-- | Parse the request body as json and fails with 500 status code on error+jsonBody' :: (MonadIO m, A.FromJSON a) => ActionT m a+jsonBody' =+ do b <- body+ case A.eitherDecodeStrict' b of+ Left err ->+ do setStatus status500+ text (T.pack $ "Failed to parse json: " ++ err)+ throwError ActionDone+ Right val ->+ return val -- | Get uploaded files files :: MonadIO m => ActionT m (HM.HashMap T.Text UploadedFile)
src/Web/Spock/Wire.hs view
@@ -83,6 +83,7 @@ = ActionRedirect T.Text | ActionTryNext | ActionError String+ | ActionDone deriving (Show) instance Error ActionInterupt where@@ -198,6 +199,8 @@ do liftIO $ putStrLn $ "Spock Error while handeling " ++ show (Wai.pathInfo req) ++ ": " ++ errorMsg return serverError+ Left ActionDone ->+ return respState Right () -> return respState respState <-