@@ -54,7 +54,6 @@ module GitHub.Request (
5454 ParseResponse (.. ),
5555 makeHttpRequest ,
5656 parseStatus ,
57- parsePageLinks ,
5857 StatusMap ,
5958 getNextUrl ,
6059 performPagedRequest ,
@@ -80,7 +79,6 @@ import Control.Monad.Trans.Class (lift)
8079import Control.Monad.Trans.Except (ExceptT (.. ), runExceptT )
8180import Data.Aeson (eitherDecode )
8281import Data.List (find )
83- import Data.Maybe (fromMaybe )
8482import Data.Tagged (Tagged (.. ))
8583import Data.Version (showVersion )
8684
@@ -89,14 +87,13 @@ import Network.HTTP.Client
8987 httpLbs , method , newManager , redirectCount , requestBody , requestHeaders ,
9088 setQueryString , setRequestIgnoreStatus )
9189import Network.HTTP.Link.Parser (parseLinkHeaderBS )
92- import Network.HTTP.Link.Types (Link ( .. ), LinkParam (.. ), href , linkParams )
90+ import Network.HTTP.Link.Types (LinkParam (.. ), href , linkParams )
9391import Network.HTTP.Types (Method , RequestHeaders , Status (.. ))
9492import Network.URI
9593 (URI , escapeURIString , isUnescapedInURIComponent , parseURIReference ,
9694 relativeTo )
9795
9896import qualified Data.ByteString as BS
99- import Data.ByteString.Builder (intDec , toLazyByteString )
10097import qualified Data.ByteString.Lazy as LBS
10198import qualified Data.Text as T
10299import qualified Data.Text.Encoding as TE
@@ -202,6 +199,11 @@ executeRequest auth req = withOpenSSL $ do
202199 manager <- newManager tlsManagerSettings
203200 executeRequestWithMgr manager auth req
204201
202+ lessFetchCount :: Int -> FetchCount -> Bool
203+ lessFetchCount _ FetchAll = True
204+ lessFetchCount i (FetchAtLeast j) = i < fromIntegral j
205+
206+
205207-- | Like 'executeRequest' but with provided 'Manager'.
206208executeRequestWithMgr
207209 :: (AuthMethod am , ParseResponse mt a )
@@ -233,13 +235,10 @@ executeRequestWithMgrAndRes mgr auth req = runExceptT $ do
233235 res <- httpLbs' httpReq
234236 (<$ res) <$> unTagged (parseResponse httpReq res :: Tagged mt (ExceptT Error IO b ))
235237
236- performHttpReq httpReq (PagedQuery _ _ (FetchPage _)) = do
237- (res, _pageLinks) <- unTagged (performPerPageRequest httpLbs' httpReq :: Tagged mt (ExceptT Error IO (HTTP. Response b , PageLinks )))
238- return res
239- performHttpReq httpReq (PagedQuery _ _ FetchAll ) =
240- unTagged (performPagedRequest httpLbs' (const True ) httpReq :: Tagged mt (ExceptT Error IO (HTTP. Response b )))
241- performHttpReq httpReq (PagedQuery _ _ (FetchAtLeast j)) =
242- unTagged (performPagedRequest httpLbs' (\ v -> length v < fromIntegral j) httpReq :: Tagged mt (ExceptT Error IO (HTTP. Response b )))
238+ performHttpReq httpReq (PagedQuery _ _ l) =
239+ unTagged (performPagedRequest httpLbs' predicate httpReq :: Tagged mt (ExceptT Error IO (HTTP. Response b )))
240+ where
241+ predicate v = lessFetchCount (length v) l
243242
244243 performHttpReq httpReq (Command _ _ _) = do
245244 res <- httpLbs' httpReq
@@ -457,15 +456,15 @@ makeHttpRequest auth r = case r of
457456 $ setReqHeaders
458457 . unTagged (modifyRequest :: Tagged mt (HTTP. Request -> HTTP. Request ))
459458 . maybe id setAuthRequest auth
460- . setQueryString (qs <> extraQueryItems)
459+ . setQueryString qs
461460 $ req
462461 PagedQuery paths qs _ -> do
463462 req <- parseUrl' $ url paths
464463 return
465464 $ setReqHeaders
466465 . unTagged (modifyRequest :: Tagged mt (HTTP. Request -> HTTP. Request ))
467466 . maybe id setAuthRequest auth
468- . setQueryString (qs <> extraQueryItems)
467+ . setQueryString qs
469468 $ req
470469 Command m paths body -> do
471470 req <- parseUrl' $ url paths
@@ -497,14 +496,6 @@ makeHttpRequest auth r = case r of
497496 setBody :: LBS. ByteString -> HTTP. Request -> HTTP. Request
498497 setBody body req = req { requestBody = RequestBodyLBS body }
499498
500- extraQueryItems :: [(BS. ByteString , Maybe BS. ByteString )]
501- extraQueryItems = case r of
502- PagedQuery _ _ (FetchPage pp) -> catMaybes [
503- (\ page -> (" page" , Just (BS. toStrict $ toLazyByteString $ intDec page))) <$> pageParamsPage pp
504- , (\ perPage -> (" per_page" , Just (BS. toStrict $ toLazyByteString $ intDec perPage))) <$> pageParamsPerPage pp
505- ]
506- _ -> []
507-
508499-- | Query @Link@ header with @rel=next@ from the request headers.
509500getNextUrl :: HTTP. Response a -> Maybe URI
510501getNextUrl req = do
@@ -551,35 +542,6 @@ performPagedRequest httpLbs' predicate initReq = Tagged $ do
551542 go (acc <> m) res' req'
552543 (_, _) -> return (acc <$ res)
553544
554- -- | Helper for requesting a single page, as specified by 'PageParams'.
555- --
556- -- This parses and returns the 'PageLinks' alongside the HTTP response.
557- performPerPageRequest
558- :: forall a m mt . (ParseResponse mt a , MonadCatch m , MonadError Error m )
559- => (HTTP. Request -> m (HTTP. Response LBS. ByteString )) -- ^ `httpLbs` analogue
560- -> HTTP. Request -- ^ initial request
561- -> Tagged mt (m (HTTP. Response a , PageLinks ))
562- performPerPageRequest httpLbs' initReq = Tagged $ do
563- res <- httpLbs' initReq
564- m <- unTagged (parseResponse initReq res :: Tagged mt (m a ))
565- return (m <$ res, parsePageLinks res)
566-
567- -- | Parse the 'PageLinks' from an HTTP response, where the information is
568- -- encoded in the Link header.
569- parsePageLinks :: HTTP. Response a -> PageLinks
570- parsePageLinks res = PageLinks {
571- pageLinksPrev = linkToUri <$> find (elem (Rel , " prev" ) . linkParams) links
572- , pageLinksNext = linkToUri <$> find (elem (Rel , " next" ) . linkParams) links
573- , pageLinksLast = linkToUri <$> find (elem (Rel , " last" ) . linkParams) links
574- , pageLinksFirst = linkToUri <$> find (elem (Rel , " first" ) . linkParams) links
575- }
576- where
577- links :: [Link URI ]
578- links = fromMaybe [] (lookup " Link" (responseHeaders res) >>= parseLinkHeaderBS)
579-
580- linkToUri :: Link URI -> URI
581- linkToUri (Link uri _) = uri
582-
583545-------------------------------------------------------------------------------
584546-- Internal
585547-------------------------------------------------------------------------------
0 commit comments