@@ -81,8 +81,40 @@ public Response execute(Request request, Request.Options options) throws IOExcep
8181 } catch (URISyntaxException e ) {
8282 throw new IOException ("URL '" + request .url () + "' couldn't be parsed into a URI" , e );
8383 }
84- HttpResponse httpResponse = client .execute (httpUriRequest );
85- return toFeignResponse (httpResponse , request );
84+ try {
85+ HttpResponse httpResponse = client .execute (httpUriRequest );
86+ return toFeignResponse (httpResponse , request );
87+ } catch (IOException e ) {
88+ Throwable cause = e .getCause ();
89+ if (cause != null
90+ && !(cause instanceof IOException )
91+ && !(cause instanceof RuntimeException )
92+ && !(cause instanceof Error )) {
93+ return createSyntheticErrorResponse (request , cause );
94+ }
95+ throw e ;
96+ }
97+ }
98+
99+ private Response createSyntheticErrorResponse (Request request , Throwable cause ) {
100+ // Determine status code based on exception type
101+ int status = 500 ; // Default to Internal Server Error
102+ String reason = cause .getClass ().getSimpleName ();
103+
104+ // For ProtocolException during redirects (e.g., missing Location header), use 3xx
105+ if (cause .getClass ().getSimpleName ().equals ("ProtocolException" )
106+ && cause .getMessage () != null
107+ && cause .getMessage ().contains ("redirect" )) {
108+ status = 300 ; // Multiple Choices (generic redirect error)
109+ }
110+
111+ return Response .builder ()
112+ .status (status )
113+ .reason (reason )
114+ .request (request )
115+ .headers (new java .util .HashMap <>())
116+ .body (cause .getMessage () != null ? cause .getMessage ().getBytes () : new byte [0 ])
117+ .build ();
86118 }
87119
88120 HttpUriRequest toHttpUriRequest (Request request , Request .Options options )
0 commit comments