Merge remote-tracking branch 'origin/dubbo-2.4.x-dev' into dubbo-2.4.x-dev
diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java
index 59a506b..83f0dd8 100644
--- a/dubbo-remoting/dubbo-remoting-api/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java
+++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java
@@ -113,6 +113,7 @@
// get data length.
int len = Bytes.bytes2int(header, 12);
+ checkPayload(channel, len);
int tt = len + HEADER_LENGTH;
if( readable < tt ) {
@@ -124,7 +125,6 @@
is = StreamUtils.limitedInputStream(is, len);
try {
- checkPayload(channel, len);
return decodeBody(channel, is, header);
} finally {
if (is.available() > 0) {
diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/com/alibaba/dubbo/remoting/codec/ExchangeCodecTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/com/alibaba/dubbo/remoting/codec/ExchangeCodecTest.java
index 8c773ff..cb55de0 100644
--- a/dubbo-remoting/dubbo-remoting-api/src/test/java/com/alibaba/dubbo/remoting/codec/ExchangeCodecTest.java
+++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/com/alibaba/dubbo/remoting/codec/ExchangeCodecTest.java
@@ -151,7 +151,18 @@
byte[] header = new byte[] { MAGIC_HIGH , MAGIC_LOW , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 };
testDecode_assertEquals(header, TelnetCodec.NEED_MORE_INPUT);
}
-
+
+ @Test
+ public void test_Decode_Check_Payload() throws IOException {
+ byte[] header = new byte[]{MAGIC_HIGH, MAGIC_LOW, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+ byte[] request = assemblyDataProtocol(header);
+ try {
+ testDecode_assertEquals(request, TelnetCodec.NEED_MORE_INPUT);
+ Assert.fail();
+ } catch (IOException expected) {
+ Assert.assertTrue(expected.getMessage().startsWith("Data length too large: " + Bytes.bytes2int(new byte[]{1, 1, 1, 1})));
+ }
+ }
@Test
public void test_Decode_Body_Need_Readmore() throws IOException{
byte[] header = new byte[] { MAGIC_HIGH , MAGIC_LOW , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0, 0, 0, 0 , 1 ,1, 'a', 'a' };
@@ -320,7 +331,7 @@
Response response = new Response();
response.setHeartbeat(true);
response.setId(1001l);
- response.setStatus((byte)20 );
+ response.setStatus((byte) 20);
response.setVersion("11");
Person person = new Person();
response.setResult(person);
@@ -408,36 +419,6 @@
}
@Test
- public void testMessageLengthExceedPayloadLimit() throws Exception {
- Request request = new Request(1L);
- request.setData("hello");
- UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream(512);
- Channel channel = getCliendSideChannel(url);
- codec.encode(channel, bos, request);
- byte [] requestMessage = bos.toByteArray();
- byte[] message = new byte[requestMessage.length * 2];
- System.arraycopy(requestMessage, 0, message, 0, requestMessage.length);
- System.arraycopy(requestMessage, 0, message, requestMessage.length, requestMessage.length);
-
- channel = getServerSideChannel(
- url.addParameter(Constants.PAYLOAD_KEY, requestMessage.length - 16 /* head length */ - 2));
- UnsafeByteArrayInputStream bis = new UnsafeByteArrayInputStream(message);
- try {
- codec.decode(channel, bis);
- Assert.fail();
- } catch (IOException e) {
- Assert.assertTrue(e.getMessage().startsWith("Data length too large: " + (requestMessage.length - 16 /* head length */)));
- }
-
- channel = getServerSideChannel(url.addParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD));
- Object object = codec.decode(channel, bis);
- Assert.assertTrue(object instanceof Request);
- Request decodeRequest = (Request)object;
- Assert.assertEquals(request.getId(), decodeRequest.getId());
- Assert.assertEquals(request.getData(), decodeRequest.getData());
- }
-
- @Test
public void testMessageLengthExceedPayloadLimitWhenEncode() throws Exception {
Request request = new Request(1L);
request.setData("hello");
@@ -458,5 +439,6 @@
Assert.assertTrue(channel.getReceivedMessage() instanceof Response);
Response receiveMessage = (Response)channel.getReceivedMessage();
Assert.assertEquals(Response.BAD_RESPONSE, receiveMessage.getStatus());
+ Assert.assertTrue(receiveMessage.getErrorMessage().contains("Data length too large: "));
}
}
\ No newline at end of file