Home > Software engineering >  How to wrap net.Conn.Read() in Golang
How to wrap net.Conn.Read() in Golang

Time:09-04

I want to wrap Read function net.Conn.Read(). The purpose of this to read the SSL handshake messages. https://pkg.go.dev/net#TCPConn.Read

nc, err := net.Dial("tcp", "google.com:443")
if err != nil {
    fmt.Println(err)
}
tls.Client(nc, &tls.Config{})

Are there any ways to do?

Thanks in advance

CodePudding user response:

Use the following code to intercept Read on a net.Conn:

 type wrap {
     // Conn is the wrapped net.Conn.
     // Because it's an embedded field, the 
     // net.Conn methods are automatically promoted
     // to wrap.
     net.Conn 
 }

 // Read calls through to the wrapped read and
 // prints the bytes that flow through. Replace
 // the print statement with whatever is appropriate
 // for your application.
 func (w wrap) Read(p []byte) (int, error) {
     n, err := w.Conn.Read()
     fmt.Printf("%x\n", p[:n]) // example
     return n, err
 }

Wrap like this:

 tnc, err :=tls.Client(wrap{nc}, &tls.Config{})

CodePudding user response:

The previous answer gets the job done indeed.

However I would recommend Liz Rice's talk: GopherCon 2018: Liz Rice - The Go Programmer's Guide to Secure Connections

Going through her code in Github, you might find a more elegant way to achieve what you want.

Start with the client code on line 26.

  • Related