Handle error when internet is offline. Resolve # 3503 (#3505)

* Handle error when internet is offline.

* Fix

* minor fix
This commit is contained in:
ShahRustam
2020-05-17 22:44:27 +03:00
committed by GitHub
parent 54d73e834b
commit eac6c1c552
2 changed files with 51 additions and 55 deletions

View File

@ -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:

View File

@ -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."
)