xing-api-0.1.1: lib/Web/XING/API.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Web.XING.API
( -- * API request interface
apiRequest
) where
import Network.HTTP.Types (Method)
import Network.HTTP.Conduit
(Response(..), Request(..), parseUrl, httpLbs)
import Data.Maybe (fromJust)
import Data.Monoid (mappend)
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BSL
import Control.Monad.Trans.Control (MonadBaseControl)
import Control.Monad.Trans.Resource (MonadResource)
import Web.XING.Types
import Web.XING.API.Error
import qualified Control.Exception.Lifted as E
import Web.Authenticate.OAuth (signOAuth)
apiBaseUrl :: BS.ByteString
apiBaseUrl = "https://api.xing.com"
-- | Low level API request interface
apiRequest
:: (MonadResource m, MonadBaseControl IO m)
=> OAuth -- ^ OAuth consumer
-> Manager
-> AccessToken
-> Method -- ^ HTTP verb
-> BS.ByteString -- ^ HTTP path
-> m (Response BSL.ByteString)
apiRequest oa manager cr m uri = do
let req = fromJust $ parseUrl $ BS.unpack (apiBaseUrl `mappend` uri)
req' <- signOAuth oa cr req{method = m}
E.catch (httpLbs req' manager)
(handleStatusCodeException (m `mappend` " " `mappend` uri))