+22
-6
src/main/java/com/github/puregero/minecraftstresstest/CompressionDecoder.java
+22
-6
src/main/java/com/github/puregero/minecraftstresstest/CompressionDecoder.java
···
1
1
package com.github.puregero.minecraftstresstest;
2
2
3
3
import io.netty.buffer.ByteBuf;
4
-
import io.netty.buffer.Unpooled;
5
4
import io.netty.channel.ChannelHandlerContext;
6
5
import io.netty.handler.codec.ByteToMessageDecoder;
7
6
7
+
import java.nio.ByteBuffer;
8
8
import java.util.List;
9
9
import java.util.zip.Inflater;
10
10
···
23
23
return;
24
24
}
25
25
26
-
byte[] bs = new byte[friendlyByteBuf.readableBytes()];
27
-
friendlyByteBuf.readBytes(bs);
26
+
ByteBuffer bs;
27
+
if (friendlyByteBuf.nioBufferCount() > 0) {
28
+
bs = friendlyByteBuf.nioBuffer();
29
+
friendlyByteBuf.skipBytes(friendlyByteBuf.readableBytes());
30
+
} else {
31
+
bs = ByteBuffer.allocateDirect(friendlyByteBuf.readableBytes());
32
+
friendlyByteBuf.readBytes(bs);
33
+
bs.flip();
34
+
}
28
35
this.inflater.setInput(bs);
29
-
byte[] cs = new byte[length];
30
-
this.inflater.inflate(cs);
31
-
list.add(Unpooled.wrappedBuffer(cs));
36
+
37
+
ByteBuf cs = channelHandlerContext.alloc().directBuffer(length);
38
+
ByteBuffer csInternal = cs.internalNioBuffer(0, length);
39
+
int startPos = csInternal.position();
40
+
this.inflater.inflate(csInternal);
41
+
int csLength = csInternal.position() - startPos;
42
+
if (csLength != length) {
43
+
throw new IllegalStateException("Decompressed length " + csLength + " does not match expected length " + length);
44
+
}
45
+
cs.writerIndex(cs.writerIndex() + csLength);
46
+
32
47
this.inflater.reset();
48
+
list.add(cs);
33
49
}
34
50
}
35
51
}
+1
-4
src/main/java/com/github/puregero/minecraftstresstest/PacketDecoder.java
+1
-4
src/main/java/com/github/puregero/minecraftstresstest/PacketDecoder.java
···
1
1
package com.github.puregero.minecraftstresstest;
2
2
3
3
import io.netty.buffer.ByteBuf;
4
-
import io.netty.buffer.Unpooled;
5
4
import io.netty.channel.ChannelHandlerContext;
6
5
import io.netty.handler.codec.ByteToMessageDecoder;
7
6
···
23
22
return;
24
23
}
25
24
26
-
byte[] bs = new byte[length];
27
-
friendlyByteBuf.readBytes(bs);
28
-
list.add(Unpooled.wrappedBuffer(bs));
25
+
list.add(friendlyByteBuf.readBytes(length));
29
26
}
30
27
}
31
28
}