better debug info
diff --git a/packet.go b/packet.go index bfe6a3c..480d0e7 100644 --- a/packet.go +++ b/packet.go
@@ -311,9 +311,16 @@ } else { b = make([]byte, 4) } - if _, err := io.ReadFull(r, b[:4]); err != nil { + + if n, err := io.ReadFull(r, b[:4]); err != nil { + debug("recv length %d of %d bytes: err %v", n, 4, err) + if n > 0 { + debug("recv length error: bytes %x", b[:n]) + } + return 0, nil, err } + length, _ := unmarshalUint32(b) if length > maxMsgLength { debug("recv packet %d bytes too long", length) @@ -323,24 +330,38 @@ debug("recv packet of 0 bytes too short") return 0, nil, errShortPacket } + if alloc == nil { b = make([]byte, length) } - if _, err := io.ReadFull(r, b[:length]); err != nil { + + if n, err := io.ReadFull(r, b[:length]); err != nil { + // Log this error message _before_ we potentially override it. + debug("recv packet %d of %d bytes: err %v", n, length, err) + // ReadFull only returns EOF if it has read no bytes. // In this case, that means a partial packet, and thus unexpected. if err == io.EOF { err = io.ErrUnexpectedEOF } - debug("recv packet %d bytes: err %v", length, err) + + if n > 0 { + n := min(32, n) // limit bytes dump to 32-bytes. + debug("recv packet error: bytes %x", b[:n]) + } + return 0, nil, err } + + typ, payload := fxp(b[0]), b[1:length] + if debugDumpRxPacketBytes { - debug("recv packet: %s %d bytes %x", fxp(b[0]), length, b[1:length]) + debug("recv packet: %s %d bytes %x", typ, length, payload) } else if debugDumpRxPacket { - debug("recv packet: %s %d bytes", fxp(b[0]), length) + debug("recv packet: %s %d bytes", typ, length) } - return b[0], b[1:length], nil + + return typ, payload, nil } type extensionPair struct {