@@ -228,25 +228,27 @@ def _do_request(self, request):
228
228
try :
229
229
return self .opener .open (request )
230
230
except urllib .error .HTTPError as e :
231
- server_response = json .load (e )
232
231
233
232
err_detail = None
233
+ server_response = None
234
234
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
250
252
251
253
raise ClientError (
252
254
detail = err_detail ,
@@ -256,6 +258,7 @@ def _do_request(self, request):
256
258
http_error = e .code ,
257
259
http_method = request .get_method (),
258
260
)
261
+
259
262
except urllib .error .URLError as e :
260
263
# e.g. when DNS resolution fails (no internet connection?)
261
264
raise ClientError ("Error requesting " + request .full_url + ": " + str (e ))
0 commit comments