log.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package debugio
  2. import (
  3. "net"
  4. "github.com/sagernet/sing-box/log"
  5. "github.com/sagernet/sing/common/buf"
  6. "github.com/sagernet/sing/common/bufio"
  7. M "github.com/sagernet/sing/common/metadata"
  8. N "github.com/sagernet/sing/common/network"
  9. )
  10. type LogConn struct {
  11. N.ExtendedConn
  12. logger log.Logger
  13. prefix string
  14. }
  15. func NewLogConn(conn net.Conn, logger log.Logger, prefix string) N.ExtendedConn {
  16. return &LogConn{bufio.NewExtendedConn(conn), logger, prefix}
  17. }
  18. func (c *LogConn) Read(p []byte) (n int, err error) {
  19. n, err = c.ExtendedConn.Read(p)
  20. if n > 0 {
  21. c.logger.Debug(c.prefix, " read ", buf.EncodeHexString(p[:n]))
  22. }
  23. return
  24. }
  25. func (c *LogConn) Write(p []byte) (n int, err error) {
  26. c.logger.Debug(c.prefix, " write ", buf.EncodeHexString(p))
  27. return c.ExtendedConn.Write(p)
  28. }
  29. func (c *LogConn) ReadBuffer(buffer *buf.Buffer) error {
  30. err := c.ExtendedConn.ReadBuffer(buffer)
  31. if err == nil {
  32. c.logger.Debug(c.prefix, " read buffer ", buf.EncodeHexString(buffer.Bytes()))
  33. }
  34. return err
  35. }
  36. func (c *LogConn) WriteBuffer(buffer *buf.Buffer) error {
  37. c.logger.Debug(c.prefix, " write buffer ", buf.EncodeHexString(buffer.Bytes()))
  38. return c.ExtendedConn.WriteBuffer(buffer)
  39. }
  40. func (c *LogConn) Upstream() any {
  41. return c.ExtendedConn
  42. }
  43. type LogPacketConn struct {
  44. N.NetPacketConn
  45. logger log.Logger
  46. prefix string
  47. }
  48. func NewLogPacketConn(conn net.PacketConn, logger log.Logger, prefix string) N.NetPacketConn {
  49. return &LogPacketConn{bufio.NewPacketConn(conn), logger, prefix}
  50. }
  51. func (c *LogPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
  52. n, addr, err = c.NetPacketConn.ReadFrom(p)
  53. if n > 0 {
  54. c.logger.Debug(c.prefix, " read from ", addr, " ", buf.EncodeHexString(p[:n]))
  55. }
  56. return
  57. }
  58. func (c *LogPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
  59. c.logger.Debug(c.prefix, " write to ", addr, " ", buf.EncodeHexString(p))
  60. return c.NetPacketConn.WriteTo(p, addr)
  61. }
  62. func (c *LogPacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr, err error) {
  63. destination, err = c.NetPacketConn.ReadPacket(buffer)
  64. if err == nil {
  65. c.logger.Debug(c.prefix, " read packet from ", destination, " ", buf.EncodeHexString(buffer.Bytes()))
  66. }
  67. return
  68. }
  69. func (c *LogPacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  70. c.logger.Debug(c.prefix, " write packet to ", destination, " ", buf.EncodeHexString(buffer.Bytes()))
  71. return c.NetPacketConn.WritePacket(buffer, destination)
  72. }