Skip to content

Commit ebc59dd

Browse files
authored
Call: handle Abort (#2675)
* feat(dispatcher): add production mode support for error handling and extend URI validation tests - Introduced `productionRouter` in `DummyTestRouter` to enable production mode configuration. - Updated `DispatchingInterceptor` to adjust error messages in production mode. - Expanded `DispatchingInterceptorTest` with production-specific URI validation. * `refactor(core): simplify type declaration and enhance error handling in CallInterceptor`
1 parent c96bb7d commit ebc59dd

2 files changed

Lines changed: 33 additions & 24 deletions

File tree

core/src/main/java/com/predic8/membrane/core/interceptor/flow/CallInterceptor.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,29 @@
1313
limitations under the License. */
1414
package com.predic8.membrane.core.interceptor.flow;
1515

16-
import com.predic8.membrane.annot.MCAttribute;
17-
import com.predic8.membrane.annot.MCElement;
18-
import com.predic8.membrane.annot.Required;
19-
import com.predic8.membrane.core.exchange.Exchange;
20-
import com.predic8.membrane.core.http.Header;
21-
import com.predic8.membrane.core.http.HeaderField;
22-
import com.predic8.membrane.core.http.Request;
23-
import com.predic8.membrane.core.interceptor.Outcome;
24-
import com.predic8.membrane.core.interceptor.lang.AbstractExchangeExpressionInterceptor;
25-
import com.predic8.membrane.core.transport.http.HttpClient;
26-
import org.slf4j.Logger;
27-
import org.slf4j.LoggerFactory;
28-
29-
import java.io.IOException;
30-
import java.util.Arrays;
31-
import java.util.List;
16+
import com.predic8.membrane.annot.*;
17+
import com.predic8.membrane.core.exceptions.*;
18+
import com.predic8.membrane.core.exchange.*;
19+
import com.predic8.membrane.core.http.*;
20+
import com.predic8.membrane.core.interceptor.*;
21+
import com.predic8.membrane.core.interceptor.lang.*;
22+
import com.predic8.membrane.core.transport.http.*;
23+
import org.slf4j.*;
24+
25+
import java.io.*;
26+
import java.net.*;
27+
import java.util.*;
3228

3329
import static com.google.api.client.http.HttpMethods.*;
34-
import static com.predic8.membrane.core.exceptions.ProblemDetails.internal;
30+
import static com.predic8.membrane.core.exceptions.ProblemDetails.*;
3531
import static com.predic8.membrane.core.http.Header.*;
36-
import static com.predic8.membrane.core.interceptor.Interceptor.Flow.REQUEST;
32+
import static com.predic8.membrane.core.interceptor.Interceptor.Flow.*;
33+
import static com.predic8.membrane.core.interceptor.Outcome.*;
3734
import static com.predic8.membrane.core.interceptor.Outcome.ABORT;
38-
import static com.predic8.membrane.core.interceptor.Outcome.CONTINUE;
39-
import static java.util.Collections.singletonList;
35+
import static java.util.Collections.*;
4036

4137
/**
4238
* @description Calls an external endpoint
43-
*
4439
* @topic 1. Proxies and Flow
4540
*/
4641
@MCElement(name = "call")
@@ -81,8 +76,15 @@ private Outcome handleInternal(Exchange exc) {
8176

8277
try (HttpClient client = new HttpClient()) {
8378
client.call(newExc);
79+
} catch (UnknownHostException e) {
80+
log.error("Error calling: {} Unknown host: {}", dest, e.getMessage());
81+
createProblemDetails(dest)
82+
.detail("Unknown host " + e.getMessage())
83+
.buildAndSetResponse(exc);
84+
return ABORT;
8485
} catch (Exception e) {
8586
log.error("Error during HTTP call to {}: {}", dest, e.getMessage(), e);
87+
createProblemDetails(dest).buildAndSetResponse(exc);
8688
return ABORT;
8789
}
8890

@@ -105,6 +107,13 @@ private Outcome handleInternal(Exchange exc) {
105107
}
106108
}
107109

110+
private ProblemDetails createProblemDetails(String dest) {
111+
return internal(router.getConfiguration().isProduction(), "call")
112+
.title("Error performing callout.")
113+
.internal("expression", exchangeExpression.getExpression())
114+
.internal("destination", dest);
115+
}
116+
108117
private Request getNewRequest(Exchange exchange) {
109118
Request.Builder builder = new Request.Builder()
110119
.method(method)
@@ -145,7 +154,7 @@ Header getFilteredRequestHeader(Exchange exc) {
145154
requestHeader.add(field.getHeaderName().getName(), field.getValue());
146155
}
147156
// Removes body-related headers when no body is present
148-
if(!methodShouldHaveBody(method)) {
157+
if (!methodShouldHaveBody(method)) {
149158
requestHeader.removeFields(CONTENT_TYPE);
150159
requestHeader.removeFields(CONTENT_LENGTH);
151160
requestHeader.removeFields(TRANSFER_ENCODING);
@@ -161,7 +170,7 @@ static void copyHeadersFromResponseToRequest(Exchange responseExc, Exchange orig
161170
if (headerField.getHeaderName().getName().equalsIgnoreCase(rmHeader))
162171
return;
163172
}
164-
originalExc.getRequest().getHeader().setValue(headerField.getHeaderName().getName(),headerField.getValue());
173+
originalExc.getRequest().getHeader().setValue(headerField.getHeaderName().getName(), headerField.getValue());
165174
});
166175
}
167176

core/src/main/java/com/predic8/membrane/core/lang/spel/SpELExchangeEvaluationContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public SpELExchangeEvaluationContext(Exchange exchange, Flow flow) {
9595
}
9696

9797
private void addTypeConverters() {
98-
GenericConversionService cs = new DefaultConversionService();
98+
var cs = new DefaultConversionService();
9999
cs.addConverter(new SpELMapToStringTypeConverter());
100100
cs.addConverter(new SpELBodyToStringTypeConverter());
101101
cs.addConverter(new ListToStringTypeConverter());

0 commit comments

Comments
 (0)