From 4dbfed9875f0fc0b8bca10a16ab28c0954ccb297 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Tue, 6 Dec 2022 12:49:07 +0100 Subject: [PATCH 1/2] Added method hasEntity to readable entity, so we can check if there is any data available. --- .../nima/http/media/ReadableEntity.java | 7 ++ .../nima/http/media/ReadableEntityBase.java | 67 ++++++++++--------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntity.java b/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntity.java index cf0002db4e8..e498bc58f44 100644 --- a/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntity.java +++ b/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntity.java @@ -61,6 +61,13 @@ default T as(Class type) { */ T as(GenericType type); + /** + * Whether an entity actually exists. + * + * @return {@code true} if an entity exists and can be read + */ + boolean hasEntity(); + /** * Whether this entity has been consumed already. * diff --git a/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntityBase.java b/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntityBase.java index 1ad9d0ab75d..c826a7025d6 100644 --- a/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntityBase.java +++ b/nima/http/media/media/src/main/java/io/helidon/nima/http/media/ReadableEntityBase.java @@ -30,33 +30,7 @@ * Base for readable entities. */ public abstract class ReadableEntityBase implements ReadableEntity { - private static final ReadableEntity EMPTY = new ReadableEntity() { - @Override - public InputStream inputStream() { - return new ByteArrayInputStream(BufferData.EMPTY_BYTES); - } - - @Override - public T as(Class type) { - throw new IllegalStateException("No entity"); - } - - @Override - public T as(GenericType type) { - throw new IllegalStateException("No entity"); - } - - @Override - public boolean consumed() { - return true; - } - - @Override - public ReadableEntity copy(Runnable entityProcessedRunnable) { - entityProcessedRunnable.run(); - return this; - } - }; + private static final ReadableEntity EMPTY = new EmptyReadableEntity(); private final AtomicBoolean consumed = new AtomicBoolean(); private final Function decoder; @@ -150,11 +124,7 @@ public void consume() { } } - /** - * Is there an entity. - * - * @return whether the entity has bytes - */ + @Override public boolean hasEntity() { return true; } @@ -274,4 +244,37 @@ private void ensureBuffer(int estimate) { } } } + + private static final class EmptyReadableEntity implements ReadableEntity { + @Override + public InputStream inputStream() { + return new ByteArrayInputStream(BufferData.EMPTY_BYTES); + } + + @Override + public T as(Class type) { + throw new IllegalStateException("No entity"); + } + + @Override + public T as(GenericType type) { + throw new IllegalStateException("No entity"); + } + + @Override + public boolean consumed() { + return true; + } + + @Override + public ReadableEntity copy(Runnable entityProcessedRunnable) { + entityProcessedRunnable.run(); + return this; + } + + @Override + public boolean hasEntity() { + return false; + } + } } From 3151b5369e92f09a358cf43fa3f3bafc05bf1c4b Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Tue, 6 Dec 2022 12:56:55 +0100 Subject: [PATCH 2/2] Fix multipart entities --- .../nima/http/media/multipart/ReadablePartAbstract.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nima/http/media/multipart/src/main/java/io/helidon/nima/http/media/multipart/ReadablePartAbstract.java b/nima/http/media/multipart/src/main/java/io/helidon/nima/http/media/multipart/ReadablePartAbstract.java index f46d7a5d401..d4c1abad96c 100644 --- a/nima/http/media/multipart/src/main/java/io/helidon/nima/http/media/multipart/ReadablePartAbstract.java +++ b/nima/http/media/multipart/src/main/java/io/helidon/nima/http/media/multipart/ReadablePartAbstract.java @@ -70,6 +70,11 @@ public ReadableEntity copy(Runnable entityProcessedRunnable) { throw new UnsupportedOperationException("Cannot copy a multi-part content."); } + @Override + public boolean hasEntity() { + return true; + } + protected abstract void finish(); private void contentDisposition() {