diff --git a/dependencies-bom/pom.xml b/dependencies-bom/pom.xml index 850d6756dd5..7abc1d91ab8 100644 --- a/dependencies-bom/pom.xml +++ b/dependencies-bom/pom.xml @@ -102,7 +102,7 @@ 1.3.6 3.1.15 0.8.0 - 4.0.38 + 4.0.51 3.1.0 6.1.26 1.1.0.Final @@ -127,7 +127,7 @@ 2.2.7 1.2.0 - 3.2.8 + 3.2.11 1.0.2 1.17 diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java index 8be61c5020b..47ecfee2ca1 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java @@ -29,6 +29,8 @@ import com.alibaba.dubbo.config.model.ApplicationModel; import com.alibaba.dubbo.config.model.ConsumerModel; import com.alibaba.dubbo.config.support.Parameter; +import com.alibaba.dubbo.registry.support.ConsumerInvokerWrapper; +import com.alibaba.dubbo.registry.support.ProviderConsumerRegTable; import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.Protocol; import com.alibaba.dubbo.rpc.ProxyFactory; @@ -47,11 +49,13 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import static com.alibaba.dubbo.common.utils.NetUtils.isInvalidLocalHost; @@ -423,7 +427,14 @@ private T createProxy(Map map) { if (c && !invoker.isAvailable()) { // make it possible for consumer to retry later if provider is temporarily unavailable initialized = false; - throw new IllegalStateException("Failed to check the status of the service " + interfaceName + ". No provider available for the service " + (group == null ? "" : group + "/") + interfaceName + (version == null ? "" : ":" + version) + " from the url " + invoker.getUrl() + " to the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion()); + final String serviceKey = (group == null ? "" : group + "/") + interfaceName + (version == null ? "" : + ":" + version); + Set consumerInvoker = ProviderConsumerRegTable.getConsumerInvoker(serviceKey); + if (consumerInvoker != Collections.emptySet()) { + //since create proxy error , so we must be the first consumer. Simply clear ConcurrentHashSet + consumerInvoker.clear(); + } + throw new IllegalStateException("Failed to check the status of the service " + interfaceName + ". No provider available for the service " + serviceKey + " from the url " + invoker.getUrl() + " to the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion()); } if (logger.isInfoEnabled()) { logger.info("Refer dubbo service " + interfaceClass.getName() + " from url " + invoker.getUrl()); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/support/MockInvoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/support/MockInvoker.java index fc99bdcd1e3..2dce7a049a3 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/support/MockInvoker.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/support/MockInvoker.java @@ -147,14 +147,15 @@ public static Throwable getThrowable(String throwstr) { } @SuppressWarnings("unchecked") - private Invoker getInvoker(String mockService) { + private Invoker getInvoker(String mock) { + Class serviceType = (Class) ReflectUtils.forName(url.getServiceInterface()); + String mockService = ConfigUtils.isDefault(mock) ? serviceType.getName() + "Mock" : mock; Invoker invoker = (Invoker) mocks.get(mockService); if (invoker != null) { return invoker; } - Class serviceType = (Class) ReflectUtils.forName(url.getServiceInterface()); - T mockObject = (T) getMockObject(mockService, serviceType); + T mockObject = (T) getMockObject(mock, serviceType); invoker = proxyFactory.getInvoker(mockObject, serviceType, url); if (mocks.size() < 10000) { mocks.put(mockService, invoker); diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceA.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceA.java new file mode 100644 index 00000000000..c7804ac5ef1 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceA.java @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.support; + +public interface DemoServiceA { + String methodA(); +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceAMock.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceAMock.java new file mode 100644 index 00000000000..5b98121067c --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceAMock.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.support; + +/** + * default mock service for DemoServiceA + */ +public class DemoServiceAMock implements DemoServiceA{ + public static final String MOCK_VALUE = "mockA"; + @Override + public String methodA() { + return MOCK_VALUE; + } +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceB.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceB.java new file mode 100644 index 00000000000..2df05955989 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceB.java @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.support; + +public interface DemoServiceB { + String methodB(); +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceBMock.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceBMock.java new file mode 100644 index 00000000000..c08177fd256 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/DemoServiceBMock.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.support; + +/** + * default mock service for DemoServiceA + */ +public class DemoServiceBMock implements DemoServiceB { + public static final String MOCK_VALUE = "mockB"; + + @Override + public String methodB() { + return MOCK_VALUE; + } +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/MockInvokerTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/MockInvokerTest.java new file mode 100644 index 00000000000..ca77bce846d --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/com/alibaba/dubbo/rpc/support/MockInvokerTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.support; + +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.rpc.RpcInvocation; +import org.junit.Assert; +import org.junit.Test; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; + +import static com.alibaba.dubbo.common.Constants.MOCK_KEY; + + +public class MockInvokerTest { + + @Test + public void testParseMockValue() throws Exception { + Assert.assertNull(MockInvoker.parseMockValue("null")); + Assert.assertNull(MockInvoker.parseMockValue("empty")); + + Assert.assertTrue((Boolean) MockInvoker.parseMockValue("true")); + Assert.assertFalse((Boolean) MockInvoker.parseMockValue("false")); + + Assert.assertEquals(123, MockInvoker.parseMockValue("123")); + Assert.assertEquals("foo", MockInvoker.parseMockValue("foo")); + Assert.assertEquals("foo", MockInvoker.parseMockValue("\"foo\"")); + Assert.assertEquals("foo", MockInvoker.parseMockValue("\'foo\'")); + + Assert.assertEquals( + new HashMap(), MockInvoker.parseMockValue("{}")); + Assert.assertEquals( + new ArrayList(), MockInvoker.parseMockValue("[]")); + Assert.assertEquals("foo", + MockInvoker.parseMockValue("foo", new Type[]{String.class})); + } + + @Test + public void testInvoke() { + URL url = URL.valueOf("remote://1.2.3.4/" + String.class.getName()); + url = url.addParameter(MOCK_KEY, "return "); + MockInvoker mockInvoker = new MockInvoker(url); + + RpcInvocation invocation = new RpcInvocation(); + invocation.setMethodName("getSomething"); + Assert.assertEquals(new HashMap(), + mockInvoker.invoke(invocation).getAttachments()); + } + + @Test + public void testGetDefaultObject() { + // test methodA in DemoServiceAMock + final Class demoServiceAClass = DemoServiceA.class; + URL url = URL.valueOf("remote://1.2.3.4/" + demoServiceAClass.getName()); + url = url.addParameter(MOCK_KEY, "force:true"); + MockInvoker mockInvoker = new MockInvoker(url); + + RpcInvocation invocation = new RpcInvocation(); + invocation.setMethodName("methodA"); + Assert.assertEquals(new HashMap(), + mockInvoker.invoke(invocation).getAttachments()); + + // test methodB in DemoServiceBMock + final Class demoServiceBClass = DemoServiceB.class; + url = URL.valueOf("remote://1.2.3.4/" + demoServiceBClass.getName()); + url = url.addParameter(MOCK_KEY, "force:true"); + mockInvoker = new MockInvoker(url); + invocation = new RpcInvocation(); + invocation.setMethodName("methodB"); + Assert.assertEquals(new HashMap(), + mockInvoker.invoke(invocation).getAttachments()); + } + + @Test + public void testNormalizeMock() { + Assert.assertNull(MockInvoker.normalizeMock(null)); + + Assert.assertEquals("", MockInvoker.normalizeMock("")); + Assert.assertEquals("", MockInvoker.normalizeMock("fail:")); + Assert.assertEquals("", MockInvoker.normalizeMock("force:")); + Assert.assertEquals("throw", MockInvoker.normalizeMock("throw")); + Assert.assertEquals("default", MockInvoker.normalizeMock("fail")); + Assert.assertEquals("default", MockInvoker.normalizeMock("force")); + Assert.assertEquals("default", MockInvoker.normalizeMock("true")); + Assert.assertEquals("default", + MockInvoker.normalizeMock("default")); + Assert.assertEquals("return null", + MockInvoker.normalizeMock("return")); + Assert.assertEquals("return null", + MockInvoker.normalizeMock("return null")); + } +} diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocol.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocol.java index b0e4a8202d0..d9004fac51f 100644 --- a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocol.java +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocol.java @@ -24,7 +24,7 @@ import com.alibaba.dubbo.rpc.RpcContext; import com.alibaba.dubbo.rpc.RpcException; import com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol; - +import com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryUtil; import com.alibaba.dubbo.rpc.service.GenericService; import com.alibaba.dubbo.rpc.support.ProtocolUtils; import com.caucho.hessian.HessianException; @@ -122,6 +122,7 @@ protected T doRefer(Class serviceType, URL url) throws RpcException { int timeout = url.getParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT); hessianProxyFactory.setConnectTimeout(timeout); hessianProxyFactory.setReadTimeout(timeout); + hessianProxyFactory.setSerializerFactory(Hessian2FactoryUtil.getInstance().getSerializerFactory()); return (T) hessianProxyFactory.create(serviceType, url.setProtocol("http").toJavaURL(), Thread.currentThread().getContextClassLoader()); } @@ -181,7 +182,7 @@ public void handle(HttpServletRequest request, HttpServletResponse response) } try { - skeleton.invoke(request.getInputStream(), response.getOutputStream()); + skeleton.invoke(request.getInputStream(), response.getOutputStream(), Hessian2FactoryUtil.getInstance().getSerializerFactory()); } catch (Throwable e) { throw new ServletException(e); } diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/AbstractHessian2FactoryInitializer.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/AbstractHessian2FactoryInitializer.java new file mode 100644 index 00000000000..96c4497dedd --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/AbstractHessian2FactoryInitializer.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.protocol.hessian.serialization; + +import com.caucho.hessian.io.SerializerFactory; + +public abstract class AbstractHessian2FactoryInitializer implements Hessian2FactoryInitializer { + private static SerializerFactory SERIALIZER_FACTORY; + + @Override + public SerializerFactory getSerializerFactory() { + if (SERIALIZER_FACTORY != null) { + return SERIALIZER_FACTORY; + } + synchronized (this) { + SERIALIZER_FACTORY = createSerializerFactory(); + } + return SERIALIZER_FACTORY; + } + + protected abstract SerializerFactory createSerializerFactory(); +} \ No newline at end of file diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/DefaultHessian2FactoryInitializer.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/DefaultHessian2FactoryInitializer.java new file mode 100644 index 00000000000..fdcf726934b --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/DefaultHessian2FactoryInitializer.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.protocol.hessian.serialization; + +import com.caucho.hessian.io.SerializerFactory; + +public class DefaultHessian2FactoryInitializer extends AbstractHessian2FactoryInitializer { + @Override + protected SerializerFactory createSerializerFactory() { + return new SerializerFactory(); + } +} diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/Hessian2FactoryInitializer.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/Hessian2FactoryInitializer.java new file mode 100644 index 00000000000..96f2f8b0a14 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/Hessian2FactoryInitializer.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.protocol.hessian.serialization; + +import com.alibaba.dubbo.common.extension.SPI; +import com.caucho.hessian.io.SerializerFactory; + +@SPI("default") +public interface Hessian2FactoryInitializer { + SerializerFactory getSerializerFactory(); +} \ No newline at end of file diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/Hessian2FactoryUtil.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/Hessian2FactoryUtil.java new file mode 100644 index 00000000000..c5673aa9323 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/Hessian2FactoryUtil.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.protocol.hessian.serialization; + +import com.alibaba.dubbo.common.extension.ExtensionLoader; +import com.alibaba.dubbo.common.utils.ConfigUtils; +import com.alibaba.dubbo.common.utils.StringUtils; + +public class Hessian2FactoryUtil { + static String WHITELIST = "dubbo.application.hessian2.whitelist"; + static String ALLOW = "dubbo.application.hessian2.allow"; + static String DENY = "dubbo.application.hessian2.deny"; + static ExtensionLoader loader = ExtensionLoader.getExtensionLoader(Hessian2FactoryInitializer.class); + + public static Hessian2FactoryInitializer getInstance() { + String whitelist = ConfigUtils.getProperty(WHITELIST); + if (StringUtils.isNotEmpty(whitelist)) { + return loader.getExtension("whitelist"); + } + return loader.getDefaultExtension(); + } +} diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/WhitelistHessian2FactoryInitializer.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/WhitelistHessian2FactoryInitializer.java new file mode 100644 index 00000000000..eec2928d51d --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/serialization/WhitelistHessian2FactoryInitializer.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.rpc.protocol.hessian.serialization; + +import com.alibaba.dubbo.common.utils.ConfigUtils; +import com.alibaba.dubbo.common.utils.StringUtils; +import com.caucho.hessian.io.SerializerFactory; + +import static com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryUtil.ALLOW; +import static com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryUtil.DENY; +import static com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryUtil.WHITELIST; + +/** + * see https://github.com/ebourg/hessian/commit/cf851f5131707891e723f7f6a9718c2461aed826 + */ +public class WhitelistHessian2FactoryInitializer extends AbstractHessian2FactoryInitializer { + + @Override + public SerializerFactory createSerializerFactory() { + SerializerFactory serializerFactory = new SerializerFactory(); + String whiteList = ConfigUtils.getProperty(WHITELIST); + if ("true".equals(whiteList)) { + serializerFactory.getClassFactory().setWhitelist(true); + String allowPattern = ConfigUtils.getProperty(ALLOW); + if (StringUtils.isNotEmpty(allowPattern)) { + serializerFactory.getClassFactory().allow(allowPattern); + } + } else { + serializerFactory.getClassFactory().setWhitelist(false); + String denyPattern = ConfigUtils.getProperty(DENY); + if (StringUtils.isNotEmpty(denyPattern)) { + serializerFactory.getClassFactory().deny(denyPattern); + } + } + return serializerFactory; + } + +} diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryInitializer b/dubbo-rpc/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryInitializer new file mode 100644 index 00000000000..4796b5c550c --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.protocol.hessian.serialization.Hessian2FactoryInitializer @@ -0,0 +1,2 @@ +default=com.alibaba.dubbo.rpc.protocol.hessian.serialization.DefaultHessian2FactoryInitializer +whitelist=com.alibaba.dubbo.rpc.protocol.hessian.serialization.WhitelistHessian2FactoryInitializer \ No newline at end of file