logtransport.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. // Package logtransport provides a transport that logs all of its messages.
  2. package tunnelrpc
  3. import (
  4. "bytes"
  5. "context"
  6. "github.com/cloudflare/cloudflared/logger"
  7. "zombiezen.com/go/capnproto2/encoding/text"
  8. "zombiezen.com/go/capnproto2/rpc"
  9. rpccapnp "zombiezen.com/go/capnproto2/std/capnp/rpc"
  10. )
  11. type transport struct {
  12. rpc.Transport
  13. l logger.Service
  14. }
  15. // NewTransportLogger creates a new logger that proxies messages to and from t and
  16. // logs them to l. If l is nil, then the log package's default
  17. // logger is used.
  18. func NewTransportLogger(l logger.Service, t rpc.Transport) rpc.Transport {
  19. return &transport{Transport: t, l: l}
  20. }
  21. func (t *transport) SendMessage(ctx context.Context, msg rpccapnp.Message) error {
  22. t.l.Debugf("rpcconnect: tx %s", formatMsg(msg))
  23. return t.Transport.SendMessage(ctx, msg)
  24. }
  25. func (t *transport) RecvMessage(ctx context.Context) (rpccapnp.Message, error) {
  26. msg, err := t.Transport.RecvMessage(ctx)
  27. if err != nil {
  28. t.l.Debugf("rpcconnect: rx error: %s", err)
  29. return msg, err
  30. }
  31. t.l.Debugf("rpcconnect: rx %s", formatMsg(msg))
  32. return msg, nil
  33. }
  34. func formatMsg(m rpccapnp.Message) string {
  35. var buf bytes.Buffer
  36. text.NewEncoder(&buf).Encode(0x91b79f1f808db032, m.Struct)
  37. return buf.String()
  38. }