public static MessageBase produceMessageBaseOnUserInput(String line, int msgId) { String[] input = line.split(" ", 2); short command; try { command = CommandParserUtil.parseCommand(input[0]); } catch (IllegalArgumentException e) { log.error("Command not supported {}", input[0]); return null; } String body = input.length == 1 ? "" : input[1]; if (command == HARDWARE || command == SHARE_LOGIN || command == LOAD_PROFILE_GZIPPED || command == HARDWARE_RESEND_FROM_BLUETOOTH || command == BRIDGE || command == EMAIL || command == SHARING || command == EXPORT_GRAPH_DATA || command == SET_WIDGET_PROPERTY || command == HARDWARE_SYNC || command == RESET_PASSWORD || command == DELETE_WIDGET) { body = body.replace(" ", "\0"); } return produce(msgId, command, body); }
break; default: message = produce(messageId, command, buf.toString(StandardCharsets.UTF_8));
break; default: message = produce(messageId, command, buf.toString(StandardCharsets.UTF_8));
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { if (in.readableBytes() < 5) { return; } in.markReaderIndex(); short command = in.readUnsignedByte(); int messageId = in.readUnsignedShort(); int codeOrLength = in.readUnsignedShort(); if (limitChecker.quotaReached(ctx, messageId)) { return; } MessageBase message; if (command == Command.RESPONSE) { message = new ResponseMessage(messageId, codeOrLength); } else { if (in.readableBytes() < codeOrLength) { in.resetReaderIndex(); return; } message = produce(messageId, command, (String) in.readCharSequence(codeOrLength, CharsetUtil.UTF_8)); } log.trace("Incoming {}", message); stats.mark(command); out.add(message); }
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { if (in.readableBytes() < PROTOCOL_APP_HEADER_SIZE) { return; } in.markReaderIndex(); short command = in.readUnsignedByte(); int messageId = in.readUnsignedShort(); //actually here should be long. but we do not expect this number to be large //so it should perfectly fit int int codeOrLength = (int) in.readUnsignedInt(); if (limitChecker.quotaReached(ctx, messageId)) { return; } MessageBase message; if (command == Command.RESPONSE) { message = new ResponseMessage(messageId, codeOrLength); } else { if (in.readableBytes() < codeOrLength) { in.resetReaderIndex(); return; } validateLength(codeOrLength); message = produce(messageId, command, (String) in.readCharSequence(codeOrLength, CharsetUtil.UTF_8)); } log.trace("Incoming {}", message); stats.mark(command); out.add(message); }
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.debug("In webappdecoder. {}", msg); if (msg instanceof BinaryWebSocketFrame) { try { ByteBuf in = ((BinaryWebSocketFrame) msg).content(); short command = in.readUnsignedByte(); int messageId = in.readUnsignedShort(); if (limitChecker.quotaReached(ctx, messageId)) { return; } MessageBase message; if (command == Command.RESPONSE) { message = new ResponseMessage(messageId, (int) in.readUnsignedInt()); } else { int codeOrLength = in.capacity() - 3; message = produce(messageId, command, (String) in.readCharSequence(codeOrLength, UTF_8)); } log.trace("Incoming websocket msg {}", message); stats.markWithoutGlobal(Command.WEB_SOCKETS); ctx.fireChannelRead(message); } finally { ReferenceCountUtil.release(msg); } } else { super.channelRead(ctx, msg); } }