@@ -27,6 +27,7 @@ import qualified Data.ByteString.Lazy as LBS
27import Data.Functor (($>))
27import Data.Functor (($>))
28import Data.Maybe (fromMaybe)
28import Data.Maybe (fromMaybe)
29import Data.Semigroup ((<>))
29import Data.Semigroup ((<>))
30import Data.Text (Text)
31import Data.Text (Text)
31import qualified Data.Text as T
32import qualified Data.Text as T
32import Data.Text.Encoding (encodeUtf8)
33import Data.Text.Encoding (encodeUtf8)
@@ -37,8 +38,7 @@ import GitHub.Data.Apps (App)
37import GitHub.Data.Definitions (Error (HTTPError))
38import GitHub.Data.Definitions (Error (HTTPError))
38import GitHub.Data.Id (Id, untagId)
39import GitHub.Data.Id (Id, untagId)
39import GitHub.Data.Installations (Installation)
40import GitHub.Data.Installations (Installation)
40−import GitHub.Data.Request (StatusMap)
41+import GitHub.Request (StatusMap, parseResponseJSON)
41−import GitHub.Request (parseResponse)
42import Network.HTTP.Client as HTTP
42import Network.HTTP.Client as HTTP
43import qualified Network.HTTP.Client.Internal as HTTP
43import qualified Network.HTTP.Client.Internal as HTTP
44import qualified Network.HTTP.Types as HTTP
44import qualified Network.HTTP.Types as HTTP
@@ -48,7 +48,7 @@ import Web.JWT (JWTClaimsSet (exp, iat, iss), Signer (RSAPrivateKey), encodeSign
49-- | JWT expiration time. Maximum accepted by GitHub is 10 minutes
49-- | JWT expiration time. Maximum accepted by GitHub is 10 minutes
50jwtExpTime :: NominalDiffTime
50jwtExpTime :: NominalDiffTime
51−jwtExpTime = 600
51+jwtExpTime = 300
53-- | Installation access token expiration time. It is fixed by GitHub and is equal to 1 hour
53-- | Installation access token expiration time. It is fixed by GitHub and is equal to 1 hour
54instKeyExpTime :: NominalDiffTime
54instKeyExpTime :: NominalDiffTime
@@ -113,12 +113,13 @@ createAccessTokenR InstallationAuth{..} = do
113 { iat = Just $ toJsonTime currentTime
113 { iat = Just $ toJsonTime currentTime
114 , exp = Just $ toJsonTime expiryTime
114 , exp = Just $ toJsonTime expiryTime
116− jwt = encodeSigned (RSAPrivateKey iaAppPrivateKey) claims
116+ jwt = encodeSigned (RSAPrivateKey iaAppPrivateKey) mempty claims
118 req <- HTTP.parseRequest . T.unpack $ url
118 req <- HTTP.parseRequest . T.unpack $ url
120 { HTTP.requestHeaders =
120 { HTTP.requestHeaders =
121 [ ("Authorization", "Bearer " <> encodeUtf8 jwt)
121 [ ("Authorization", "Bearer " <> encodeUtf8 jwt)
122+ , ("Accept", "application/vnd.github.machine-man-preview+json")
122 , ("User-Agent", "github-app/Haskell")
123 , ("User-Agent", "github-app/Haskell")
124 , HTTP.checkResponse = successOrMissing Nothing
125 , HTTP.checkResponse = successOrMissing Nothing
@@ -147,7 +148,7 @@ obtainAccessToken mgr ia@InstallationAuth{..} = readMVar iaToken >>= \case
147 renew :: IO (Either Error Auth)
148 renew :: IO (Either Error Auth)
148 renew = bracketOnError (takeMVar iaToken) (putMVar iaToken) $ \_ -> do
149 renew = bracketOnError (takeMVar iaToken) (putMVar iaToken) $ \_ -> do
149 req <- createAccessTokenR ia
150 req <- createAccessTokenR ia
150− result <- runExceptT $ httpLbs' req >>= parseResponse
151+ result <- runExceptT $ httpLbs' req >>= parseResponseJSON
151 case result of
152 case result of
152 Right newToken -> putMVar iaToken (Just newToken) $> Right (itToken newToken)
153 Right newToken -> putMVar iaToken (Just newToken) $> Right (itToken newToken)
153 Left err -> putMVar iaToken Nothing $> Left err
154 Left err -> putMVar iaToken Nothing $> Left err