Skip to content

Commit 5ca2c2d

Browse files
authored
[Vertx] Fail promise on create reader exception (#307)
When a request contains an invalid event, the body handler doesn't handle the exception, which leads to an unhandled exception. Signed-off-by: Pierangelo Di Pilato <[email protected]>
1 parent 2524cdf commit 5ca2c2d

File tree

2 files changed

+66
-7
lines changed

2 files changed

+66
-7
lines changed

http/vertx/src/main/java/io/cloudevents/http/vertx/VertxMessageFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static Future<MessageReader> createReader(HttpServerRequest request) {
6767
request.bodyHandler(b -> {
6868
try {
6969
prom.complete(createReader(request.headers(), b));
70-
} catch (IllegalArgumentException e) {
70+
} catch (final Exception e) {
7171
prom.fail(e);
7272
}
7373
});

http/vertx/src/test/java/io/cloudevents/http/vertx/VertxMessageFactoryTest.java

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,31 @@
1717

1818
package io.cloudevents.http.vertx;
1919

20+
import static io.cloudevents.core.test.Data.DATACONTENTTYPE_JSON;
21+
import static io.cloudevents.core.test.Data.DATACONTENTTYPE_TEXT;
22+
import static io.cloudevents.core.test.Data.DATACONTENTTYPE_XML;
23+
import static io.cloudevents.core.test.Data.DATASCHEMA;
24+
import static io.cloudevents.core.test.Data.DATA_JSON_SERIALIZED;
25+
import static io.cloudevents.core.test.Data.DATA_TEXT_SERIALIZED;
26+
import static io.cloudevents.core.test.Data.DATA_XML_SERIALIZED;
27+
import static io.cloudevents.core.test.Data.ID;
28+
import static io.cloudevents.core.test.Data.SOURCE;
29+
import static io.cloudevents.core.test.Data.SUBJECT;
30+
import static io.cloudevents.core.test.Data.TIME;
31+
import static io.cloudevents.core.test.Data.TYPE;
32+
import static io.cloudevents.core.test.Data.V03_MIN;
33+
import static io.cloudevents.core.test.Data.V03_WITH_JSON_DATA;
34+
import static io.cloudevents.core.test.Data.V03_WITH_JSON_DATA_WITH_EXT_STRING;
35+
import static io.cloudevents.core.test.Data.V03_WITH_TEXT_DATA;
36+
import static io.cloudevents.core.test.Data.V03_WITH_XML_DATA;
37+
import static io.cloudevents.core.test.Data.V1_MIN;
38+
import static io.cloudevents.core.test.Data.V1_WITH_JSON_DATA;
39+
import static io.cloudevents.core.test.Data.V1_WITH_JSON_DATA_WITH_EXT_STRING;
40+
import static io.cloudevents.core.test.Data.V1_WITH_TEXT_DATA;
41+
import static io.cloudevents.core.test.Data.V1_WITH_XML_DATA;
42+
import static org.assertj.core.api.Assertions.assertThat;
43+
import static org.assertj.core.api.Assertions.assertThatCode;
44+
2045
import io.cloudevents.CloudEvent;
2146
import io.cloudevents.SpecVersion;
2247
import io.cloudevents.core.message.Encoding;
@@ -25,18 +50,22 @@
2550
import io.cloudevents.rw.CloudEventRWException;
2651
import io.cloudevents.types.Time;
2752
import io.vertx.core.MultiMap;
53+
import io.vertx.core.Vertx;
2854
import io.vertx.core.buffer.Buffer;
55+
import io.vertx.ext.web.client.WebClient;
56+
import io.vertx.junit5.Timeout;
57+
import io.vertx.junit5.VertxExtension;
58+
import io.vertx.junit5.VertxTestContext;
59+
import java.util.concurrent.CountDownLatch;
60+
import java.util.concurrent.TimeUnit;
61+
import java.util.stream.Stream;
2962
import org.junit.jupiter.api.Test;
63+
import org.junit.jupiter.api.extension.ExtendWith;
3064
import org.junit.jupiter.params.ParameterizedTest;
3165
import org.junit.jupiter.params.provider.Arguments;
3266
import org.junit.jupiter.params.provider.MethodSource;
3367

34-
import java.util.stream.Stream;
35-
36-
import static io.cloudevents.core.test.Data.*;
37-
import static org.assertj.core.api.Assertions.assertThat;
38-
import static org.assertj.core.api.Assertions.assertThatCode;
39-
68+
@ExtendWith(VertxExtension.class)
4069
public class VertxMessageFactoryTest {
4170

4271
@Test
@@ -78,6 +107,36 @@ public void readStructured(CloudEvent event) {
78107
.isEqualTo(event);
79108
}
80109

110+
@Test
111+
@Timeout(timeUnit = TimeUnit.SECONDS, value = 2)
112+
public void shouldCatchAllExceptions(final Vertx vertx, final VertxTestContext context) throws InterruptedException {
113+
114+
final int port = 4200;
115+
116+
final CountDownLatch cd = new CountDownLatch(1);
117+
118+
vertx.createHttpServer()
119+
.exceptionHandler(context::failNow)
120+
.requestHandler(r -> VertxMessageFactory.createReader(r)
121+
.onFailure(cause -> context.completeNow())
122+
.onSuccess(reader -> context.failNow("Expected failed future"))
123+
)
124+
.listen(port, context.succeeding(s -> cd.countDown()));
125+
126+
cd.await(2, TimeUnit.SECONDS);
127+
128+
WebClient.create(vertx)
129+
.post(port, "127.0.0.1", "")
130+
.putHeader("Content-Type", "application/cloudevents+json; charset=UTF-8")
131+
.putHeader("ce-specversion", "9000.1")
132+
.putHeader("ce-type", "type")
133+
.putHeader("ce-source", "/mysource")
134+
.send()
135+
.onFailure(context::failNow)
136+
.onSuccess(r -> {
137+
});
138+
}
139+
81140
public static Stream<Arguments> binaryTestArguments() {
82141
return Stream.of(
83142
// V03

0 commit comments

Comments
 (0)