diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientRequest.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientRequest.java index fc740b2d8..398ed19dd 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientRequest.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientRequest.java @@ -585,7 +585,7 @@ private Stream stream(BodyReader bodyReader) { final HttpResponse> res = handler(HttpResponse.BodyHandlers.ofLines()); this.httpResponse = res; checkResponse(res); - return res.body().map(bodyReader::readBody); + return res.body().filter(line -> !line.isEmpty()).map(bodyReader::readBody); } @Override diff --git a/http-client/src/test/java/io/avaje/http/client/HelloControllerTest.java b/http-client/src/test/java/io/avaje/http/client/HelloControllerTest.java index b6ae766d9..111aceb85 100644 --- a/http-client/src/test/java/io/avaje/http/client/HelloControllerTest.java +++ b/http-client/src/test/java/io/avaje/http/client/HelloControllerTest.java @@ -271,6 +271,18 @@ void get_stream_as() { assertThat(first.name).isEqualTo("one"); } + @Test + void get_stream_as_when_empty() { + final HttpResponse> res = clientContext.request() + .path("hello").path("streamEmpty") + .GET() + .asStream(SimpleData.class); + + assertThat(res.statusCode()).isEqualTo(200); + final List data = res.body().collect(Collectors.toList()); + assertThat(data).isEmpty(); + } + @Test void get_stream_NotFoundException() { clientContext.metrics(true); diff --git a/http-client/src/test/java/org/example/webserver/HelloController$Route.java b/http-client/src/test/java/org/example/webserver/HelloController$Route.java index bca12e34b..caa61d42c 100644 --- a/http-client/src/test/java/org/example/webserver/HelloController$Route.java +++ b/http-client/src/test/java/org/example/webserver/HelloController$Route.java @@ -52,6 +52,11 @@ private void routes(JavalinDefaultRouting cfg) { controller.stream(ctx); }); + cfg.get("/hello/streamEmpty", ctx -> { + ctx.status(200); + controller.streamEmpty(ctx); + }); + cfg.get("/hello/{id}/{date}", ctx -> { ctx.status(200); final int id = asInt(ctx.pathParam("id")); diff --git a/http-client/src/test/java/org/example/webserver/HelloController.java b/http-client/src/test/java/org/example/webserver/HelloController.java index f72598ae2..09f599676 100644 --- a/http-client/src/test/java/org/example/webserver/HelloController.java +++ b/http-client/src/test/java/org/example/webserver/HelloController.java @@ -63,6 +63,13 @@ void stream(Context context) { context.result(content); } + @Get("streamEmpty") + void streamEmpty(Context context) { + // simulate x-json-stream response with empty stream + context.header("content-type", "application/x-json-stream"); + context.result("\n"); + } + /** * Return the Hello DTO. *