execute request in context methods instead of handling them each time

manually
This commit is contained in:
Evgenii Alekseev 2023-03-23 12:43:04 +02:00
parent 57f62ba163
commit d81e91e117
3 changed files with 29 additions and 39 deletions

View File

@ -93,7 +93,8 @@ class ApplicationPackages(ApplicationProperties):
source(str): remote URL of the package archive source(str): remote URL of the package archive
""" """
dst = self.repository.paths.packages / Path(source).name # URL is path, is not it? dst = self.repository.paths.packages / Path(source).name # URL is path, is not it?
response = requests.get(source, stream=True, timeout=None) # timeout=None to suppress pylint warns # timeout=None to suppress pylint warns. Also suppress bandit warnings
response = requests.get(source, stream=True, timeout=None) # nosec
response.raise_for_status() response.raise_for_status()
with dst.open("wb") as local_file: with dst.open("wb") as local_file:

View File

@ -17,10 +17,11 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import contextlib
import logging import logging
import requests import requests
from typing import List, Optional, Tuple from typing import Generator, List, Optional, Tuple
from urllib.parse import quote_plus as urlencode from urllib.parse import quote_plus as urlencode
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
@ -98,6 +99,18 @@ class WebClient(Client, LazyLogging):
address = f"http://{host}:{port}" address = f"http://{host}:{port}"
return address, False return address, False
@contextlib.contextmanager
def __execute_request(self) -> Generator[None, None, None]:
"""
execute request and handle exceptions
"""
try:
yield
except requests.HTTPError as e:
self.logger.exception("could not perform http request: %s", exception_response_text(e))
except Exception:
self.logger.exception("could not perform http request")
def _create_session(self, *, use_unix_socket: bool) -> requests.Session: def _create_session(self, *, use_unix_socket: bool) -> requests.Session:
""" """
generate new request session generate new request session
@ -130,13 +143,9 @@ class WebClient(Client, LazyLogging):
"password": self.user.password "password": self.user.password
} }
try: with self.__execute_request():
response = self.__session.post(self._login_url, json=payload) response = self.__session.post(self._login_url, json=payload)
response.raise_for_status() response.raise_for_status()
except requests.HTTPError as e:
self.logger.exception("could not login as %s: %s", self.user, exception_response_text(e))
except Exception:
self.logger.exception("could not login as %s", self.user)
def _logs_url(self, package_base: str) -> str: def _logs_url(self, package_base: str) -> str:
""" """
@ -177,13 +186,9 @@ class WebClient(Client, LazyLogging):
"package": package.view() "package": package.view()
} }
try: with self.__execute_request():
response = self.__session.post(self._package_url(package.base), json=payload) response = self.__session.post(self._package_url(package.base), json=payload)
response.raise_for_status() response.raise_for_status()
except requests.HTTPError as e:
self.logger.exception("could not add %s: %s", package.base, exception_response_text(e))
except Exception:
self.logger.exception("could not add %s", package.base)
def get(self, package_base: Optional[str]) -> List[Tuple[Package, BuildStatus]]: def get(self, package_base: Optional[str]) -> List[Tuple[Package, BuildStatus]]:
""" """
@ -195,7 +200,7 @@ class WebClient(Client, LazyLogging):
Returns: Returns:
List[Tuple[Package, BuildStatus]]: list of current package description and status if it has been found List[Tuple[Package, BuildStatus]]: list of current package description and status if it has been found
""" """
try: with self.__execute_request():
response = self.__session.get(self._package_url(package_base or "")) response = self.__session.get(self._package_url(package_base or ""))
response.raise_for_status() response.raise_for_status()
@ -204,10 +209,8 @@ class WebClient(Client, LazyLogging):
(Package.from_json(package["package"]), BuildStatus.from_json(package["status"])) (Package.from_json(package["package"]), BuildStatus.from_json(package["status"]))
for package in status_json for package in status_json
] ]
except requests.HTTPError as e:
self.logger.exception("could not get %s: %s", package_base, exception_response_text(e)) # noinspection PyUnreachableCode
except Exception:
self.logger.exception("could not get %s", package_base)
return [] return []
def get_internal(self) -> InternalStatus: def get_internal(self) -> InternalStatus:
@ -217,16 +220,14 @@ class WebClient(Client, LazyLogging):
Returns: Returns:
InternalStatus: current internal (web) service status InternalStatus: current internal (web) service status
""" """
try: with self.__execute_request():
response = self.__session.get(self._status_url) response = self.__session.get(self._status_url)
response.raise_for_status() response.raise_for_status()
status_json = response.json() status_json = response.json()
return InternalStatus.from_json(status_json) return InternalStatus.from_json(status_json)
except requests.HTTPError as e:
self.logger.exception("could not get web service status: %s", exception_response_text(e)) # noinspection PyUnreachableCode
except Exception:
self.logger.exception("could not get web service status")
return InternalStatus(status=BuildStatus()) return InternalStatus(status=BuildStatus())
def logs(self, package_base: str, record: logging.LogRecord) -> None: def logs(self, package_base: str, record: logging.LogRecord) -> None:
@ -254,13 +255,9 @@ class WebClient(Client, LazyLogging):
Args: Args:
package_base(str): basename to remove package_base(str): basename to remove
""" """
try: with self.__execute_request():
response = self.__session.delete(self._package_url(package_base)) response = self.__session.delete(self._package_url(package_base))
response.raise_for_status() response.raise_for_status()
except requests.HTTPError as e:
self.logger.exception("could not delete %s: %s", package_base, exception_response_text(e))
except Exception:
self.logger.exception("could not delete %s", package_base)
def update(self, package_base: str, status: BuildStatusEnum) -> None: def update(self, package_base: str, status: BuildStatusEnum) -> None:
""" """
@ -272,13 +269,9 @@ class WebClient(Client, LazyLogging):
""" """
payload = {"status": status.value} payload = {"status": status.value}
try: with self.__execute_request():
response = self.__session.post(self._package_url(package_base), json=payload) response = self.__session.post(self._package_url(package_base), json=payload)
response.raise_for_status() response.raise_for_status()
except requests.HTTPError as e:
self.logger.exception("could not update %s: %s", package_base, exception_response_text(e))
except Exception:
self.logger.exception("could not update %s", package_base)
def update_self(self, status: BuildStatusEnum) -> None: def update_self(self, status: BuildStatusEnum) -> None:
""" """
@ -289,10 +282,6 @@ class WebClient(Client, LazyLogging):
""" """
payload = {"status": status.value} payload = {"status": status.value}
try: with self.__execute_request():
response = self.__session.post(self._status_url, json=payload) response = self.__session.post(self._status_url, json=payload)
response.raise_for_status() response.raise_for_status()
except requests.HTTPError as e:
self.logger.exception("could not update service status: %s", exception_response_text(e))
except Exception:
self.logger.exception("could not update service status")

View File

@ -21,7 +21,7 @@ def test_get_provider() -> None:
""" """
assert OAuth.get_provider("OAuth2Client") == aioauth_client.OAuth2Client assert OAuth.get_provider("OAuth2Client") == aioauth_client.OAuth2Client
assert OAuth.get_provider("GoogleClient") == aioauth_client.GoogleClient assert OAuth.get_provider("GoogleClient") == aioauth_client.GoogleClient
assert OAuth.get_provider("GoogleClient") == aioauth_client.GoogleClient assert OAuth.get_provider("GithubClient") == aioauth_client.GithubClient
def test_get_provider_not_a_type() -> None: def test_get_provider_not_a_type() -> None:
@ -29,7 +29,7 @@ def test_get_provider_not_a_type() -> None:
must raise an exception if attribute is not a type must raise an exception if attribute is not a type
""" """
with pytest.raises(OptionError): with pytest.raises(OptionError):
OAuth.get_provider("__version__") OAuth.get_provider("RANDOM")
def test_get_provider_invalid_type() -> None: def test_get_provider_invalid_type() -> None: