use of com.hazelcast.client.impl.protocol.ClientMessage.Frame in project hazelcast by hazelcast.
the class ClientMessageProtectionTest method testNegativeFrameLength.
@Test
public void testNegativeFrameLength() throws IOException {
Config config = smallInstanceConfig();
HazelcastInstance hz = factory.newHazelcastInstance(config);
ClientMessage clientMessage = createAuthenticationMessage(hz, "");
InetSocketAddress address = getNode(hz).getLocalMember().getSocketAddress(EndpointQualifier.CLIENT);
try (Socket socket = new Socket(address.getAddress(), address.getPort())) {
socket.setSoTimeout(5000);
try (OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream()) {
os.write(CLIENT_BINARY.getBytes(StandardCharsets.UTF_8));
ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024);
buffer.order(ByteOrder.LITTLE_ENDIAN);
// it should be enough to write just the first frame
Frame frame = clientMessage.getStartFrame();
buffer.putInt(Integer.MIN_VALUE);
buffer.putShort((short) (frame.flags));
buffer.put(frame.content);
os.write(byteBufferToBytes(buffer));
os.flush();
expected.expect(connectionClosedException());
readResponse(is);
}
}
}
use of com.hazelcast.client.impl.protocol.ClientMessage.Frame in project hazelcast by hazelcast.
the class ClientMessageProtectionTest method testAccumulatedMessageSizeOverflow.
@Test
public void testAccumulatedMessageSizeOverflow() throws IOException {
Config config = smallInstanceConfig();
HazelcastInstance hz = factory.newHazelcastInstance(config);
ClientMessage clientMessage = createAuthenticationMessage(hz, "");
InetSocketAddress address = getNode(hz).getLocalMember().getSocketAddress(EndpointQualifier.CLIENT);
try (Socket socket = new Socket(address.getAddress(), address.getPort())) {
try (OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream()) {
os.write(CLIENT_BINARY.getBytes(StandardCharsets.UTF_8));
// it should be enough to write just the first frame
byte[] firstFrameBytes = frameAsBytes(clientMessage.getStartFrame(), false);
os.write(firstFrameBytes);
ByteBuffer buffer = ByteBuffer.allocateDirect(SIZE_OF_FRAME_LENGTH_AND_FLAGS);
buffer.order(ByteOrder.LITTLE_ENDIAN);
// try to cause the size accumulator overflow
buffer.putInt(Integer.MAX_VALUE - firstFrameBytes.length + 1);
ClientMessage.ForwardFrameIterator iterator = clientMessage.frameIterator();
// skip start frame
iterator.next();
Frame frame = iterator.next();
buffer.putShort((short) frame.flags);
os.write(byteBufferToBytes(buffer));
os.flush();
expected.expect(connectionClosedException());
readResponse(is);
}
}
}
use of com.hazelcast.client.impl.protocol.ClientMessage.Frame in project hazelcast by hazelcast.
the class ClientMessageEncoderDecoderTest method test.
@Test
public void test() {
ClientMessage message = ClientMessage.createForEncode();
message.add(new Frame(new byte[100], UNFRAGMENTED_MESSAGE | IS_FINAL_FLAG));
message.setMessageType(MapPutCodec.REQUEST_MESSAGE_TYPE);
AtomicReference<ClientMessage> reference = new AtomicReference<>(message);
ClientMessageEncoder encoder = new ClientMessageEncoder();
encoder.src(() -> reference.getAndSet(null));
ByteBuffer buffer = ByteBuffer.allocate(1000);
upcast(buffer).flip();
encoder.dst(buffer);
HandlerStatus result = encoder.onWrite();
assertEquals(CLEAN, result);
AtomicReference<ClientMessage> resultingMessage = new AtomicReference<>();
ClientMessageDecoder decoder = new ClientMessageDecoder(null, resultingMessage::set, null);
decoder.setNormalPacketsRead(SwCounter.newSwCounter());
upcast(buffer).position(buffer.limit());
decoder.src(buffer);
decoder.onRead();
assertEquals(message.getMessageType(), resultingMessage.get().getMessageType());
assertEquals(message.getFrameLength(), resultingMessage.get().getFrameLength());
assertEquals(message.getHeaderFlags(), resultingMessage.get().getHeaderFlags());
assertEquals(message.getPartitionId(), resultingMessage.get().getPartitionId());
}
use of com.hazelcast.client.impl.protocol.ClientMessage.Frame in project hazelcast by hazelcast.
the class ClientMessageEncoderDecoderTest method createMessage.
private ClientMessage createMessage(int frameLength, int frameCount) {
ClientMessage message = ClientMessage.createForEncode();
Random random = new Random();
for (int i = 0; i < frameCount; i++) {
byte[] content = new byte[frameLength];
random.nextBytes(content);
message.add(new Frame(content));
}
return message;
}
use of com.hazelcast.client.impl.protocol.ClientMessage.Frame in project hazelcast by hazelcast.
the class ClientMessageProtectionTest method writeClientMessage.
private void writeClientMessage(OutputStream os, final ClientMessage clientMessage) throws IOException {
for (ClientMessage.ForwardFrameIterator it = clientMessage.frameIterator(); it.hasNext(); ) {
ClientMessage.Frame frame = it.next();
os.write(frameAsBytes(frame, !it.hasNext()));
}
os.flush();
}
Aggregations