packages feed

fb 0.6 → 0.6.0.1

raw patch · 3 files changed

+27/−21 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

fb.cabal view
@@ -1,5 +1,5 @@ name:              fb-version:           0.6+version:           0.6.0.1 license:           BSD3 license-file:      LICENSE author:            Felipe Lessa
src/Facebook/Auth.hs view
@@ -11,6 +11,7 @@     ) where  import Control.Applicative+import Control.Monad (join) import Control.Monad.IO.Class (MonadIO(liftIO)) import Data.Aeson ((.:)) import Data.Aeson.Types (parseEither)@@ -21,6 +22,8 @@  import qualified Control.Exception.Lifted as E import qualified Data.Attoparsec.Char8 as A+import qualified Data.ByteString as B+import qualified Data.ByteString.Char8 as B8 import qualified Data.Conduit as C import qualified Data.Conduit.Attoparsec as C import qualified Data.List as L@@ -91,9 +94,7 @@       creds <- getCreds       let req = fbreq "/oauth/access_token" Nothing $                 tsq creds [code, ("redirect_uri", TE.encodeUtf8 redirectUrl)]-      response <- fbhttp req-      preToken <- lift $ H.responseBody response C.$$-                         C.sinkParser (userAccessTokenParser now)+      preToken <- fmap (userAccessTokenParser now) . asBS =<< fbhttp req        -- Get user's ID throught Facebook's graph.       userInfo <- asJson =<< fbhttp (fbreq "/me" (Just preToken) [("fields", "id")])@@ -117,16 +118,16 @@ -- Facebook as a query string.  Returns an user access token with -- a broken 'UserId'. userAccessTokenParser :: UTCTime -- ^ 'getCurrentTime'-                      -> A.Parser UserAccessToken-userAccessTokenParser now =-    UserAccessToken userId-      <$  A.string "access_token="-      <*> A.takeWhile (/= '?')-      <*  A.string "&expires="-      <*> (toExpire <$> A.decimal)-      <*  A.endOfInput-    where toExpire i = addUTCTime (fromIntegral (i :: Int)) now-          userId = error "userAccessTokenParser: never here"+                      -> B.ByteString+                      -> UserAccessToken+userAccessTokenParser now bs =+    let q = HT.parseQuery bs; lookup' a = join (lookup a q)+    in case (,) <$> lookup' "access_token" <*> lookup' "expires" of+         (Just (tok, expt)) -> UserAccessToken userId tok (toExpire expt)+         _ -> error $ "userAccessTokenParser: failed to parse " ++ show bs+       where toExpire expt = let i = read (B8.unpack expt) :: Int+                             in addUTCTime (fromIntegral i) now+             userId = error "userAccessTokenParser: never here"   -- | The URL an user should be redirected to in order to log them@@ -236,19 +237,14 @@         let req = fbreq "/oauth/access_token" Nothing $                   tsq creds [ ("grant_type", "fb_exchange_token")                             , ("fb_exchange_token", data_) ]-        eresponse <- E.try (fbhttp req)+        eresponse <- E.try (asBS =<< fbhttp req)         case eresponse of           Right response -> do             now <- liftIO getCurrentTime-            either (Left . couldn'tParseExc) Right <$>-              E.try (lift $ H.responseBody response C.$$-                            C.sinkParser (userAccessTokenParser now))+            return (Right $ userAccessTokenParser now response)           Left exc -> return (Left exc)        hasExpiredExc =           mkExc [ "the user access token has already expired, "                 , "so I'll not try to extend it." ]-      couldn'tParseExc (exc :: C.ParseError) =-          mkExc [ "could not parse Facebook's response ("-                , T.pack (show exc), ")" ]       mkExc = FbLibraryException . T.concat . ("extendUserAccessToken: ":)
src/Facebook/Base.hs view
@@ -2,6 +2,7 @@     ( fbreq     , ToSimpleQuery(..)     , asJson+    , asBS     , FacebookException(..)     , fbhttp     , httpCheck@@ -16,8 +17,10 @@ import qualified Control.Exception.Lifted as E import qualified Data.Aeson as A import qualified Data.Attoparsec.Char8 as AT+import qualified Data.ByteString as B import qualified Data.Conduit as C import qualified Data.Conduit.Attoparsec as C+import qualified Data.Conduit.List as CL import qualified Data.Text as T import qualified Network.HTTP.Conduit as H import qualified Network.HTTP.Types as HT@@ -72,6 +75,13 @@              [ "Facebook.Base.asJson: could not parse "              , " Facebook's response as a JSON value ("              , T.pack str, ")" ]++-- | Converts a plain 'H.Response' into a string 'ByteString'.+asBS :: (C.ResourceThrow m, C.IsSource bsrc) =>+        H.Response (bsrc m ByteString)+     -> FacebookT anyAuth (C.ResourceT m) ByteString+asBS response = lift $ H.responseBody response C.$$ fmap B.concat CL.consume+   -- | An exception that may be thrown by functions on this