|
17 | 17 | import typing |
18 | 18 | import warnings |
19 | 19 |
|
20 | | -from .common import ClientError, LoginError, InvalidProject |
| 20 | +from .common import ClientError, LoginError, InvalidProject, ErrorCode |
21 | 21 | from .merginproject import MerginProject |
22 | 22 | from .client_pull import ( |
23 | 23 | download_file_finalize, |
@@ -205,19 +205,20 @@ def _do_request(self, request): |
205 | 205 | try: |
206 | 206 | return self.opener.open(request) |
207 | 207 | except urllib.error.HTTPError as e: |
208 | | - if e.headers.get("Content-Type", "") == "application/problem+json": |
209 | | - info = json.load(e) |
210 | | - err_detail = info.get("detail") |
211 | | - else: |
212 | | - err_detail = e.read().decode("utf-8") |
| 208 | + server_response = json.load(e) |
| 209 | + |
| 210 | + # We first to try to get the value from the response otherwise we set a default value |
| 211 | + err_detail = server_response.get("detail", e.read().decode("utf-8")) |
| 212 | + server_code = server_response.get("code", None) |
213 | 213 |
|
214 | | - error_msg = ( |
215 | | - f"HTTP Error: {e.code} {e.reason}\n" |
216 | | - f"URL: {request.get_full_url()}\n" |
217 | | - f"Method: {request.get_method()}\n" |
218 | | - f"Detail: {err_detail}" |
| 214 | + raise ClientError( |
| 215 | + detail=err_detail, |
| 216 | + url=request.get_full_url(), |
| 217 | + server_code=server_code, |
| 218 | + server_response=server_response, |
| 219 | + http_error=e.code, |
| 220 | + http_method=request.get_method(), |
219 | 221 | ) |
220 | | - raise ClientError(error_msg) |
221 | 222 | except urllib.error.URLError as e: |
222 | 223 | # e.g. when DNS resolution fails (no internet connection?) |
223 | 224 | raise ClientError("Error requesting " + request.full_url + ": " + str(e)) |
@@ -429,9 +430,9 @@ def create_workspace(self, workspace_name): |
429 | 430 |
|
430 | 431 | try: |
431 | 432 | self.post("/v1/workspace", params, {"Content-Type": "application/json"}) |
432 | | - except Exception as e: |
433 | | - detail = f"Workspace name: {workspace_name}" |
434 | | - raise ClientError(str(e), detail) |
| 433 | + except ClientError as e: |
| 434 | + e.extra = f"Workspace name: {workspace_name}" |
| 435 | + raise e |
435 | 436 |
|
436 | 437 | def create_project(self, project_name, is_public=False, namespace=None): |
437 | 438 | """ |
@@ -478,9 +479,9 @@ def create_project(self, project_name, is_public=False, namespace=None): |
478 | 479 | namespace = self.username() |
479 | 480 | try: |
480 | 481 | self.post(f"/v1/project/{namespace}", params, {"Content-Type": "application/json"}) |
481 | | - except Exception as e: |
482 | | - detail = f"Namespace: {namespace}, project name: {project_name}" |
483 | | - raise ClientError(str(e), detail) |
| 482 | + except ClientError as e: |
| 483 | + e.extra = f"Namespace: {namespace}, project name: {project_name}" |
| 484 | + raise e |
484 | 485 |
|
485 | 486 | def create_project_and_push(self, project_name, directory, is_public=False, namespace=None): |
486 | 487 | """ |
@@ -776,9 +777,9 @@ def set_project_access(self, project_path, access): |
776 | 777 | try: |
777 | 778 | request = urllib.request.Request(url, data=json.dumps(params).encode(), headers=json_headers, method="PUT") |
778 | 779 | self._do_request(request) |
779 | | - except Exception as e: |
780 | | - detail = f"Project path: {project_path}" |
781 | | - raise ClientError(str(e), detail) |
| 780 | + except ClientError as e: |
| 781 | + e.extra = f"Project path: {project_path}" |
| 782 | + raise e |
782 | 783 |
|
783 | 784 | def add_user_permissions_to_project(self, project_path, usernames, permission_level): |
784 | 785 | """ |
|
0 commit comments