Skip to content

Commit 42c77fc

Browse files
Nandanrshenoydanielkelemen
authored andcommitted
feat(connect): add http connector response error handling
related to #4241
1 parent 967a3aa commit 42c77fc

File tree

4 files changed

+132
-3
lines changed

4 files changed

+132
-3
lines changed

connect/http-client/src/main/java/org/camunda/connect/httpclient/impl/AbstractHttpConnector.java

+16-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.ByteArrayInputStream;
2020
import java.nio.charset.Charset;
2121
import java.util.Map;
22+
import java.util.Optional;
2223

2324
import org.apache.http.client.config.RequestConfig;
2425
import org.apache.http.client.config.RequestConfig.Builder;
@@ -68,16 +69,28 @@ public void setHttpClient(CloseableHttpClient httpClient) {
6869

6970
@Override
7071
public R execute(Q request) {
72+
R invocationResult;
7173
HttpRequestBase httpRequest = createHttpRequest(request);
72-
7374
HttpRequestInvocation invocation = new HttpRequestInvocation(httpRequest, request, requestInterceptors, httpClient);
74-
7575
try {
76-
return createResponse((CloseableHttpResponse) invocation.proceed());
76+
invocationResult = createResponse((CloseableHttpResponse) invocation.proceed());
7777
} catch (Exception e) {
7878
throw LOG.unableToExecuteRequest(e);
7979
}
80+
handleErrorResponse(request, invocationResult);
81+
return invocationResult;
82+
}
8083

84+
protected void handleErrorResponse(Q request, R invocationResult) {
85+
Map<String, Object> configOptions = request.getConfigOptions();
86+
if (configOptions != null && invocationResult != null) {
87+
int statusCode = invocationResult.getStatusCode();
88+
String connectorResponse = invocationResult.getResponse();
89+
Object handleHttpError = Optional.ofNullable(configOptions.get("throw-http-error")).orElse("FALSE");
90+
if (Boolean.parseBoolean(handleHttpError.toString()) && statusCode >= 400 && statusCode <= 599) {
91+
throw LOG.httpRequestError(statusCode, connectorResponse);
92+
}
93+
}
8194
}
8295

8396
protected abstract R createResponse(CloseableHttpResponse response);

connect/http-client/src/main/java/org/camunda/connect/httpclient/impl/HttpConnectorLogger.java

+5
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,9 @@ public void ignoreConfig(String field, Object value) {
5959
logInfo("009", "Ignoring request configuration option with name '{}' and value '{}'", field, value);
6060
}
6161

62+
public ConnectorRequestException httpRequestError(int statusCode , String connectorResponse) {
63+
return new ConnectorRequestException(exceptionMessage("010", "HTTP request failed with Status Code: {} ,"
64+
+ " Response: {}", statusCode, connectorResponse));
65+
}
66+
6267
}

connect/http-client/src/test/java/org/camunda/connect/httpclient/HttpRequestTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,33 @@ public void shouldIgnoreConfigWithNullOrEmptyNameOrNullValue() {
191191
assertThat(request.getConfigOptions()).isNull();
192192
}
193193

194+
@Test
195+
public void setRequestConfig() {
196+
HttpRequest request = connector.createRequest()
197+
.configOption("throw-http-error", "TRUE")
198+
.configOption("connection-timeout", "10000")
199+
.configOption("socket-timeout", "30000");
200+
201+
assertThat(request.getConfigOptions()).hasSize(3)
202+
.containsEntry("throw-http-error", "TRUE")
203+
.containsEntry("connection-timeout", "10000")
204+
.containsEntry("socket-timeout", "30000");
205+
assertThat(request.getConfigOption("throw-http-error")).isEqualTo("TRUE");
206+
assertThat(request.getConfigOption("connection-timeout")).isEqualTo("10000");
207+
assertThat(request.getConfigOption("socket-timeout")).isEqualTo("30000");
208+
assertThat(request.getHeader("unknown")).isNull();
209+
}
210+
211+
@Test
212+
public void shouldIgnoreRequestConfigWithNullOrEmptyNameOrValue() {
213+
HttpRequest request = connector.createRequest().configOption(null, "test");
214+
assertThat(request.getConfigOptions()).isNull();
215+
216+
request.configOption("throw-http-error", null);
217+
assertThat(request.getConfigOption("throw-http-error")).isNull();
218+
219+
request.configOption("throw-http-error", "");
220+
assertThat(request.getConfigOption("throw-http-error")).isEqualTo("");
221+
}
222+
194223
}

connect/http-client/src/test/java/org/camunda/connect/httpclient/HttpResponseTest.java

+82
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020

21+
import org.assertj.core.api.Assertions;
22+
import org.camunda.connect.ConnectorRequestException;
2123
import org.camunda.connect.httpclient.impl.HttpConnectorImpl;
2224
import org.camunda.connect.impl.DebugRequestInterceptor;
2325
import org.junit.Before;
@@ -89,4 +91,84 @@ protected HttpResponse getResponse() {
8991
return connector.createRequest().url("http://camunda.com").get().execute();
9092
}
9193

94+
@Test
95+
public void testSuccessfulResponseCode() {
96+
// given
97+
testResponse.statusCode(200);
98+
// when
99+
HttpResponse response = getResponse();
100+
// then
101+
assertThat(response.getStatusCode()).isEqualTo(200);
102+
}
103+
104+
@Test
105+
public void testResponseErrorCodeForMalformedRequest() {
106+
// given
107+
testResponse.statusCode(400);
108+
// when
109+
HttpResponse response = getResponse();
110+
// then
111+
assertThat(response.getStatusCode()).isEqualTo(400);
112+
}
113+
114+
@Test
115+
public void testResponseErrorCodeForServerError() {
116+
// given
117+
testResponse.statusCode(500);
118+
// when
119+
HttpResponse response = getResponse();
120+
// then
121+
assertThat(response.getStatusCode()).isEqualTo(500);
122+
}
123+
124+
@Test
125+
public void testServerErrorResponseWithConfigOptionSet() {
126+
// given
127+
testResponse.statusCode(500);
128+
try {
129+
// when
130+
connector.createRequest().configOption("throw-http-error", "TRUE").url("http://camunda.com").get().execute();
131+
Assertions.fail("ConnectorRequestException should be thrown");
132+
} catch (ConnectorRequestException e) {
133+
// then
134+
assertThat(e).hasMessageContaining("HTTP request failed with Status Code: 500");
135+
}
136+
}
137+
138+
@Test
139+
public void testMalformedRequestWithConfigOptionSet() {
140+
// given
141+
testResponse.statusCode(400);
142+
try {
143+
// when
144+
connector.createRequest().configOption("throw-http-error", "TRUE").url("http://camunda.com").get().execute();
145+
Assertions.fail("ConnectorRequestException should be thrown");
146+
} catch (ConnectorRequestException e) {
147+
// then
148+
assertThat(e).hasMessageContaining("HTTP request failed with Status Code: 400");
149+
}
150+
}
151+
152+
@Test
153+
public void testSuccessResponseWithConfigOptionSet() {
154+
// given
155+
testResponse.statusCode(200);
156+
// when
157+
connector.createRequest().configOption("throw-http-error", "TRUE").url("http://camunda.com").get().execute();
158+
// then
159+
HttpResponse response = getResponse();
160+
assertThat(response.getStatusCode()).isEqualTo(200);
161+
}
162+
163+
@Test
164+
public void testMalformedRequestWithConfigOptionSetToFalse() {
165+
// given
166+
testResponse.statusCode(400);
167+
// when
168+
connector.createRequest().configOption("throw-http-error", "FALSE").url("http://camunda.com").get().execute();
169+
// then
170+
HttpResponse response = getResponse();
171+
assertThat(response.getStatusCode()).isEqualTo(400);
172+
}
173+
92174
}

0 commit comments

Comments
 (0)