// recvPeerFrameOfType waits for a new frame of a given type from the peer, failing // if the next frame received is not of that type. // If an error frame is returned, then the errorMessage is returned as the error. func (mex *messageExchange) recvPeerFrameOfType(msgType messageType) (*Frame, error) { frame, err := mex.recvPeerFrame() if err != nil { return nil, err } switch frame.Header.messageType { case msgType: return frame, nil case messageTypeError: // If we read an error frame, we can release it once we deserialize it. defer mex.framePool.Release(frame) errMsg := errorMessage{ id: frame.Header.ID, } var rbuf typed.ReadBuffer rbuf.Wrap(frame.SizedPayload()) if err := errMsg.read(&rbuf); err != nil { return nil, err } return nil, errMsg default: // TODO(mmihic): Should be treated as a protocol error mex.mexset.log.WithFields( LogField{"header", frame.Header}, LogField{"expectedType", msgType}, LogField{"expectedID", mex.msgID}, ).Warn("Received unexpected frame.") return nil, errUnexpectedFrameType } }
// recvPeerFrameOfType waits for a new frame of a given type from the peer, failing // if the next frame received is not of that type. // If an error frame is returned, then the errorMessage is returned as the error. func (mex *messageExchange) recvPeerFrameOfType(msgType messageType) (*Frame, error) { frame, err := mex.recvPeerFrame() if err != nil { return nil, err } switch frame.Header.messageType { case msgType: return frame, nil case messageTypeError: errMsg := errorMessage{ id: frame.Header.ID, } var rbuf typed.ReadBuffer rbuf.Wrap(frame.SizedPayload()) if err := errMsg.read(&rbuf); err != nil { return nil, err } return nil, errMsg default: // TODO(mmihic): Should be treated as a protocol error mex.mexset.log.Warnf("Received unexpected message %v, expected %v for %d", frame.Header.messageType, msgType, frame.Header.ID) return nil, errUnexpectedFrameType } }
// ReadIn reads the frame from the given io.Reader func (f *Frame) ReadIn(r io.Reader) error { var rbuf typed.ReadBuffer rbuf.Wrap(f.headerBuffer) if _, err := rbuf.FillFrom(r, FrameHeaderSize); err != nil { return err } if err := f.Header.read(&rbuf); err != nil { return err } if f.Header.PayloadSize() > 0 { if _, err := io.ReadFull(r, f.SizedPayload()); err != nil { return err } } return nil }
func (f *Frame) read(msg message) error { var rbuf typed.ReadBuffer rbuf.Wrap(f.SizedPayload()) return msg.read(&rbuf) }