From 4dd0f573d6b194a085d8089fc86cdc27d976ef8d Mon Sep 17 00:00:00 2001
From: Mark <mark@openappstack.net>
Date: Tue, 12 Nov 2019 16:42:23 +0100
Subject: [PATCH] Refactor Exception handling

---
 consent_provider/app.py |  7 +++----
 consent_provider/db.py  | 21 +++++++++++++++++++--
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/consent_provider/app.py b/consent_provider/app.py
index 40d9de2..0e17b7b 100644
--- a/consent_provider/app.py
+++ b/consent_provider/app.py
@@ -2,8 +2,7 @@ from flask import abort, Flask, redirect, request
 from flask.views import View
 from os import urandom, environ
 from hydra_client import HydraAdmin
-from db import User
-import urllib
+from db import User, BackendConnectionError
 
 HYDRA_ADMIN_URL = environ['HYDRA_ADMIN_URL']
 
@@ -20,10 +19,10 @@ def home():
     username = consent_request.subject
     try:
         user = User(username)
-    except urllib.error.HTTPError as e:
+    except BackendConnectionError as error:
         # TODO: replace with propper logging via logger
         print("Retrieving user object from GraphQL server failed")
-        print(e)
+        print(error)
         return redirect(consent_request.reject(
             "Permission denied",
             error_description="Login request was denied due to an internal server error"))
diff --git a/consent_provider/db.py b/consent_provider/db.py
index 6e9f020..b0302f7 100644
--- a/consent_provider/db.py
+++ b/consent_provider/db.py
@@ -13,8 +13,11 @@ class User():
         self.username = username
         try:
             self._load_remote_user_info()
-        except urllib.error.HTTPError as e:
-            raise e
+        except urllib.error.HTTPError as error:
+            raise BackendConnectionError(
+                error.code,
+                error.headers,
+                ("Error during retrieval of userdata - " + error.reason))
 
     def _load_remote_user_info(self):
         querystring = '''{{
@@ -57,3 +60,17 @@ class User():
                 "email" : self.email,
                 "picture": ""}
         }
+
+
+class BackendConnectionError(Exception):
+    """Raised when requests to the backend server fail
+
+    Attributes:
+        code -- http response code
+        headers -- http response headers
+        reason -- reson for the error
+    """
+    def __init__(self, code, headers, reason):
+        self.code = code
+        self.headers = headers
+        self.reaseon = reason
-- 
GitLab