func (c *Codec) ReadHeader(hdr *rpc.Header) error { c.msg = inMsg{} // avoid any potential cross-message contamination. var err error if c.isLogging() { var m json.RawMessage err = c.conn.Receive(&m) if err == nil { log.Debugf("rpc/jsoncodec: <- %s", m) err = json.Unmarshal(m, &c.msg) } else { log.Debugf("rpc/jsoncodec: <- error: %v (closing %v)", err, c.isClosing()) } } else { err = c.conn.Receive(&c.msg) } if err != nil { // If we've closed the connection, we may get a spurious error, // so ignore it. if c.isClosing() || err == io.EOF { return io.EOF } return fmt.Errorf("error receiving message: %v", err) } hdr.RequestId = c.msg.RequestId hdr.Type = c.msg.Type hdr.Id = c.msg.Id hdr.Request = c.msg.Request hdr.Error = c.msg.Error hdr.ErrorCode = c.msg.ErrorCode return nil }