Skip to content

Commit 0eb0348

Browse files
committed
refactors error handling
1 parent 58a488d commit 0eb0348

File tree

2 files changed

+75
-88
lines changed

2 files changed

+75
-88
lines changed

services/web/server/src/simcore_service_webserver/studies_dispatcher/_constants.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@
2424
_version=1,
2525
)
2626

27-
MSG_GUESTS_NOT_ALLOWED: Final[str] = user_message(
28-
"Access is restricted to registered users.<br/><br/>"
29-
"If you don't have an account, please contact support to request one.<br/><br/>",
30-
_version=1,
31-
)
3227

3328
MSG_TOO_MANY_GUESTS: Final[str] = user_message(
3429
"We have reached the maximum number of anonymous users allowed on the platform. "

services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py

Lines changed: 75 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from ..utils import compose_support_error_msg
2525
from ..utils_aiohttp import create_redirect_to_page_response, get_api_base_url
2626
from ._catalog import ValidService, validate_requested_service
27-
from ._constants import MSG_GUESTS_NOT_ALLOWED, MSG_UNEXPECTED_DISPATCH_ERROR
27+
from ._constants import MSG_UNEXPECTED_DISPATCH_ERROR
2828
from ._core import validate_requested_file, validate_requested_viewer
2929
from ._errors import (
3030
FileToLargeError,
@@ -92,6 +92,50 @@ def _create_service_info_from(service: ValidService) -> ServiceInfo:
9292
return ServiceInfo.model_construct(_fields_set=set(values_map.keys()), **values_map)
9393

9494

95+
def _create_error_redirect_with_logging(
96+
request: web.Request,
97+
err: Exception,
98+
*,
99+
message: str,
100+
status_code: int,
101+
tip: str | None = None,
102+
) -> web.HTTPFound:
103+
"""Helper to create error redirect with consistent logging"""
104+
error_code = create_error_code(err)
105+
user_error_msg = compose_support_error_msg(msg=message, error_code=error_code)
106+
107+
_logger.exception(
108+
**create_troubleshootting_log_kwargs(
109+
user_error_msg,
110+
error=err,
111+
error_code=error_code,
112+
error_context=create_error_context_from_request(request),
113+
tip=tip,
114+
)
115+
)
116+
117+
return _create_redirect_response_to_error_page(
118+
request.app,
119+
message=user_error_msg,
120+
status_code=status_code,
121+
)
122+
123+
124+
def _create_simple_error_redirect(
125+
request: web.Request,
126+
err: Exception,
127+
*,
128+
status_code: int,
129+
) -> web.HTTPFound:
130+
"""Helper to create simple error redirect without logging"""
131+
user_error_msg = f"Sorry, we cannot dispatch your study: {err}"
132+
return _create_redirect_response_to_error_page(
133+
request.app,
134+
message=user_error_msg,
135+
status_code=status_code,
136+
)
137+
138+
95139
def _handle_errors_with_error_page(handler: Handler):
96140
@functools.wraps(handler)
97141
async def wrapper(request: web.Request) -> web.StreamResponse:
@@ -105,29 +149,21 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
105149
except GuestUserNotAllowedError as err:
106150
raise _create_redirect_response_to_error_page(
107151
request.app,
108-
message=MSG_GUESTS_NOT_ALLOWED,
152+
message=user_message(
153+
"Access is restricted to registered users.<br/><br/>"
154+
"If you don't have an account, please contact support to request one.<br/><br/>",
155+
_version=1,
156+
),
109157
status_code=status.HTTP_401_UNAUTHORIZED,
110158
) from err
111159

112160
except ProjectWorkbenchMismatchError as err:
113-
error_code = create_error_code(err)
114-
115-
user_error_msg = compose_support_error_msg(
116-
msg=MSG_UNEXPECTED_DISPATCH_ERROR, error_code=error_code
117-
)
118-
_logger.exception(
119-
**create_troubleshootting_log_kwargs(
120-
user_error_msg,
121-
error=err,
122-
error_code=error_code,
123-
error_context=create_error_context_from_request(request),
124-
tip="project might be corrupted",
125-
)
126-
)
127-
raise _create_redirect_response_to_error_page(
128-
request.app,
129-
message=user_error_msg,
161+
raise _create_error_redirect_with_logging(
162+
request,
163+
err,
164+
message=MSG_UNEXPECTED_DISPATCH_ERROR,
130165
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
166+
tip="project might be corrupted",
131167
) from err
132168

133169
except (
@@ -136,92 +172,48 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
136172
IncompatibleServiceError,
137173
GuestUsersLimitError,
138174
) as err:
139-
user_error_msg = f"Sorry, we cannot dispatch your study: {err}"
140-
raise _create_redirect_response_to_error_page(
141-
request.app,
142-
message=user_error_msg,
143-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, # 422
175+
raise _create_simple_error_redirect(
176+
request,
177+
err,
178+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
144179
) from err
145180

146181
except (InvalidRedirectionParamsError, web.HTTPUnprocessableEntity) as err:
147182
# Validation error in query parameters
148-
error_code = create_error_code(err)
149-
user_error_msg = compose_support_error_msg(
150-
msg=user_message(
183+
raise _create_error_redirect_with_logging(
184+
request,
185+
err,
186+
message=user_message(
151187
"The link you provided is invalid because it doesn't contain any or invalid information related to data or a service."
152188
"Please check the link and make sure it is correct."
153189
),
154-
error_code=error_code,
155-
)
156-
157-
_logger.exception(
158-
**create_troubleshootting_log_kwargs(
159-
user_error_msg,
160-
error=err,
161-
error_code=error_code,
162-
error_context=create_error_context_from_request(request),
163-
tip="The link might be corrupted",
164-
)
165-
)
166-
167-
raise _create_redirect_response_to_error_page(
168-
request.app,
169-
message=user_error_msg,
170190
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
191+
tip="The link might be corrupted",
171192
) from err
172193

173194
except web.HTTPClientError as err:
174-
error_code = create_error_code(err)
175-
user_error_msg = compose_support_error_msg(
176-
msg="Fatal error while redirecting request", error_code=error_code
177-
)
178-
179-
_logger.exception(
180-
**create_troubleshootting_log_kwargs(
181-
user_error_msg,
182-
error=err,
183-
error_code=error_code,
184-
error_context={
185-
**create_error_context_from_request(request),
186-
"reason": err.reason,
187-
"status": err.status,
188-
},
189-
tip="The link might be corrupted",
190-
)
191-
)
192-
193-
raise _create_redirect_response_to_error_page(
194-
request.app,
195-
message=err.reason,
195+
raise _create_error_redirect_with_logging(
196+
request,
197+
err,
198+
message="Fatal error while redirecting request",
196199
status_code=err.status_code,
200+
tip="The link might be corrupted",
197201
) from err
198202

199203
except (ValidationError, web.HTTPServerError, Exception) as err:
200-
error_code = create_error_code(err)
201-
202-
user_error_msg = compose_support_error_msg(
203-
msg=MSG_UNEXPECTED_DISPATCH_ERROR, error_code=error_code
204-
)
205-
_logger.exception(
206-
**create_troubleshootting_log_kwargs(
207-
user_error_msg,
208-
error=err,
209-
error_code=error_code,
210-
error_context=create_error_context_from_request(request),
211-
tip="Unexpected failure while dispatching study",
212-
)
213-
)
214-
raise _create_redirect_response_to_error_page(
215-
request.app,
216-
message=user_error_msg,
204+
raise _create_error_redirect_with_logging(
205+
request,
206+
err,
207+
message=MSG_UNEXPECTED_DISPATCH_ERROR,
217208
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
209+
tip="Unexpected failure while dispatching study",
218210
) from err
219211

220212
return wrapper
221213

222214

223215
#
224-
# API Schemas
216+
# API ScheMAS
225217
#
226218

227219

0 commit comments

Comments
 (0)