Skip to content

Commit acf6b29

Browse files
geoandgsmet
authored andcommitted
Prevent SSE writing from potentially causing accumulation of headers
This could happen if a MessageBodyWriter writes the headers map (which does not make sense for streaming responses, but it's nevertheless allowed by the contract of the MessageBodyWriter) Fixes: quarkusio#31559 (cherry picked from commit 4cb3797)
1 parent 6c41122 commit acf6b29

File tree

6 files changed

+10
-8
lines changed

6 files changed

+10
-8
lines changed

independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientSetResponseEntityRestHandler.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import javax.ws.rs.client.Entity;
77
import javax.ws.rs.core.MediaType;
8-
import javax.ws.rs.core.MultivaluedMap;
98
import javax.ws.rs.core.Response;
109
import javax.ws.rs.core.Response.StatusType;
1110

@@ -16,6 +15,7 @@
1615
import org.jboss.resteasy.reactive.client.spi.ClientRestHandler;
1716
import org.jboss.resteasy.reactive.common.core.Serialisers;
1817
import org.jboss.resteasy.reactive.common.jaxrs.StatusTypeImpl;
18+
import org.jboss.resteasy.reactive.common.util.QuarkusMultivaluedHashMap;
1919

2020
import io.vertx.core.buffer.Buffer;
2121

@@ -81,7 +81,7 @@ private ByteArrayInputStream entityStreamOfAbortedResponseOf(RestClientRequestCo
8181
entity = Entity.entity(untypedEntity, mediaType);
8282
}
8383
// FIXME: pass headers?
84-
Buffer buffer = context.writeEntity(entity, (MultivaluedMap) Serialisers.EMPTY_MULTI_MAP,
84+
Buffer buffer = context.writeEntity(entity, new QuarkusMultivaluedHashMap<>(),
8585
Serialisers.NO_WRITER_INTERCEPTOR);
8686
return new ByteArrayInputStream(buffer.getBytes());
8787
}

independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/InboundSseEventImpl.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import org.jboss.resteasy.reactive.common.core.Serialisers;
1616
import org.jboss.resteasy.reactive.common.jaxrs.ConfigurationImpl;
17+
import org.jboss.resteasy.reactive.common.util.QuarkusMultivaluedHashMap;
1718

1819
public class InboundSseEventImpl implements InboundSseEvent {
1920

@@ -120,7 +121,7 @@ public <T> T readData(GenericType<T> type, MediaType mediaType) {
120121
InputStream in = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
121122
try {
122123
return (T) ClientSerialisers.invokeClientReader(null, type.getRawType(), type.getType(),
123-
mediaType, null, null, Serialisers.EMPTY_MULTI_MAP,
124+
mediaType, null, null, new QuarkusMultivaluedHashMap<>(),
124125
serialisers, in, Serialisers.NO_READER_INTERCEPTOR, configuration);
125126
} catch (IOException e) {
126127
throw new UncheckedIOException(e);

independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/core/Serialisers.java

-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import javax.ws.rs.RuntimeType;
1616
import javax.ws.rs.core.MediaType;
17-
import javax.ws.rs.core.MultivaluedMap;
1817
import javax.ws.rs.core.Response;
1918
import javax.ws.rs.ext.MessageBodyReader;
2019
import javax.ws.rs.ext.MessageBodyWriter;
@@ -31,7 +30,6 @@
3130
public abstract class Serialisers {
3231
public static final Annotation[] NO_ANNOTATION = new Annotation[0];
3332
public static final ReaderInterceptor[] NO_READER_INTERCEPTOR = new ReaderInterceptor[0];
34-
public static final MultivaluedMap<String, Object> EMPTY_MULTI_MAP = new QuarkusMultivaluedHashMap<>();
3533
public static final WriterInterceptor[] NO_WRITER_INTERCEPTOR = new WriterInterceptor[0];
3634
protected static final Map<Class<?>, Class<?>> primitivesToWrappers = new HashMap<>();
3735
// FIXME: spec says we should use generic type, but not sure how to pass that type from Jandex to reflection

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/SseUtil.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.jboss.resteasy.reactive.common.core.Serialisers;
2020
import org.jboss.resteasy.reactive.common.util.CommonSseUtil;
21+
import org.jboss.resteasy.reactive.common.util.QuarkusMultivaluedHashMap;
2122
import org.jboss.resteasy.reactive.server.handlers.PublisherResponseHandler;
2223
import org.jboss.resteasy.reactive.server.jaxrs.OutboundSseEventImpl;
2324
import org.jboss.resteasy.reactive.server.spi.ServerHttpResponse;
@@ -135,7 +136,7 @@ private static String serialiseDataToString(ResteasyReactiveRequestContext conte
135136
if (writer.isWriteable(entityClass, entityType, Serialisers.NO_ANNOTATION, mediaType)) {
136137
// FIXME: spec doesn't really say what headers we should use here
137138
writer.writeTo(entity, entityClass, entityType, Serialisers.NO_ANNOTATION, mediaType,
138-
Serialisers.EMPTY_MULTI_MAP, baos);
139+
new QuarkusMultivaluedHashMap<>(), baos);
139140
wrote = true;
140141
break;
141142
}

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/StreamingUtil.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import javax.ws.rs.ext.MessageBodyWriter;
1515

1616
import org.jboss.resteasy.reactive.common.core.Serialisers;
17+
import org.jboss.resteasy.reactive.common.util.QuarkusMultivaluedHashMap;
1718
import org.jboss.resteasy.reactive.server.StreamingOutputStream;
1819
import org.jboss.resteasy.reactive.server.handlers.PublisherResponseHandler;
1920
import org.jboss.resteasy.reactive.server.spi.ServerHttpResponse;
@@ -65,7 +66,7 @@ private static byte[] serialiseEntity(ResteasyReactiveRequestContext context, Ob
6566
if (writer.isWriteable(entityClass, entityType, Serialisers.NO_ANNOTATION, mediaType)) {
6667
// FIXME: spec doesn't really say what headers we should use here
6768
writer.writeTo(entity, entityClass, entityType, Serialisers.NO_ANNOTATION, mediaType,
68-
Serialisers.EMPTY_MULTI_MAP, baos);
69+
new QuarkusMultivaluedHashMap<>(), baos);
6970
wrote = true;
7071
break;
7172
}

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/multipart/MultipartMessageBodyWriter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.jboss.resteasy.reactive.common.core.Serialisers;
2424
import org.jboss.resteasy.reactive.common.reflection.ReflectionBeanFactoryCreator;
25+
import org.jboss.resteasy.reactive.common.util.QuarkusMultivaluedHashMap;
2526
import org.jboss.resteasy.reactive.multipart.FileDownload;
2627
import org.jboss.resteasy.reactive.server.NoopCloseAndFlushOutputStream;
2728
import org.jboss.resteasy.reactive.server.core.CurrentRequestManager;
@@ -187,7 +188,7 @@ private void writeEntity(OutputStream os, Object entity, MediaType mediaType, Re
187188
try (NoopCloseAndFlushOutputStream writerOutput = new NoopCloseAndFlushOutputStream(os)) {
188189
// FIXME: spec doesn't really say what headers we should use here
189190
writer.writeTo(entity, entityClass, entityType, Serialisers.NO_ANNOTATION, mediaType,
190-
Serialisers.EMPTY_MULTI_MAP, writerOutput);
191+
new QuarkusMultivaluedHashMap<>(), writerOutput);
191192
wrote = true;
192193
}
193194

0 commit comments

Comments
 (0)