1
0
mirror of https://github.com/apache/dubbo.git synced 2024-10-23 07:04:37 +08:00

Fix issue 11708 (#11714)

This commit is contained in:
Mengyang Tang 2023-03-06 15:26:15 +08:00 committed by GitHub
parent f8f89f2a71
commit a21d04255a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 7 deletions

View File

@ -32,7 +32,7 @@ import static java.lang.Math.min;
public class TelnetDetector implements ProtocolDetector {
private FrameworkModel frameworkModel;
private final FrameworkModel frameworkModel;
private final int MaxSize = 2048;
private final ChannelBuffer AytPreface = new HeapChannelBuffer(new byte[]{(byte) 0xff, (byte) 0xf6});
@ -46,7 +46,7 @@ public class TelnetDetector implements ProtocolDetector {
return Result.UNRECOGNIZED;
}
Result resCommand = commandDetect(in);
if (resCommand.equals(Result.RECOGNIZED)){
if (resCommand.equals(Result.RECOGNIZED)) {
return resCommand;
}
Result resAyt = telnetAytDetect(in);
@ -62,14 +62,19 @@ public class TelnetDetector implements ProtocolDetector {
private Result commandDetect(ChannelBuffer in) {
// detect if remote channel send a qos command to server
ChannelBuffer back = in.copy();
byte[] backBytes = new byte[back.readableBytes()];
back.getBytes(back.readerIndex(), backBytes);
byte[] backBytes;
try {
backBytes = new byte[back.readableBytes()];
back.getBytes(back.readerIndex(), backBytes);
} finally {
back.release();
}
String s = new String(backBytes, CharsetUtil.UTF_8);
// trim /r/n to let parser work for input
s = s.trim();
CommandContext commandContext = TelnetCommandDecoder.decode(s);
if(frameworkModel.getExtensionLoader(BaseCommand.class).hasExtension(commandContext.getCommandName())){
if (frameworkModel.getExtensionLoader(BaseCommand.class).hasExtension(commandContext.getCommandName())) {
return Result.RECOGNIZED;
}
return Result.UNRECOGNIZED;
@ -79,10 +84,10 @@ public class TelnetDetector implements ProtocolDetector {
// detect if remote channel send a telnet ayt command to server
int prefaceLen = AytPreface.readableBytes();
int bytesRead = min(in.readableBytes(), prefaceLen);
if(bytesRead == 0 || !ChannelBuffers.prefixEquals(in, AytPreface, bytesRead)) {
if (bytesRead == 0 || !ChannelBuffers.prefixEquals(in, AytPreface, bytesRead)) {
return Result.UNRECOGNIZED;
}
if(bytesRead == prefaceLen) {
if (bytesRead == prefaceLen) {
// we need to consume preface because it's not a qos command
// consume and remember to mark, pu server handler reset reader index
in.readBytes(AytPreface.readableBytes());

View File

@ -948,4 +948,12 @@ public interface ChannelBuffer extends Comparable<ChannelBuffer> {
* array
*/
int arrayOffset();
/**
* If this buffer is backed by an NIO direct buffer,
* in some scenarios it may be necessary to manually release.
*/
default void release() {
}
}

View File

@ -200,4 +200,9 @@ public class DynamicChannelBuffer extends AbstractChannelBuffer {
public int arrayOffset() {
return buffer.arrayOffset();
}
@Override
public void release() {
buffer.release();
}
}

View File

@ -22,6 +22,7 @@ import org.apache.dubbo.remoting.buffer.ChannelBufferFactory;
import org.apache.dubbo.remoting.buffer.ChannelBuffers;
import io.netty.buffer.ByteBuf;
import io.netty.util.ReferenceCountUtil;
import java.io.IOException;
import java.io.InputStream;
@ -447,4 +448,9 @@ public class NettyBackedChannelBuffer implements ChannelBuffer {
public int compareTo(ChannelBuffer o) {
return ChannelBuffers.compare(this, o);
}
@Override
public void release() {
ReferenceCountUtil.safeRelease(buffer);
}
}