Skip to content

Commit 4d639c2

Browse files
committed
feat(connect): add http connector response error handling
related to camunda/camunda-bpm-platform#4241 Backported commit 42c77fc8d9 from the camunda-bpm-platform repository. Original author: Shenoy, Nandan <nandan.shenoy@fmr.com>
1 parent 2293509 commit 4d639c2

File tree

4 files changed

+132
-3
lines changed

4 files changed

+132
-3
lines changed

connect/http-client/src/main/java/org/operaton/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/operaton/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/operaton/connect/httpclient/HttpRequestTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,33 @@ 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/operaton/connect/httpclient/HttpResponseTest.java

+82
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import static org.assertj.core.api.Assertions.assertThat;
2020
import org.junit.jupiter.api.BeforeEach;
2121
import org.junit.jupiter.api.Test;
22+
import org.assertj.core.api.Assertions;
23+
import org.operaton.connect.ConnectorRequestException;
2224
import org.operaton.connect.httpclient.impl.HttpConnectorImpl;
2325
import org.operaton.connect.impl.DebugRequestInterceptor;
2426

@@ -88,4 +90,84 @@ protected HttpResponse getResponse() {
8890
return connector.createRequest().url("http://operaton.com").get().execute();
8991
}
9092

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

0 commit comments

Comments
 (0)