Hi Aliaksandr, Thank you very much for these insights. This helped me understand what's going on.
Also, thanks for the pointers to possible workarounds! On Wednesday, August 17, 2016 at 10:14:40 AM UTC-7, Aliaksandr Valialkin wrote: > > Hi, Madhu, > > Writes to net.Pipe connections are synchronous - i.e. call to Write > returns only after the corresponding call to Read on the other end of pipe > is made. TLS implementation in Go may deadlock on net.Pipe connection, > since both server and client may call Write on both ends of pipe while > nobody calls Read. > > Possible workarounds: > 1) Wrap read sides of the net.Pipe into an 'eager' io.Reader > implementation, which will instantly read all the incoming data into > internal buffer until external caller will consume buffered data. > 2) Use another net.Pipe-like solution, which already solves the problem. > See, for instance, > https://godoc.org/github.com/valyala/fasthttp/fasthttputil#PipeConns . > > On Wednesday, August 17, 2016 at 7:01:00 PM UTC+3, Madhusudan C.S wrote: >> >> I am writing some test code where I am creating `tls.Server()` and >> `tls.Client()` using the `Conn` pair returned by `net.Pipe()`. I have a few >> positive tests (where the Handshakes are expected to succeed) and a few >> negative tests (where the Handshakes are expected to fail). Each test sets >> up a `tls.Config` pair for a client and a server and runs >> `server.Handshake()` and `client.Handshake()` in separate goroutines. The >> positive tests run fine, but the negative tests hang for ever, waiting for >> the `Handshake()`s to return in both the server and the client goroutines. >> >> I poked around a bit by introducing a timeout and noticed that the client >> reader contains the following bytes sitting around, waiting to be read: >> >> Client: n=7 bytes=[21 3 3 0 2 2 42] >> >> These bytes translate to: TLS record type alert `recordTypeAlert` (21), >> Version TLS 1.2 (3 3), message length `2`, alert type `alertLevelError` (2) >> and alert reason `alertBadCertificate` (42). >> >> This is the exact error an HTTPS server would have returned if I had set >> this test up using `net/http/httptest`. >> >> So my question is, why do the client and server goroutines hang here? >> Shouldn't these bytes be read and interpreted returning the error to the >> callers? >> >> Is this a bug? >> >> Here is the relevant part of the test: >> https://gist.github.com/madhusudancs/6c248769481e10ab7f2e9f002b007bcc >> >> >> -- >> Cheers, >> Madhu >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.