Skip to content

Commit d7c11c7

Browse files
committed
Support configuration of disallowed content-types
1 parent bf51a34 commit d7c11c7

File tree

3 files changed

+36
-6
lines changed
  • dubbo-common/src/main/java/org/apache/dubbo/config/nested
  • dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec
  • dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc

3 files changed

+36
-6
lines changed

dubbo-common/src/main/java/org/apache/dubbo/config/nested/RestConfig.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ public class RestConfig implements Serializable {
6767
*/
6868
private String jsonFramework;
6969

70+
/**
71+
* The disallowed content-types.
72+
*/
73+
private String[] disallowedContentTypes;
74+
7075
/**
7176
* The cors configuration.
7277
*/
@@ -133,6 +138,14 @@ public void setJsonFramework(String jsonFramework) {
133138
this.jsonFramework = jsonFramework;
134139
}
135140

141+
public String[] getDisallowedContentTypes() {
142+
return disallowedContentTypes;
143+
}
144+
145+
public void setDisallowedContentTypes(String[] disallowedContentTypes) {
146+
this.disallowedContentTypes = disallowedContentTypes;
147+
}
148+
136149
public CorsConfig getCors() {
137150
return cors;
138151
}

dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/CodecUtils.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,24 @@
1717
package org.apache.dubbo.remoting.http12.message.codec;
1818

1919
import org.apache.dubbo.common.URL;
20+
import org.apache.dubbo.common.config.Configuration;
21+
import org.apache.dubbo.common.config.ConfigurationUtils;
2022
import org.apache.dubbo.common.utils.Assert;
23+
import org.apache.dubbo.common.utils.StringUtils;
2124
import org.apache.dubbo.remoting.http12.exception.UnsupportedMediaTypeException;
2225
import org.apache.dubbo.remoting.http12.message.HttpMessageDecoder;
2326
import org.apache.dubbo.remoting.http12.message.HttpMessageDecoderFactory;
2427
import org.apache.dubbo.remoting.http12.message.HttpMessageEncoder;
2528
import org.apache.dubbo.remoting.http12.message.HttpMessageEncoderFactory;
29+
import org.apache.dubbo.rpc.Constants;
2630
import org.apache.dubbo.rpc.model.FrameworkModel;
2731

32+
import java.util.Collections;
33+
import java.util.HashSet;
2834
import java.util.List;
2935
import java.util.Map;
3036
import java.util.Optional;
37+
import java.util.Set;
3138
import java.util.concurrent.ConcurrentHashMap;
3239

3340
public final class CodecUtils {
@@ -37,13 +44,20 @@ public final class CodecUtils {
3744
private final List<HttpMessageEncoderFactory> encoderFactories;
3845
private final Map<String, Optional<HttpMessageEncoderFactory>> encoderCache = new ConcurrentHashMap<>();
3946
private final Map<String, Optional<HttpMessageDecoderFactory>> decoderCache = new ConcurrentHashMap<>();
47+
private Set<String> disallowedContentTypes = Collections.emptySet();
4048

4149
public CodecUtils(FrameworkModel frameworkModel) {
4250
this.frameworkModel = frameworkModel;
4351
decoderFactories = frameworkModel.getActivateExtensions(HttpMessageDecoderFactory.class);
4452
encoderFactories = frameworkModel.getActivateExtensions(HttpMessageEncoderFactory.class);
4553
decoderFactories.forEach(f -> decoderCache.putIfAbsent(f.mediaType().getName(), Optional.of(f)));
4654
encoderFactories.forEach(f -> encoderCache.putIfAbsent(f.mediaType().getName(), Optional.of(f)));
55+
56+
Configuration configuration = ConfigurationUtils.getGlobalConfiguration(frameworkModel.defaultApplication());
57+
String allowContentTypes = configuration.getString(Constants.H2_SETTINGS_DISALLOWED_CONTENT_TYPES, null);
58+
if (allowContentTypes != null) {
59+
disallowedContentTypes = new HashSet<>(StringUtils.tokenizeToList(allowContentTypes));
60+
}
4761
}
4862

4963
public HttpMessageDecoder determineHttpMessageDecoder(URL url, String mediaType) {
@@ -69,9 +83,10 @@ public HttpMessageEncoder determineHttpMessageEncoder(String mediaType) {
6983
public Optional<HttpMessageDecoderFactory> determineHttpMessageDecoderFactory(String mediaType) {
7084
Assert.notNull(mediaType, "mediaType must not be null");
7185
return decoderCache.computeIfAbsent(mediaType, k -> {
72-
for (HttpMessageDecoderFactory decoderFactory : decoderFactories) {
73-
if (decoderFactory.supports(k)) {
74-
return Optional.of(decoderFactory);
86+
for (HttpMessageDecoderFactory factory : decoderFactories) {
87+
if (factory.supports(k)
88+
&& !disallowedContentTypes.contains(factory.mediaType().getName())) {
89+
return Optional.of(factory);
7590
}
7691
}
7792
return Optional.empty();
@@ -81,9 +96,10 @@ public Optional<HttpMessageDecoderFactory> determineHttpMessageDecoderFactory(St
8196
public Optional<HttpMessageEncoderFactory> determineHttpMessageEncoderFactory(String mediaType) {
8297
Assert.notNull(mediaType, "mediaType must not be null");
8398
return encoderCache.computeIfAbsent(mediaType, k -> {
84-
for (HttpMessageEncoderFactory encoderFactory : encoderFactories) {
85-
if (encoderFactory.supports(k)) {
86-
return Optional.of(encoderFactory);
99+
for (HttpMessageEncoderFactory factory : encoderFactories) {
100+
if (factory.supports(k)
101+
&& !disallowedContentTypes.contains(factory.mediaType().getName())) {
102+
return Optional.of(factory);
87103
}
88104
}
89105
return Optional.empty();

dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ public interface Constants {
109109
String H2_SETTINGS_BUILTIN_SERVICE_INIT = "dubbo.tri.builtin.service.init";
110110

111111
String H2_SETTINGS_JSON_FRAMEWORK_NAME = "dubbo.protocol.triple.rest.json-framework";
112+
String H2_SETTINGS_DISALLOWED_CONTENT_TYPES = "dubbo.protocol.triple.rest.disallowed-content-types";
112113

113114
String H2_SETTINGS_VERBOSE_ENABLED = "dubbo.protocol.triple.verbose";
114115
String H2_SETTINGS_SERVLET_ENABLED = "dubbo.protocol.triple.servlet.enabled";

0 commit comments

Comments
 (0)