network-api-support 0.0.7 → 0.0.8
raw patch · 4 files changed
+24/−37 lines, 4 filesdep +http-clientdep ~http-conduit
Dependencies added: http-client
Dependency ranges changed: http-conduit
Files
- network-api-support.cabal +3/−2
- src/Network/Api/Support/Core.hs +5/−15
- src/Network/Api/Support/Request.hs +13/−15
- src/Network/Api/Support/Response.hs +3/−5
network-api-support.cabal view
@@ -1,5 +1,5 @@ Name: network-api-support-Version: 0.0.7+Version: 0.0.8 License: BSD3 License-File: LICENSE Author: Mark Hibberd <mark@hibberd.id.au>@@ -35,8 +35,9 @@ , case-insensitive >= 0.4 , certificate >= 1.2 , failure >= 0.2- , http-conduit >= 1.4+ , http-conduit >= 2.0.0.4 , http-types >= 0.6+ , http-client >= 0.1 , resourcet >= 0.3 , text >= 0.11 , time >= 1
src/Network/Api/Support/Core.hs view
@@ -26,8 +26,8 @@ ManagerSettings -> StdMethod -> Text- -> RequestTransformer m- -> Responder m b+ -> RequestTransformer+ -> Responder b -> m b runRequest settings stdmethod url transform = runRequest' settings url (transform <> setMethod (renderStdMethod stdmethod))@@ -39,21 +39,11 @@ (MonadIO m, MonadBaseControl IO m, MonadThrow m, MonadUnsafeIO m, Failure HttpException m) => ManagerSettings -> Text- -> RequestTransformer m- -> Responder m b+ -> RequestTransformer+ -> Responder b -> m b runRequest' settings url transform responder = do url' <- parseUrl $ unpack url let url'' = url' { checkStatus = const . const . const $ Nothing } -- handle all response codes. let req = appEndo transform url''- liftM (responder req) . withCustomManager settings . httpLbs $ req---- Build a custom connection manager and run ResourceT against that connection manager.--- This function is responsible for ensuring manager is always closed.-withCustomManager ::- (MonadIO m, MonadBaseControl IO m, MonadThrow m, MonadUnsafeIO m) =>- ManagerSettings ->- (Manager -> ResourceT m a) ->- m a-withCustomManager settings f = runResourceT $- allocate (newManager settings) closeManager >>= \(_, manager) -> f manager+ liftM (responder req) . withManagerSettings settings . httpLbs $ req
src/Network/Api/Support/Request.hs view
@@ -15,8 +15,6 @@ , (<>) ) where -import Control.Monad.Trans.Resource- import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import Data.Aeson@@ -25,59 +23,59 @@ import Data.Time import Network.HTTP.Conduit-import Network.HTTP.Conduit.Internal (insertCookiesIntoRequest)+import Network.HTTP.Client (insertCookiesIntoRequest) -- * Request transformers -- | A RequestTransformer allows you to build up attributes on the request. -- | RequestTransformer is simply an Endo, and therefore has a Monoid, so -- | can be combined with `<>`.-type RequestTransformer m = Endo (Request (ResourceT m))+type RequestTransformer = Endo Request -- | Set an api key for use with basic auth.-setApiKey :: B.ByteString -> RequestTransformer m+setApiKey :: B.ByteString -> RequestTransformer setApiKey key = Endo $ applyBasicAuth key "" -- | Set request query parameters.-setParams :: Monad m => [(B.ByteString, B.ByteString)] -> RequestTransformer m+setParams :: [(B.ByteString, B.ByteString)] -> RequestTransformer setParams params = Endo $ urlEncodedBody params -- | Set request headers.-setHeaders :: [(CI B.ByteString, B.ByteString)] -> RequestTransformer m+setHeaders :: [(CI B.ByteString, B.ByteString)] -> RequestTransformer setHeaders hs = Endo $ \r -> r { requestHeaders = hs } -- | Set a request headers.-setHeader :: (CI B.ByteString, B.ByteString) -> RequestTransformer m+setHeader :: (CI B.ByteString, B.ByteString) -> RequestTransformer setHeader h = stripHeader (fst h) <> addHeader h -- | Add a request headers.-addHeader :: (CI B.ByteString, B.ByteString) -> RequestTransformer m+addHeader :: (CI B.ByteString, B.ByteString) -> RequestTransformer addHeader h = Endo $ \r -> r { requestHeaders = requestHeaders r ++ [h] } -- | Set a request headers.-stripHeader :: CI B.ByteString -> RequestTransformer m+stripHeader :: CI B.ByteString -> RequestTransformer stripHeader n = (Endo $ \r -> r { requestHeaders = filter (\x -> fst x == n) (requestHeaders r) }) -- | Register all cookies in cookie jar against request.-setCookieJar :: CookieJar -> UTCTime -> RequestTransformer m+setCookieJar :: CookieJar -> UTCTime -> RequestTransformer setCookieJar cj now = Endo $ \r -> fst $ insertCookiesIntoRequest r cj now -- | Set the request method to be the specified name.-setMethod :: B.ByteString -> RequestTransformer m+setMethod :: B.ByteString -> RequestTransformer setMethod m = Endo $ \r -> r { method = m } -- | Set the request body from the specified byte string.-setBody :: B.ByteString -> RequestTransformer m+setBody :: B.ByteString -> RequestTransformer setBody b = Endo $ \r -> r { requestBody = RequestBodyBS b } -- | Set the request body from the specified lazy byte string.-setBodyLazy :: BL.ByteString -> RequestTransformer m+setBodyLazy :: BL.ByteString -> RequestTransformer setBodyLazy b = Endo $ \r -> r { requestBody = RequestBodyLBS b } -- | Set the request body from the value which can be converted to JSON.-setJson :: ToJSON a => a -> RequestTransformer m+setJson :: ToJSON a => a -> RequestTransformer setJson v = setHeader ("Content-Type", "application/json") <> (setBodyLazy . encode . toJSON $ v)
src/Network/Api/Support/Response.hs view
@@ -6,8 +6,6 @@ , basicResponder ) where -import Control.Monad.Trans.Resource- import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import Data.Attoparsec.Lazy@@ -18,8 +16,8 @@ import Network.HTTP.Types -- | Response handler.-type Responder m a =- Request (ResourceT m) -> Response BL.ByteString -> a+type Responder a =+ Request -> Response BL.ByteString -> a -- | Wrap up json parse and decode errors. data JsonResult a =@@ -54,5 +52,5 @@ (Success a) -> JsonSuccess a -- | Lift function handling status code and body into a responder.-basicResponder :: (Int -> BL.ByteString -> a) -> Responder m a+basicResponder :: (Int -> BL.ByteString -> a) -> Responder a basicResponder f _ r = f (statusCode (responseStatus r)) (responseBody r)