amitbet / vncproxy

An RFB proxy, written in go that can save and replay FBS files
Other
206 stars 45 forks source link

bad note #32

Closed RyanCode closed 1 year ago

RyanCode commented 1 year ago
// mainLoop reads messages sent from the server and routes them to the
// proper channels for users of the client to read.
func (c *ClientConn) mainLoop() {
    defer c.Close()

    reader := &common.RfbReadHelper{Reader: c.conn, Listeners: c.Listeners}
    // Build the map of available server messages
    typeMap := make(map[uint8]common.ServerMessage)

    defaultMessages := []common.ServerMessage{
        new(MsgFramebufferUpdate),
        new(MsgSetColorMapEntries),
        new(MsgBell),
        new(MsgServerCutText),
        new(MsgServerFence),
    }

    for _, msg := range defaultMessages {
        typeMap[msg.Type()] = msg
    }

    if c.config.ServerMessages != nil {
        for _, msg := range c.config.ServerMessages {
            typeMap[msg.Type()] = msg
        }
    }

    defer func() {
        logger.Warn("ClientConn.MainLoop: exiting!")
        c.Listeners.Consume(&common.RfbSegment{
            SegmentType: common.SegmentConnectionClosed,
        })
    }()

    for {
        var messageType uint8
        if err := binary.Read(c.conn, binary.BigEndian, &messageType); err != nil {
            logger.Errorf("ClientConn.MainLoop: error reading messagetype, %s", err)
            break
        }

        msg, ok := typeMap[messageType]
        if !ok {
            logger.Errorf("ClientConn.MainLoop: bad message type, %d", messageType)
            // Unsupported message type! Bad!
            break
        }
        logger.Debugf("ClientConn.MainLoop: got ServerMessage:%s", common.ServerMessageType(messageType))
        reader.SendMessageStart(common.ServerMessageType(messageType))
        reader.PublishBytes([]byte{byte(messageType)})

        parsedMsg, err := msg.Read(c, reader)
        if err != nil {
            logger.Errorf("ClientConn.MainLoop: error parsing message, %s", err)
            break
        }
        logger.Debugf("ClientConn.MainLoop: read & parsed ServerMessage:%d, %s", parsedMsg.Type(), parsedMsg)
    }
}

after parsedMsg, err := msg.Read(c, reader),not send this msg to listeners.why? only a type?