From eac6c1c552bbb41cbc7c76b6456c7646f5b05eaf Mon Sep 17 00:00:00 2001 From: ShahRustam Date: Sun, 17 May 2020 22:44:27 +0300 Subject: [PATCH] Handle error when internet is offline. Resolve # 3503 (#3505) * Handle error when internet is offline. * Fix * minor fix --- platformio/commands/account/client.py | 102 +++++++++++++------------- platformio/exception.py | 4 +- 2 files changed, 51 insertions(+), 55 deletions(-) diff --git a/platformio/commands/account/client.py b/platformio/commands/account/client.py index 825c57d4..6c1ee42e 100644 --- a/platformio/commands/account/client.py +++ b/platformio/commands/account/client.py @@ -21,6 +21,7 @@ import requests.adapters from requests.packages.urllib3.util.retry import Retry # pylint:disable=import-error from platformio import __pioaccount_api__, app +from platformio.exception import InternetIsOffline from platformio.commands.account import exception @@ -75,11 +76,11 @@ class AccountClient(object): app.get_state_item("account", {}).get("email", "") ) - response = self._session.post( + result = self.send_request( + "post", self.api_base_url + "/v1/login", data={"username": username, "password": password}, ) - result = self.raise_error_from_response(response) app.set_state_item("account", result) return result @@ -93,40 +94,35 @@ class AccountClient(object): app.get_state_item("account", {}).get("email", "") ) - response = self._session.post( + result = self.send_request( + "post", self.api_base_url + "/v1/login/code", data={"client_id": client_id, "code": code, "redirect_uri": redirect_uri}, ) - result = self.raise_error_from_response(response) app.set_state_item("account", result) return result def logout(self): - try: - refresh_token = self.get_refresh_token() - except: # pylint:disable=bare-except - raise exception.AccountNotAuthorized() + refresh_token = self.get_refresh_token() self.delete_local_session() - response = requests.post( - self.api_base_url + "/v1/logout", data={"refresh_token": refresh_token}, - ) try: - self.raise_error_from_response(response) + self.send_request( + "post", + self.api_base_url + "/v1/logout", + data={"refresh_token": refresh_token}, + ) except exception.AccountError: pass return True def change_password(self, old_password, new_password): - try: - token = self.fetch_authentication_token() - except: # pylint:disable=bare-except - raise exception.AccountNotAuthorized() - response = self._session.post( + token = self.fetch_authentication_token() + self.send_request( + "post", self.api_base_url + "/v1/password", headers={"Authorization": "Bearer %s" % token}, data={"old_password": old_password, "new_password": new_password}, ) - self.raise_error_from_response(response) return True def registration( @@ -141,7 +137,8 @@ class AccountClient(object): app.get_state_item("account", {}).get("email", "") ) - response = self._session.post( + return self.send_request( + "post", self.api_base_url + "/v1/registration", data={ "username": username, @@ -151,50 +148,41 @@ class AccountClient(object): "lastname": lastname, }, ) - return self.raise_error_from_response(response) def auth_token(self, password, regenerate): - try: - token = self.fetch_authentication_token() - except: # pylint:disable=bare-except - raise exception.AccountNotAuthorized() - response = self._session.post( + token = self.fetch_authentication_token() + result = self.send_request( + "post", self.api_base_url + "/v1/token", headers={"Authorization": "Bearer %s" % token}, data={"password": password, "regenerate": 1 if regenerate else 0}, ) - return self.raise_error_from_response(response).get("auth_token") + return result.get("auth_token") def forgot_password(self, username): - response = self._session.post( - self.api_base_url + "/v1/forgot", data={"username": username}, + return self.send_request( + "post", self.api_base_url + "/v1/forgot", data={"username": username}, ) - return self.raise_error_from_response(response).get("auth_token") def get_profile(self): - try: - token = self.fetch_authentication_token() - except: # pylint:disable=bare-except - raise exception.AccountNotAuthorized() - response = self._session.get( + token = self.fetch_authentication_token() + return self.send_request( + "get", self.api_base_url + "/v1/profile", headers={"Authorization": "Bearer %s" % token}, ) - return self.raise_error_from_response(response) def update_profile(self, profile, current_password): - try: - token = self.fetch_authentication_token() - except: # pylint:disable=bare-except - raise exception.AccountNotAuthorized() + token = self.fetch_authentication_token() profile["current_password"] = current_password - response = self._session.put( + self.delete_local_state("summary") + response = self.send_request( + "put", self.api_base_url + "/v1/profile", headers={"Authorization": "Bearer %s" % token}, data=profile, ) - self.delete_local_state("summary") - return self.raise_error_from_response(response) + return response def get_account_info(self, offline): account = app.get_state_item("account") @@ -212,15 +200,12 @@ class AccountClient(object): "username": account.get("username"), } } - try: - token = self.fetch_authentication_token() - except: # pylint:disable=bare-except - raise exception.AccountNotAuthorized() - response = self._session.get( + token = self.fetch_authentication_token() + result = self.send_request( + "get", self.api_base_url + "/v1/summary", headers={"Authorization": "Bearer %s" % token}, ) - result = self.raise_error_from_response(response) account["summary"] = dict( profile=result.get("profile"), packages=result.get("packages"), @@ -239,18 +224,29 @@ class AccountClient(object): if auth.get("access_token_expire") > time.time(): return auth.get("access_token") if auth.get("refresh_token"): - response = self._session.post( - self.api_base_url + "/v1/login", - headers={"Authorization": "Bearer %s" % auth.get("refresh_token")}, - ) try: - result = self.raise_error_from_response(response) + result = self.send_request( + "post", + self.api_base_url + "/v1/login", + headers={ + "Authorization": "Bearer %s" % auth.get("refresh_token") + }, + ) app.set_state_item("account", result) return result.get("auth").get("access_token") except exception.AccountError: self.delete_local_session() raise exception.AccountNotAuthorized() + def send_request(self, method, url, headers=None, data=None): + try: + response = getattr(self._session, method)( + url, headers=headers or {}, data=data or {} + ) + except requests.exceptions.ConnectionError: + raise InternetIsOffline() + return self.raise_error_from_response(response) + def raise_error_from_response(self, response, expected_codes=(200, 201, 202)): if response.status_code in expected_codes: try: diff --git a/platformio/exception.py b/platformio/exception.py index 905c5ab1..d291ad7f 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -232,8 +232,8 @@ class InternetIsOffline(UserSideException): MESSAGE = ( "You are not connected to the Internet.\n" - "If you build a project first time, we need Internet connection " - "to install all dependencies and toolchains." + "PlatformIO needs the Internet connection to" + " download dependent packages or to work with PIO Account." )