Merge branch 'apache-3.1' into apache-3.2

# Conflicts:
#	dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/CodecSupport.java
#	dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java
This commit is contained in:
Albumen Kevin 2023-04-06 19:33:34 +08:00
commit e3053618dd
2 changed files with 36 additions and 6 deletions

View File

@ -193,4 +193,14 @@ public class CodecSupport {
}
return false;
}
public static void checkSerialization(String expectSerializeName, String actualSerializeName)throws IOException {
if (expectSerializeName.equals(actualSerializeName)
&& SERIALIZATIONNAME_ID_MAP.containsKey(expectSerializeName)) {
return;
}
throw new IOException("Unexpected serialization type:" + actualSerializeName + " received from network, please check if the peer send the right id.");
}
}

View File

@ -23,6 +23,7 @@ import org.apache.dubbo.common.serialize.MultipleSerialization;
import org.apache.dubbo.common.stream.StreamObserver;
import org.apache.dubbo.config.Constants;
import org.apache.dubbo.remoting.utils.UrlUtils;
import org.apache.dubbo.remoting.transport.CodecSupport;
import org.apache.dubbo.rpc.model.MethodDescriptor;
import org.apache.dubbo.rpc.model.PackableMethod;
@ -98,11 +99,14 @@ public class ReflectionPackableMethod implements PackableMethod {
.getExtension(url.getParameter(Constants.MULTI_SERIALIZATION_KEY,
CommonConstants.DEFAULT_KEY));
// client
this.requestPack = new WrapRequestPack(serialization, url, serializeName, actualRequestTypes,
singleArgument);
this.responsePack = new WrapResponsePack(serialization, url, actualResponseType);
this.requestUnpack = new WrapRequestUnpack(serialization, url, actualRequestTypes);
this.responseUnpack = new WrapResponseUnpack(serialization, url, actualResponseType);
this.responseUnpack = new WrapResponseUnpack(serialization, url, serializeName, actualResponseType);
// server
this.responsePack = new WrapResponsePack(serialization, url, serializeName, actualResponseType);
this.requestUnpack = new WrapRequestUnpack(serialization, url, serializeName, actualRequestTypes);
}
}
@ -316,13 +320,15 @@ public class ReflectionPackableMethod implements PackableMethod {
private final URL url;
private final Class<?> actualResponseType;
// wrapper request set serialize type
String serialize;
private WrapResponsePack(MultipleSerialization multipleSerialization, URL url,
private WrapResponsePack(MultipleSerialization multipleSerialization, URL url, String defaultSerialize,
Class<?> actualResponseType) {
this.multipleSerialization = multipleSerialization;
this.url = url;
this.actualResponseType = actualResponseType;
this.serialize = defaultSerialize;
}
@Override
@ -344,10 +350,14 @@ public class ReflectionPackableMethod implements PackableMethod {
private final URL url;
private final Class<?> returnClass;
private WrapResponseUnpack(MultipleSerialization serialization, URL url, Class<?> returnClass) {
private final String requestSerializeName;
private WrapResponseUnpack(MultipleSerialization serialization, URL url, String requestSerializeName, Class<?> returnClass) {
this.serialization = serialization;
this.url = url;
this.returnClass = returnClass;
this.requestSerializeName = requestSerializeName;
}
@Override
@ -355,6 +365,9 @@ public class ReflectionPackableMethod implements PackableMethod {
TripleCustomerProtocolWapper.TripleResponseWrapper wrapper = TripleCustomerProtocolWapper.TripleResponseWrapper
.parseFrom(data);
final String serializeType = convertHessianFromWrapper(wrapper.getSerializeType());
CodecSupport.checkSerialization(requestSerializeName, serializeType);
ByteArrayInputStream bais = new ByteArrayInputStream(wrapper.getData());
return serialization.deserialize(url, serializeType, returnClass, bais);
}
@ -446,16 +459,23 @@ public class ReflectionPackableMethod implements PackableMethod {
private final Class<?>[] actualRequestTypes;
private WrapRequestUnpack(MultipleSerialization serialization, URL url, Class<?>[] actualRequestTypes) {
private final String serializeName;
private WrapRequestUnpack(MultipleSerialization serialization, URL url, String serializeName, Class<?>[] actualRequestTypes) {
this.serialization = serialization;
this.url = url;
this.actualRequestTypes = actualRequestTypes;
this.serializeName = serializeName;
}
@Override
public Object unpack(byte[] data) throws IOException, ClassNotFoundException {
TripleCustomerProtocolWapper.TripleRequestWrapper wrapper = TripleCustomerProtocolWapper.TripleRequestWrapper.parseFrom(
data);
String wrapperSerializeType = convertHessianFromWrapper(wrapper.getSerializeType());
CodecSupport.checkSerialization(serializeName, wrapperSerializeType);
Object[] ret = new Object[wrapper.getArgs().size()];
((WrapResponsePack) responsePack).serialize = wrapper.getSerializeType();
for (int i = 0; i < wrapper.getArgs().size(); i++) {