From fc2b146be8cf58a1e072c6b55157da620f191ce0 Mon Sep 17 00:00:00 2001 From: Markus KARG Date: Thu, 26 Sep 2019 14:42:06 +0200 Subject: [PATCH] Throwing NoContentException when InputStream is empty Since JAX-RS 2.1 an MBR must react upon an empty stream either with an empty instance or with NoContentException, but Jersey's JSON-B MBR does neither - it simply throws ProcessingException: "In case the entity input stream is empty, the reader is expected to either return a Java representation of a zero-length entity or throw a javax.ws.rs.core.NoContentException in case no zero-length entity representation is defined for the supported Java type." Signed-off-by: Markus KARG --- .../jsonb/internal/JsonBindingProvider.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java b/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java index 3d4ad43aa9..127589a6a3 100644 --- a/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java +++ b/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.PushbackInputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; @@ -29,6 +30,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.NoContentException; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import javax.ws.rs.ext.Providers; @@ -70,7 +72,24 @@ public Object readFrom(Class type, Type genericType, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { + if (entityStream.markSupported()) { + entityStream.mark(1); + if (entityStream.read() == -1) { + throw new NoContentException("JSON-B cannot process empty input stream"); + } + entityStream.reset(); + } else { + final PushbackInputStream buffer = new PushbackInputStream(entityStream); + final int firstByte = buffer.read(); + if (firstByte == -1) { + throw new NoContentException("JSON-B cannot process empty input stream"); + } + buffer.unread(firstByte); + entityStream = buffer; + } + Jsonb jsonb = getJsonb(type); + try { return jsonb.fromJson(entityStream, genericType); } catch (JsonbException e) {