@@ -228,25 +228,27 @@ def _do_request(self, request):
228228 try :
229229 return self .opener .open (request )
230230 except urllib .error .HTTPError as e :
231- server_response = json .load (e )
232231
233232 err_detail = None
233+ server_response = None
234234 server_code = None
235- # Try to get error detail
236- if isinstance (server_response , dict ):
237- server_code = server_response .get ("code" )
238- err_detail = server_response .get ("detail" )
239- if not err_detail :
240- # Extract all field-specific errors and format them
241- err_detail = "\n " .join (
242- f"{ key } : { ', ' .join (map (str , value ))} "
243- for key , value in server_response .items ()
244- if isinstance (value , list )
245- ) or str (
246- server_response
247- ) # Fallback to raw response if structure is unexpected
248- else :
249- err_detail = str (server_response )
235+
236+ if e .fp :
237+ server_response = e .fp .read ().decode ("utf-8" )
238+ if (
239+ e .headers .get ("Content-Type" , "" ) == "application/problem+json"
240+ or e .headers .get ("Content-Type" , "" ) == "application/json"
241+ ):
242+ json_response = json .loads (server_response )
243+ if isinstance (json_response , dict ):
244+ err_detail = json_response .get (
245+ "detail" , None
246+ ) # `detail` should be present in MM server response
247+ server_code = json_response .get ("code" , None )
248+ if err_detail is None :
249+ err_detail = server_response
250+ else :
251+ err_detail = server_response
250252
251253 raise ClientError (
252254 detail = err_detail ,
@@ -256,6 +258,7 @@ def _do_request(self, request):
256258 http_error = e .code ,
257259 http_method = request .get_method (),
258260 )
261+
259262 except urllib .error .URLError as e :
260263 # e.g. when DNS resolution fails (no internet connection?)
261264 raise ClientError ("Error requesting " + request .full_url + ": " + str (e ))
0 commit comments