From 6ebb2071f570678d462da87c0cd60422364d690f Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 22 Oct 2025 16:36:23 +0100 Subject: [PATCH] Allow to set MimeType's in ProtobufCodecSupport See gh-35403 --- .../codec/protobuf/ProtobufCodecSupport.java | 20 ++++++-- .../http/codec/protobuf/ProtobufEncoder.java | 46 ++++++++++++------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufCodecSupport.java b/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufCodecSupport.java index 3ed35d0f9fe..1076114bdf5 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufCodecSupport.java +++ b/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufCodecSupport.java @@ -21,17 +21,19 @@ import java.util.List; import org.jspecify.annotations.Nullable; +import org.springframework.util.Assert; import org.springframework.util.MimeType; /** * Base class providing support methods for Protobuf encoding and decoding. * * @author Sebastien Deleuze + * @author Rossen Stoyanchev * @since 5.1 */ public abstract class ProtobufCodecSupport { - static final MimeType[] MIME_TYPES = new MimeType[]{ + protected static final MimeType[] MIME_TYPES = new MimeType[] { new MimeType("application", "x-protobuf"), new MimeType("application", "*+x-protobuf"), new MimeType("application", "octet-stream"), @@ -43,6 +45,18 @@ public abstract class ProtobufCodecSupport { static final String DELIMITED_VALUE = "true"; + private List mimeTypes = Arrays.asList(MIME_TYPES); + + + protected void setMimeTypes(List mimeTypes) { + Assert.notEmpty(mimeTypes, "MimeType List must not be empty"); + this.mimeTypes = List.copyOf(mimeTypes); + } + + protected List getMimeTypes() { + return this.mimeTypes; + } + protected boolean supportsMimeType(@Nullable MimeType mimeType) { if (mimeType == null) { return true; @@ -55,8 +69,4 @@ public abstract class ProtobufCodecSupport { return false; } - protected List getMimeTypes() { - return Arrays.asList(MIME_TYPES); - } - } diff --git a/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufEncoder.java b/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufEncoder.java index 02a5d35eaf1..5f7f5443299 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufEncoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufEncoder.java @@ -17,6 +17,7 @@ package org.springframework.http.codec.protobuf; import java.io.IOException; +import java.io.OutputStream; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -57,10 +58,32 @@ import org.springframework.util.MimeType; */ public class ProtobufEncoder extends ProtobufCodecSupport implements HttpMessageEncoder { - private static final List streamingMediaTypes = Arrays.stream(MIME_TYPES) - .map(mimeType -> new MediaType(mimeType.getType(), mimeType.getSubtype(), - Collections.singletonMap(DELIMITED_KEY, DELIMITED_VALUE))) - .toList(); + private List mediaTypes = iniMediaTypes(Arrays.asList(MIME_TYPES)); + + + @Override + protected void setMimeTypes(List mimeTypes) { + super.setMimeTypes(mimeTypes); + this.mediaTypes = iniMediaTypes(mimeTypes); + } + + private static List iniMediaTypes(List mimeTypes) { + return mimeTypes.stream() + .map(mimeType -> new MediaType(mimeType.getType(), mimeType.getSubtype(), + Collections.singletonMap(DELIMITED_KEY, DELIMITED_VALUE))) + .toList(); + } + + + @Override + public List getStreamingMediaTypes() { + return this.mediaTypes; + } + + @Override + public List getEncodableMimeTypes() { + return getMimeTypes(); + } @Override @@ -84,14 +107,13 @@ public class ProtobufEncoder extends ProtobufCodecSupport implements HttpMessage } private DataBuffer encodeValue(Message message, DataBufferFactory bufferFactory, boolean delimited) { - FastByteArrayOutputStream bos = new FastByteArrayOutputStream(); try { if (delimited) { - message.writeDelimitedTo(bos); + message.writeDelimitedTo((OutputStream) bos); } else { - message.writeTo(bos); + message.writeTo((OutputStream) bos); } byte[] bytes = bos.toByteArrayUnsafe(); return bufferFactory.wrap(bytes); @@ -101,14 +123,4 @@ public class ProtobufEncoder extends ProtobufCodecSupport implements HttpMessage } } - @Override - public List getStreamingMediaTypes() { - return streamingMediaTypes; - } - - @Override - public List getEncodableMimeTypes() { - return getMimeTypes(); - } - }