1616# along with this program. If not, see <http://www.gnu.org/licenses/>.
1717"""Wrapper for the GitLab API."""
1818
19- from __future__ import print_function
20- from __future__ import absolute_import
2119import importlib
2220import time
2321import warnings
2422
2523import requests
24+ import requests .utils
2625
2726import gitlab .config
2827from gitlab .const import * # noqa
4342 "must update your GitLab URL to use https:// to avoid issues."
4443)
4544
45+ ALLOWED_KEYSET_ENDPOINTS = ["/projects" ]
46+
4647
4748def _sanitize (value ):
4849 if isinstance (value , dict ):
@@ -618,7 +619,7 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
618619
619620 Args:
620621 path (str): Path or full URL to query ('/projects' or
621- 'http://whatever/v4/api/projecs ')
622+ 'http://whatever/v4/api/projects ')
622623 query_data (dict): Data to send as query parameters
623624 **kwargs: Extra options to send to the server (e.g. sudo, page,
624625 per_page)
@@ -642,6 +643,12 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
642643 get_all = kwargs .pop ("all" , False )
643644 url = self ._build_url (path )
644645
646+ # use keyset pagination automatically, if all=True
647+ order_by = kwargs .get ("order_by" )
648+ if path in ALLOWED_KEYSET_ENDPOINTS and (not order_by or order_by == "id" ):
649+ kwargs ["pagination" ] = "keyset"
650+ kwargs ["order_by" ] = "id"
651+
645652 if get_all is True and as_list is True :
646653 return list (GitlabList (self , url , query_data , ** kwargs ))
647654
@@ -781,7 +788,12 @@ def _query(self, url, query_data=None, **kwargs):
781788 query_data = query_data or {}
782789 result = self ._gl .http_request ("get" , url , query_data = query_data , ** kwargs )
783790 try :
784- self ._next_url = result .links ["next" ]["url" ]
791+ links = result .links
792+ if links :
793+ next_url = links ["next" ]["url" ]
794+ else :
795+ next_url = requests .utils .parse_header_links (result .headers ["links" ])[0 ]["url" ]
796+ self ._next_url = next_url
785797 except KeyError :
786798 self ._next_url = None
787799 self ._current_page = result .headers .get ("X-Page" )
0 commit comments