growler 0.3.0 → 0.3.1
raw patch · 5 files changed
+22/−13 lines, 5 files
Files
- growler.cabal +2/−3
- src/Web/Growler.hs +3/−1
- src/Web/Growler/Handler.hs +2/−2
- src/Web/Growler/Router.hs +5/−4
- src/Web/Growler/Types.hs +10/−3
growler.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: growler-version: 0.3.0+version: 0.3.1 synopsis: A revised version of the scotty library that attempts to be simpler and more performant. description: Growler provides a very similar interface to scotty, with slight tweaks for performance and a few feature tradeoffs. Growler provides the ability to abort actions (handlers) with arbitrary responses, not just in the event of redirects or raising errors. Growler avoids coercing everything into lazy Text values and reading the whole request body into memory. It also eliminates the ability to abort the handler and have another handler handle the request instead (Scotty's 'next' function). .@@ -20,8 +20,7 @@ cabal-version: >=1.10 library- exposed-modules: Web.Growler- other-modules: Web.Growler.Handler, Web.Growler.Parsable, Web.Growler.Router, Web.Growler.Types+ exposed-modules: Web.Growler, Web.Growler.Handler, Web.Growler.Parsable, Web.Growler.Router, Web.Growler.Types other-extensions: OverloadedStrings, FlexibleContexts, FlexibleInstances, LambdaCase, RankNTypes, ScopedTypeVariables build-depends: base >=4.7 && <4.8, lens >=4.4 && <5, mtl >=2.2 && <3, bytestring >=0.10 && <0.20, http-types >=0.8 && <1, text >=1.1 && <2, wai >=3.0 && <4, wai-extra >=3.0 && <4, regex-compat >=0.95 && <1, blaze-builder >=0.3 && <0.7, unordered-containers >=0.2 && <0.9, aeson, vector, case-insensitive, warp, pipes, pipes-aeson, pipes-wai, monad-control, either >= 4.3.1, transformers-base hs-source-dirs: src
src/Web/Growler.hs view
@@ -21,6 +21,8 @@ , capture , function , literal+, mount+, handlerHook -- ** Handlers , Handler , HandlerT@@ -94,5 +96,5 @@ where processResponse (m, pat, respond) = case route r m pat of Nothing -> Nothing- Just ps -> Just $ runHandler initialState (Just pat) r ps respond+ Just (patRep, ps) -> Just $ runHandler initialState (Just patRep) r ps respond
src/Web/Growler/Handler.hs view
@@ -108,10 +108,10 @@ setHeader hContentType "text/html; charset=utf-8" raw $ TL.encodeUtf8 t -routePattern :: Monad m => HandlerT m (Maybe RoutePattern)+routePattern :: Monad m => HandlerT m (Maybe T.Text) routePattern = HandlerT $ view $ L.matchedPattern -runHandler :: Monad m => ResponseState -> Maybe RoutePattern -> Request -> [Param] -> HandlerT m a -> m (Either ResponseState (a, ResponseState))+runHandler :: Monad m => ResponseState -> Maybe T.Text -> Request -> [Param] -> HandlerT m a -> m (Either ResponseState (a, ResponseState)) runHandler rs pat rq ps m = runEitherT $ do (dx, r, ()) <- runRWST (fromHandler m) (RequestState pat (qsParams ++ ps) rq) rs return (dx, r)
src/Web/Growler/Router.hs view
@@ -19,6 +19,7 @@ , mount , literal , route+ , handlerHook , RoutePattern(..) ) where @@ -107,16 +108,16 @@ addRoute :: (MonadIO m) => StdMethod -> RoutePattern -> HandlerT m () -> GrowlerT m () addRoute method pat action = GrowlerT $ modify ((method, pat, action):) -route :: Request -> StdMethod -> RoutePattern -> Maybe [Param]+route :: Request -> StdMethod -> RoutePattern -> Maybe (T.Text, [Param]) route req method pat = if Right method == parseMethod (requestMethod req) then matchRoute pat req else Nothing -matchRoute :: RoutePattern -> Request -> Maybe [Param]-matchRoute (RoutePattern p) req = let (_, _, rps) = p req in case rps of+matchRoute :: RoutePattern -> Request -> Maybe (T.Text, [Param])+matchRoute (RoutePattern p) req = let (pat, _, rps) = p req in case rps of Fail -> Nothing Partial _ -> Nothing- Complete ps -> Just ps+ Complete ps -> Just (pat, ps) -- Pretend we are at the top level. parseEncodedParams :: B.ByteString -> [Param]
src/Web/Growler/Types.hs view
@@ -44,7 +44,9 @@ Fail -> Fail Partial rps -> Partial (lps <> rps) Complete rps -> Complete (lps <> rps)- Complete lps -> Fail+ Complete lps -> case r of+ Complete rps -> Complete (lps <> rps)+ _ -> Fail mempty = Partial [] instance Monoid RoutePattern where@@ -57,7 +59,12 @@ fromString = capture . T.pack path :: Request -> T.Text-path = T.cons '/' . T.intercalate "/" . pathInfo+path r = case front of+ Just ('/', _) -> full+ _ -> T.cons '/' full+ where+ full = T.intercalate "/" $ pathInfo r+ front = T.uncons full capture :: Text -> RoutePattern capture pat = RoutePattern process@@ -84,7 +91,7 @@ | RawSource !(IO C.ByteString -> (C.ByteString -> IO ()) -> IO ()) !Response data RequestState = RequestState- { requestMatchedPattern :: Maybe RoutePattern+ { requestMatchedPattern :: Maybe T.Text , requestParams :: [Param] , requestRequest :: Request }