Esempio n. 1
0
// Start starts serving the responses for the client.
func (c *Client) Start() error {
	defer func() {
		if closer, ok := c.rw.(io.Closer); ok {
			closer.Close()
		}
	}()

	for {
		var (
			size uint32
			mt   protocol.MessageType
			err  error
		)

		if size, mt, err = protocol.DecodeHdr(c.rw); err != nil {
			return err
		}

		limiter := &io.LimitedReader{R: c.rw, N: int64(size) - protocol.HeaderSize}

		var r protocol.Message
		if r, err = protocol.MessageTypeToMessage(mt); err != nil {
			return err
		}
		if err = r.Decode(limiter); err != nil {
			return err
		}

		c.handleResponse(r)

	}
}