github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/print.go (about) 1 package xio 2 3 import ( 4 "fmt" 5 "io" 6 "net" 7 "time" 8 ) 9 10 // PrintConn is net.Conn to print the transfter data 11 type PrintConn struct { 12 Base io.ReadWriteCloser 13 Name string 14 Mode int 15 } 16 17 // NewPrintConn will create new PrintConn 18 func NewPrintConn(name string, base io.ReadWriteCloser) (conn *PrintConn) { 19 conn = &PrintConn{Base: base, Name: name} 20 return 21 } 22 23 func (p *PrintConn) Read(b []byte) (n int, err error) { 24 n, err = p.Base.Read(b) 25 if err == nil { 26 switch p.Mode { 27 case 0x10: 28 fmt.Printf("%v Read %v bytes %v\n", p.Name, n, string(b[:n])) 29 default: 30 fmt.Printf("%v Read %v bytes % 02x\n", p.Name, n, b[:n]) 31 } 32 } else { 33 fmt.Printf("%v Read error %v\n", p.Name, err) 34 } 35 return 36 } 37 38 func (p *PrintConn) Write(b []byte) (n int, err error) { 39 n, err = p.Base.Write(b) 40 if err == nil { 41 switch p.Mode { 42 case 0x10: 43 fmt.Printf("%v Write %v bytes %v\n", p.Name, n, string(b[:n])) 44 default: 45 fmt.Printf("%v Write %v bytes % 02x\n", p.Name, n, b[:n]) 46 } 47 } else { 48 fmt.Printf("%v Write error %v\n", p.Name, err) 49 } 50 return 51 } 52 53 // LocalAddr returns the local network address. 54 func (p *PrintConn) LocalAddr() net.Addr { 55 if conn, ok := p.Base.(net.Conn); ok { 56 return conn.LocalAddr() 57 } 58 return p 59 } 60 61 // RemoteAddr returns the remote network address. 62 func (p *PrintConn) RemoteAddr() net.Addr { 63 if conn, ok := p.Base.(net.Conn); ok { 64 return conn.RemoteAddr() 65 } 66 return p 67 } 68 69 // SetDeadline for net.Conn 70 func (p *PrintConn) SetDeadline(t time.Time) error { 71 if conn, ok := p.Base.(net.Conn); ok { 72 return conn.SetDeadline(t) 73 } 74 return nil 75 } 76 77 // SetReadDeadline for net.Conn 78 func (p *PrintConn) SetReadDeadline(t time.Time) error { 79 if conn, ok := p.Base.(net.Conn); ok { 80 return conn.SetReadDeadline(t) 81 } 82 return nil 83 } 84 85 // SetWriteDeadline for net.Conn 86 func (p *PrintConn) SetWriteDeadline(t time.Time) error { 87 if conn, ok := p.Base.(net.Conn); ok { 88 return conn.SetWriteDeadline(t) 89 } 90 return nil 91 } 92 93 // Network impl net.Addr 94 func (p *PrintConn) Network() string { 95 return "print" 96 } 97 98 func (p *PrintConn) String() string { 99 return fmt.Sprintf("%v", p.Name) 100 } 101 102 // Close will close base 103 func (p *PrintConn) Close() (err error) { 104 err = p.Base.Close() 105 fmt.Printf("%v Close %v\n", p.Name, err) 106 return 107 } 108 109 type PrintPiper struct { 110 Name string 111 Raw Piper 112 } 113 114 func NewPrintPiper(name string, raw Piper) (piper *PrintPiper) { 115 piper = &PrintPiper{ 116 Name: name, 117 Raw: raw, 118 } 119 return 120 } 121 122 func (p *PrintPiper) PipeConn(conn io.ReadWriteCloser, target string) (err error) { 123 err = p.Raw.PipeConn(NewPrintConn(p.Name, conn), target) 124 return 125 } 126 127 func (p *PrintPiper) Close() (err error) { 128 err = p.Raw.Close() 129 return 130 }