List of usage examples for io.netty.buffer ByteBuf readUnsignedShort
public abstract int readUnsignedShort();
From source file:com.mobius.software.mqtt.parser.MQParser.java
License:Open Source License
public static MQMessage decode(ByteBuf buf) throws MalformedMessageException { MQMessage header = null;//from w w w. j ava 2 s . com byte fixedHeader = buf.readByte(); LengthDetails length = LengthDetails.decode(buf); MessageType type = MessageType.valueOf((fixedHeader >> 4) & 0xf); try { switch (type) { case CONNECT: byte[] nameValue = new byte[buf.readUnsignedShort()]; buf.readBytes(nameValue, 0, nameValue.length); String name = new String(nameValue, "UTF-8"); if (!name.equals("MQTT")) throw new MalformedMessageException("CONNECT, protocol-name set to " + name); int protocolLevel = buf.readUnsignedByte(); byte contentFlags = buf.readByte(); boolean userNameFlag = ((contentFlags >> 7) & 1) == 1 ? true : false; boolean userPassFlag = ((contentFlags >> 6) & 1) == 1 ? true : false; boolean willRetain = ((contentFlags >> 5) & 1) == 1 ? true : false; QoS willQos = QoS.valueOf(((contentFlags & 0x1f) >> 3) & 3); if (willQos == null) throw new MalformedMessageException("CONNECT, will QoS set to " + willQos); boolean willFlag = (((contentFlags >> 2) & 1) == 1) ? true : false; if (willQos.getValue() > 0 && !willFlag) throw new MalformedMessageException( "CONNECT, will QoS set to " + willQos + ", willFlag not set"); if (willRetain && !willFlag) throw new MalformedMessageException("CONNECT, will retain set, willFlag not set"); boolean cleanSession = ((contentFlags >> 1) & 1) == 1 ? true : false; boolean reservedFlag = (contentFlags & 1) == 1 ? true : false; if (reservedFlag) throw new MalformedMessageException("CONNECT, reserved flag set to true"); int keepalive = buf.readUnsignedShort(); byte[] clientIdValue = new byte[buf.readUnsignedShort()]; buf.readBytes(clientIdValue, 0, clientIdValue.length); String clientID = new String(clientIdValue, "UTF-8"); if (!StringVerifier.verify(clientID)) throw new MalformedMessageException( "ClientID contains restricted characters: U+0000, U+D000-U+DFFF"); Text willTopic = null; byte[] willMessage = null; String username = null; String password = null; Will will = null; if (willFlag) { if (buf.readableBytes() < 2) throw new MalformedMessageException("Invalid encoding will/username/password"); byte[] willTopicValue = new byte[buf.readUnsignedShort()]; if (buf.readableBytes() < willTopicValue.length) throw new MalformedMessageException("Invalid encoding will/username/password"); buf.readBytes(willTopicValue, 0, willTopicValue.length); String willTopicName = new String(willTopicValue, "UTF-8"); if (!StringVerifier.verify(willTopicName)) throw new MalformedMessageException( "WillTopic contains one or more restricted characters: U+0000, U+D000-U+DFFF"); willTopic = new Text(willTopicName); if (buf.readableBytes() < 2) throw new MalformedMessageException("Invalid encoding will/username/password"); willMessage = new byte[buf.readUnsignedShort()]; if (buf.readableBytes() < willMessage.length) throw new MalformedMessageException("Invalid encoding will/username/password"); buf.readBytes(willMessage, 0, willMessage.length); if (willTopic.length() == 0) throw new MalformedMessageException("invalid will encoding"); will = new Will(new Topic(willTopic, willQos), willMessage, willRetain); if (!will.isValid()) throw new MalformedMessageException("invalid will encoding"); } if (userNameFlag) { if (buf.readableBytes() < 2) throw new MalformedMessageException("Invalid encoding will/username/password"); byte[] userNameValue = new byte[buf.readUnsignedShort()]; if (buf.readableBytes() < userNameValue.length) throw new MalformedMessageException("Invalid encoding will/username/password"); buf.readBytes(userNameValue, 0, userNameValue.length); username = new String(userNameValue, "UTF-8"); if (!StringVerifier.verify(username)) throw new MalformedMessageException( "Username contains one or more restricted characters: U+0000, U+D000-U+DFFF"); } if (userPassFlag) { if (buf.readableBytes() < 2) throw new MalformedMessageException("Invalid encoding will/username/password"); byte[] userPassValue = new byte[buf.readUnsignedShort()]; if (buf.readableBytes() < userPassValue.length) throw new MalformedMessageException("Invalid encoding will/username/password"); buf.readBytes(userPassValue, 0, userPassValue.length); password = new String(userPassValue, "UTF-8"); if (!StringVerifier.verify(password)) throw new MalformedMessageException( "Password contains one or more restricted characters: U+0000, U+D000-U+DFFF"); } if (buf.readableBytes() > 0) throw new MalformedMessageException("Invalid encoding will/username/password"); Connect connect = new Connect(username, password, clientID, cleanSession, keepalive, will); if (protocolLevel != 4) connect.setProtocolLevel(protocolLevel); header = connect; break; case CONNACK: byte sessionPresentValue = buf.readByte(); if (sessionPresentValue != 0 && sessionPresentValue != 1) throw new MalformedMessageException( String.format("CONNACK, session-present set to %d", sessionPresentValue & 0xff)); boolean isPresent = sessionPresentValue == 1 ? true : false; short connackByte = buf.readUnsignedByte(); ConnackCode connackCode = ConnackCode.valueOf(connackByte); if (connackCode == null) throw new MalformedMessageException("Invalid connack code: " + connackByte); header = new Connack(isPresent, connackCode); break; case PUBLISH: fixedHeader &= 0xf; boolean dup = ((fixedHeader >> 3) & 1) == 1 ? true : false; QoS qos = QoS.valueOf((fixedHeader & 0x07) >> 1); if (qos == null) throw new MalformedMessageException("invalid QoS value"); if (dup && qos == QoS.AT_MOST_ONCE) throw new MalformedMessageException("PUBLISH, QoS-0 dup flag present"); boolean retain = ((fixedHeader & 1) == 1) ? true : false; byte[] topicNameValue = new byte[buf.readUnsignedShort()]; buf.readBytes(topicNameValue, 0, topicNameValue.length); String topicName = new String(topicNameValue, "UTF-8"); if (!StringVerifier.verify(topicName)) throw new MalformedMessageException( "Publish-topic contains one or more restricted characters: U+0000, U+D000-U+DFFF"); Integer packetID = null; if (qos != QoS.AT_MOST_ONCE) { packetID = buf.readUnsignedShort(); if (packetID < 0 || packetID > 65535) throw new MalformedMessageException("Invalid PUBLISH packetID encoding"); } ByteBuf data = Unpooled.buffer(buf.readableBytes()); data.writeBytes(buf); header = new Publish(packetID, new Topic(new Text(topicName), qos), data, retain, dup); break; case PUBACK: header = new Puback(buf.readUnsignedShort()); break; case PUBREC: header = new Pubrec(buf.readUnsignedShort()); break; case PUBREL: header = new Pubrel(buf.readUnsignedShort()); break; case PUBCOMP: header = new Pubcomp(buf.readUnsignedShort()); break; case SUBSCRIBE: Integer subID = buf.readUnsignedShort(); List<Topic> subscriptions = new ArrayList<>(); while (buf.isReadable()) { byte[] value = new byte[buf.readUnsignedShort()]; buf.readBytes(value, 0, value.length); QoS requestedQos = QoS.valueOf(buf.readByte()); if (requestedQos == null) throw new MalformedMessageException( "Subscribe qos must be in range from 0 to 2: " + requestedQos); String topic = new String(value, "UTF-8"); if (!StringVerifier.verify(topic)) throw new MalformedMessageException( "Subscribe topic contains one or more restricted characters: U+0000, U+D000-U+DFFF"); Topic subscription = new Topic(new Text(topic), requestedQos); subscriptions.add(subscription); } if (subscriptions.isEmpty()) throw new MalformedMessageException("Subscribe with 0 topics"); header = new Subscribe(subID, subscriptions.toArray(new Topic[subscriptions.size()])); break; case SUBACK: Integer subackID = buf.readUnsignedShort(); List<SubackCode> subackCodes = new ArrayList<>(); while (buf.isReadable()) { short subackByte = buf.readUnsignedByte(); SubackCode subackCode = SubackCode.valueOf(subackByte); if (subackCode == null) throw new MalformedMessageException("Invalid suback code: " + subackByte); subackCodes.add(subackCode); } if (subackCodes.isEmpty()) throw new MalformedMessageException("Suback with 0 return-codes"); header = new Suback(subackID, subackCodes); break; case UNSUBSCRIBE: Integer unsubID = buf.readUnsignedShort(); List<Text> unsubscribeTopics = new ArrayList<>(); while (buf.isReadable()) { byte[] value = new byte[buf.readUnsignedShort()]; buf.readBytes(value, 0, value.length); String topic = new String(value, "UTF-8"); if (!StringVerifier.verify(topic)) throw new MalformedMessageException( "Unsubscribe topic contains one or more restricted characters: U+0000, U+D000-U+DFFF"); unsubscribeTopics.add(new Text(topic)); } if (unsubscribeTopics.isEmpty()) throw new MalformedMessageException("Unsubscribe with 0 topics"); header = new Unsubscribe(unsubID, unsubscribeTopics.toArray(new Text[unsubscribeTopics.size()])); break; case UNSUBACK: header = new Unsuback(buf.readUnsignedShort()); break; case PINGREQ: header = PINGREQ; break; case PINGRESP: header = PINGRESP; break; case DISCONNECT: header = DISCONNECT; break; default: throw new MalformedMessageException("Invalid header type: " + type); } if (buf.isReadable()) throw new MalformedMessageException("unexpected bytes in content"); if (length.getLength() != header.getLength()) throw new MalformedMessageException(String.format("Invalid length. Encoded: %d, actual: %d", length.getLength(), header.getLength())); return header; } catch (UnsupportedEncodingException e) { throw new MalformedMessageException("unsupported string encoding:" + e.getMessage()); } }
From source file:com.pubkit.platform.messaging.protocol.mqtt.proto.parser.ConnectDecoder.java
License:Open Source License
@Override public AbstractMessage decode(AttributeMap ctx, ByteBuf in) throws UnsupportedEncodingException { in.resetReaderIndex();// w w w . j a va 2s . c o m //Common decoding part ConnectMessage message = new ConnectMessage(); if (!decodeCommonHeader(message, 0x00, in)) { in.resetReaderIndex(); return null; } int remainingLength = message.getRemainingLength(); int start = in.readerIndex(); int protocolNameLen = in.readUnsignedShort(); byte[] encProtoName; String protoName; Attribute<Integer> versionAttr = ctx.attr(MQTTDecoder.PROTOCOL_VERSION); switch (protocolNameLen) { case 6: //MQTT version 3.1 "MQIsdp" //ProtocolName 8 bytes or 6 bytes if (in.readableBytes() < 10) { in.resetReaderIndex(); return null; } encProtoName = new byte[6]; in.readBytes(encProtoName); protoName = new String(encProtoName, "UTF-8"); if (!"MQIsdp".equals(protoName)) { in.resetReaderIndex(); throw new CorruptedFrameException("Invalid protoName: " + protoName); } message.setProtocolName(protoName); versionAttr.set((int) VERSION_3_1); break; case 4: //MQTT version 3.1.1 "MQTT" //ProtocolName 6 bytes if (in.readableBytes() < 8) { in.resetReaderIndex(); return null; } encProtoName = new byte[4]; in.readBytes(encProtoName); protoName = new String(encProtoName, "UTF-8"); if (!"MQTT".equals(protoName)) { in.resetReaderIndex(); throw new CorruptedFrameException("Invalid protoName: " + protoName); } message.setProtocolName(protoName); versionAttr.set((int) VERSION_3_1_1); break; default: //protocol broken throw new CorruptedFrameException("Invalid protoName size: " + protocolNameLen); } //ProtocolVersion 1 byte (value 0x03 for 3.1, 0x04 for 3.1.1) message.setProcotolVersion(in.readByte()); if (message.getProcotolVersion() == VERSION_3_1_1) { //if 3.1.1, check the flags (dup, retain and qos == 0) if (message.isDupFlag() || message.isRetainFlag() || message.getQos() != AbstractMessage.QOSType.MOST_ONE) { throw new CorruptedFrameException("Received a CONNECT with fixed header flags != 0"); } //check if this is another connect from the same client on the same session Attribute<Boolean> connectAttr = ctx.attr(ConnectDecoder.CONNECT_STATUS); Boolean alreadyConnected = connectAttr.get(); if (alreadyConnected == null) { //never set connectAttr.set(true); } else if (alreadyConnected) { throw new CorruptedFrameException("Received a second CONNECT on the same network connection"); } } //PKMPConnection flag byte connFlags = in.readByte(); if (message.getProcotolVersion() == VERSION_3_1_1) { if ((connFlags & 0x01) != 0) { //bit(0) of connection flags is != 0 throw new CorruptedFrameException("Received a CONNECT with connectionFlags[0(bit)] != 0"); } } boolean cleanSession = ((connFlags & 0x02) >> 1) == 1; boolean willFlag = ((connFlags & 0x04) >> 2) == 1; byte willQos = (byte) ((connFlags & 0x18) >> 3); if (willQos > 2) { in.resetReaderIndex(); throw new CorruptedFrameException("Expected will QoS in range 0..2 but found: " + willQos); } boolean willRetain = ((connFlags & 0x20) >> 5) == 1; boolean passwordFlag = ((connFlags & 0x40) >> 6) == 1; boolean userFlag = ((connFlags & 0x80) >> 7) == 1; //a password is true iff user is true. if (!userFlag && passwordFlag) { in.resetReaderIndex(); throw new CorruptedFrameException( "Expected password flag to true if the user flag is true but was: " + passwordFlag); } message.setCleanSession(cleanSession); message.setWillFlag(willFlag); message.setWillQos(willQos); message.setWillRetain(willRetain); message.setPasswordFlag(passwordFlag); message.setUserFlag(userFlag); //Keep Alive timer 2 bytes //int keepAlive = Utils.readWord(in); int keepAlive = in.readUnsignedShort(); message.setKeepAlive(keepAlive); if ((remainingLength == 12 && message.getProcotolVersion() == VERSION_3_1) || (remainingLength == 10 && message.getProcotolVersion() == VERSION_3_1_1)) { return message; } //Decode the ClientID String clientID = Utils.decodeString(in); if (clientID == null) { in.resetReaderIndex(); return null; } message.setClientID(clientID); //Decode willTopic if (willFlag) { String willTopic = Utils.decodeString(in); if (willTopic == null) { in.resetReaderIndex(); return null; } message.setWillTopic(willTopic); } //Decode willMessage if (willFlag) { String willMessage = Utils.decodeString(in); if (willMessage == null) { in.resetReaderIndex(); return null; } message.setWillMessage(willMessage); } //Compatibility check with v3.0, remaining length has precedence over //the user and password flags int readed = in.readerIndex() - start; if (readed == remainingLength) { return message; } //Decode username if (userFlag) { String userName = Utils.decodeString(in); if (userName == null) { in.resetReaderIndex(); return null; } message.setUsername(userName); } readed = in.readerIndex() - start; if (readed == remainingLength) { return message; } //Decode password if (passwordFlag) { String password = Utils.decodeString(in); if (password == null) { in.resetReaderIndex(); return null; } message.setPassword(password); } return message; }
From source file:com.pubkit.platform.messaging.protocol.mqtt.proto.parser.PublishDecoder.java
License:Open Source License
@Override void decode(AttributeMap ctx, ByteBuf in, List<Object> out) throws Exception { LOG.info("decode invoked with buffer {}", in); in.resetReaderIndex();/*from ww w .j a v a 2 s . com*/ int startPos = in.readerIndex(); //Common decoding part PublishMessage message = new PublishMessage(); if (!decodeCommonHeader(message, in)) { LOG.info("decode ask for more data after {}", in); in.resetReaderIndex(); return; } if (Utils.isMQTT3_1_1(ctx)) { if (message.getQos() == AbstractMessage.QOSType.MOST_ONE && message.isDupFlag()) { //bad protocol, if QoS=0 => DUP = 0 throw new CorruptedFrameException("Received a PUBLISH with QoS=0 & DUP = 1, MQTT 3.1.1 violation"); } if (message.getQos() == AbstractMessage.QOSType.RESERVED) { throw new CorruptedFrameException( "Received a PUBLISH with QoS flags setted 10 b11, MQTT 3.1.1 violation"); } } int remainingLength = message.getRemainingLength(); //Topic name String topic = Utils.decodeString(in); if (topic == null) { in.resetReaderIndex(); return; } if (topic.contains("+") || topic.contains("#")) { throw new CorruptedFrameException( "Received a PUBLISH with topic containting wild card chars, topic: " + topic); } message.setTopicName(topic); if (message.getQos() == AbstractMessage.QOSType.LEAST_ONE || message.getQos() == AbstractMessage.QOSType.EXACTLY_ONCE) { message.setMessageID(in.readUnsignedShort()); } int stopPos = in.readerIndex(); //read the payload int payloadSize = remainingLength - (stopPos - startPos - 2) + (Utils.numBytesToEncode(remainingLength) - 1); if (in.readableBytes() < payloadSize) { in.resetReaderIndex(); return; } // byte[] b = new byte[payloadSize]; ByteBuf bb = Unpooled.buffer(payloadSize); in.readBytes(bb); message.setPayload(bb.nioBuffer()); out.add(message); }
From source file:com.pubkit.platform.messaging.protocol.mqtt.proto.parser.SubAckDecoder.java
License:Open Source License
@Override void decode(AttributeMap ctx, ByteBuf in, List<Object> out) throws Exception { //Common decoding part in.resetReaderIndex();/* w w w .j a va2 s. c om*/ SubAckMessage message = new SubAckMessage(); if (!decodeCommonHeader(message, 0x00, in)) { in.resetReaderIndex(); return; } int remainingLength = message.getRemainingLength(); //MessageID message.setMessageID(in.readUnsignedShort()); remainingLength -= 2; //Qos array if (in.readableBytes() < remainingLength) { in.resetReaderIndex(); return; } for (int i = 0; i < remainingLength; i++) { byte qos = in.readByte(); message.addType(AbstractMessage.QOSType.values()[qos]); } out.add(message); }
From source file:com.pubkit.platform.messaging.protocol.mqtt.proto.parser.SubscribeDecoder.java
License:Open Source License
@Override void decode(AttributeMap ctx, ByteBuf in, List<Object> out) throws Exception { //Common decoding part SubscribeMessage message = new SubscribeMessage(); in.resetReaderIndex();// ww w . ja v a 2 s. c o m if (!decodeCommonHeader(message, 0x02, in)) { in.resetReaderIndex(); return; } //check qos level if (message.getQos() != QOSType.LEAST_ONE) { throw new CorruptedFrameException( "Received PKMPSubscribe message with QoS other than LEAST_ONE, was: " + message.getQos()); } int start = in.readerIndex(); //read messageIDs message.setMessageID(in.readUnsignedShort()); int readed = in.readerIndex() - start; while (readed < message.getRemainingLength()) { decodeSubscription(in, message); readed = in.readerIndex() - start; } if (message.subscriptions().isEmpty()) { throw new CorruptedFrameException("subscribe MUST have got at least 1 couple topic/QoS"); } out.add(message); }
From source file:com.pubkit.platform.messaging.protocol.mqtt.proto.parser.UnsubscribeDecoder.java
License:Open Source License
@Override void decode(AttributeMap ctx, ByteBuf in, List<Object> out) throws Exception { //Common decoding part in.resetReaderIndex();/*from w w w. j a v a 2s. c om*/ UnsubscribeMessage message = new UnsubscribeMessage(); if (!decodeCommonHeader(message, 0x02, in)) { in.resetReaderIndex(); return; } //check qos level if (message.getQos() != AbstractMessage.QOSType.LEAST_ONE) { throw new CorruptedFrameException( "Found an Usubscribe message with qos other than LEAST_ONE, was: " + message.getQos()); } int start = in.readerIndex(); //read messageIDs message.setMessageID(in.readUnsignedShort()); int readed = in.readerIndex() - start; while (readed < message.getRemainingLength()) { message.addTopicFilter(Utils.decodeString(in)); readed = in.readerIndex() - start; } if (message.topicFilters().isEmpty()) { throw new CorruptedFrameException("unsubscribe MUST have got at least 1 topic"); } out.add(message); }
From source file:com.pubkit.platform.messaging.protocol.mqtt.proto.parser.Utils.java
License:Open Source License
/** * Load a string from the given buffer, reading first the two bytes of len * and then the UTF-8 bytes of the string. * //from w w w .j ava2 s .c o m * @return the decoded string or null if NEED_DATA */ static String decodeString(ByteBuf in) throws UnsupportedEncodingException { if (in.readableBytes() < 2) { return null; } //int strLen = Utils.readWord(in); int strLen = in.readUnsignedShort(); if (in.readableBytes() < strLen) { return null; } byte[] strRaw = new byte[strLen]; in.readBytes(strRaw); return new String(strRaw, "UTF-8"); }
From source file:com.quavo.osrs.network.protocol.codec.game.GamePacketDecoder.java
License:Open Source License
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (!in.isReadable() || !player.getChannel().isRegistered()) { return;//from ww w. j a va2 s.c om } int opcode = in.readUnsignedByte(); Optional<PacketDecoderIdentifier> data = PacketDecoderIdentifier.getPacket(opcode); if (data.isPresent()) { PacketDecoderIdentifier packet = data.get(); int size = packet.getSize(); if (packet.getType() == PacketType.VARIABLE_BYTE) { if (in.readableBytes() < 1) { return; } size = in.readUnsignedByte(); } else if (packet.getType() == PacketType.VARIABLE_SHORT) { if (in.readableBytes() < 2) { return; } size = in.readUnsignedShort(); } if (in.readableBytes() >= size) { if (size < 0) { return; } byte[] bytes = new byte[size]; in.readBytes(bytes, 0, size); out.add(new GamePacketRequest(this, player, packet.getId(), new GamePacketReader(Unpooled.wrappedBuffer(bytes)))); } } else { System.out.println("No data present for incoming packet: " + opcode + "."); in.readBytes(new byte[in.readableBytes()]); } }
From source file:com.quavo.osrs.network.protocol.codec.update.UpdateDecoder.java
License:Open Source License
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (!in.isReadable() || in.readableBytes() < 4) { return;//from w w w . j a v a 2s . c o m } Optional<UpdateType> request = UpdateType.getType(in.readUnsignedByte()); if (request.isPresent()) { UpdateType updateType = request.get(); switch (updateType) { case LOW_PRIORITY_UPDATE: case HIGH_PRIORITY_UPDATE: int uid = in.readUnsignedMedium(); int type = (uid >> 16); int id = (uid & 0xffff); out.add(new UpdateRequest(this, type, id, updateType == UpdateType.HIGH_PRIORITY_UPDATE)); break; case XOR_ENCRYPTION_UPDATE: int key = in.readUnsignedByte(); in.readUnsignedShort(); out.add(new XOREncryptionRequest(this, key)); break; } } else { in.readUnsignedMedium(); } }
From source file:com.splicemachine.stream.KryoDecoder.java
License:Apache License
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { // LOG.warn("Decoding"); if (in.readableBytes() < 2) return;/* w w w .j av a 2 s .c om*/ in.markReaderIndex(); int len = in.readUnsignedShort(); // LOG.warn("Read lenght " + len); if (in.readableBytes() < len) { // LOG.warn("Not enough data "); in.resetReaderIndex(); return; } // LOG.warn("Decoding object "); byte[] buf = new byte[len]; in.readBytes(buf); Input input = new Input(buf); Kryo decoder = kp.get(); try { Object object = decoder.readClassAndObject(input); out.add(object); } finally { kp.returnInstance(decoder); } // LOG.warn("Decoded " + object); }