diff --git a/ogr/abstract/git_project.py b/ogr/abstract/git_project.py index 9d57df27..0a324403 100644 --- a/ogr/abstract/git_project.py +++ b/ogr/abstract/git_project.py @@ -618,7 +618,12 @@ def change_token(self, new_token: str) -> None: """ raise NotImplementedError - def get_file_content(self, path: str, ref: Optional[str] = None) -> str: + def get_file_content( + self, + path: str, + ref: Optional[str] = None, + headers: Optional[dict[str, str]] = None, + ) -> str: """ Get a content of the file in the repo. @@ -627,6 +632,9 @@ def get_file_content(self, path: str, ref: Optional[str] = None) -> str: ref: Branch or commit. Defaults to repo's default branch. + headers: Additional headers to be sent with the request. + + Defaults to `None`, which means no headers. Returns: Contents of the file as string. diff --git a/ogr/services/forgejo/project.py b/ogr/services/forgejo/project.py index 36311e96..ef4dd775 100644 --- a/ogr/services/forgejo/project.py +++ b/ogr/services/forgejo/project.py @@ -493,7 +493,12 @@ def change_token(self, new_token: str) -> None: "Not possible; requires recreation of the httpx client", ) - def get_file_content(self, path: str, ref: Optional[str] = None) -> str: + def get_file_content( + self, + path: str, + ref: Optional[str] = None, + headers: Optional[dict[str, str]] = None, + ) -> str: try: remote_file: types.ContentsResponse = self.partial_api( self.api.repo_get_contents, diff --git a/ogr/services/github/project.py b/ogr/services/github/project.py index dd1cf1e8..378e7904 100644 --- a/ogr/services/github/project.py +++ b/ogr/services/github/project.py @@ -451,7 +451,12 @@ def fork_create(self, namespace: Optional[str] = None) -> "GithubProject": def change_token(self, new_token: str): raise OperationNotSupported - def get_file_content(self, path: str, ref=None) -> str: + def get_file_content( + self, + path: str, + ref: Optional[str] = None, + headers: Optional[dict[str, str]] = None, + ) -> str: ref = ref or self.default_branch try: return self.github_repo.get_contents( diff --git a/ogr/services/gitlab/project.py b/ogr/services/gitlab/project.py index c18dd3f4..f8dede69 100644 --- a/ogr/services/gitlab/project.py +++ b/ogr/services/gitlab/project.py @@ -405,7 +405,12 @@ def get_commits(self, ref: Optional[str] = None) -> list[str]: for commit in self.gitlab_repo.commits.list(ref_name=ref, all=True) ] - def get_file_content(self, path, ref=None) -> str: + def get_file_content( + self, + path: str, + ref: Optional[str] = None, + headers: Optional[dict[str, str]] = None, + ) -> str: ref = ref or self.default_branch # GitLab cannot resolve './' path = os.path.normpath(path) diff --git a/ogr/services/pagure/project.py b/ogr/services/pagure/project.py index 576cd29b..cea9d424 100644 --- a/ogr/services/pagure/project.py +++ b/ogr/services/pagure/project.py @@ -137,6 +137,7 @@ def _call_project_api_raw( method: Optional[str] = None, params: Optional[dict] = None, data: Optional[dict] = None, + header: Optional[dict] = None, ) -> RequestResponse: """ Call project API endpoint. @@ -152,6 +153,7 @@ def _call_project_api_raw( method: Method of the HTTP request, e.g. `"GET"`, `"POST"`, etc. params: HTTP(S) query parameters in form of a dictionary. data: Data to be sent in form of a dictionary. + header: HTTP request header, dict that will update default headers Returns: `RequestResponse` object containing response. @@ -167,6 +169,7 @@ def _call_project_api_raw( method=method, params=params, data=data, + header=header, ) def _get_project_url(self, *args, add_fork_part=True, add_api_endpoint_part=True): @@ -462,14 +465,21 @@ def add_user_or_group( def change_token(self, new_token: str) -> None: self.service.change_token(new_token) - def get_file_content(self, path: str, ref=None) -> str: + def get_file_content( + self, + path: str, + ref: Optional[str] = None, + headers: Optional[dict[str, str]] = None, + ) -> str: ref = ref or self.default_branch + headers = {"Accept": "text/plain", **(headers or {})} result = self._call_project_api_raw( "raw", ref, "f", path, add_api_endpoint_part=False, + header=headers, ) if not result or result.status_code == HTTPStatus.NOT_FOUND: diff --git a/ogr/services/pagure/service.py b/ogr/services/pagure/service.py index 1efb5f10..e86ff01c 100644 --- a/ogr/services/pagure/service.py +++ b/ogr/services/pagure/service.py @@ -59,9 +59,17 @@ def __init__( self.session.mount("https://", adapter) self.header = {"Authorization": "token " + self._token} if self._token else {} + # By default ogr deals with Pagure API -> json + self.header["Accept"] = "application/json" if user_agent: self.header |= {"User-Agent": user_agent} + else: + try: + from ogr import __version__ as ogr_version + except ImportError: + ogr_version = "dev" + self.header |= {"User-Agent": f"ogr/{ogr_version} (hello@packit.dev)"} if kwargs: logger.warning(f"Ignored keyword arguments: {kwargs}") @@ -193,6 +201,7 @@ def call_api_raw( url: str, method: Optional[str] = None, params: Optional[dict] = None, + header: Optional[dict] = None, data=None, ): """ @@ -202,6 +211,7 @@ def call_api_raw( url: URL to be called. method: Method of the HTTP request, e.g. `"GET"`, `"POST"`, etc. params: HTTP(S) query parameters in form of a dictionary. + header: HTTP request header, dict that will update default headers data: Data to be sent in form of a dictionary. Returns: @@ -216,6 +226,7 @@ def call_api_raw( url=url, params=params, data=data, + header=header, ) except requests.exceptions.ConnectionError as er: @@ -257,14 +268,19 @@ def get_raw_request( ValueError, if JSON cannot be retrieved. """ + headers = self.header | (header or {}) + response = self.session.request( method=method, url=url, params=params, - headers=header or self.header, + headers=headers, data=data, verify=not self.insecure, ) + logger.debug( + f"Ogr sent request with following headers: {headers | {'Authorization': ''}}", + ) json_output = None try: