lib/protocol: Send Close message on read error (#7141)

This commit is contained in:
Simon Frei
2020-11-27 11:31:20 +01:00
committed by GitHub
parent a9764fc16c
commit bbb22c8c80
3 changed files with 94 additions and 23 deletions
+31 -8
View File
@@ -6,17 +6,40 @@
package testutils
// BlockingRW implements io.Reader and Writer but never returns when called
type BlockingRW struct{ nilChan chan struct{} }
import (
"errors"
"sync"
)
func (rw *BlockingRW) Read(p []byte) (n int, err error) {
<-rw.nilChan
return
var ErrClosed = errors.New("closed")
// BlockingRW implements io.Reader, Writer and Closer, but only returns when closed
type BlockingRW struct {
c chan struct{}
closeOnce sync.Once
}
func (rw *BlockingRW) Write(p []byte) (n int, err error) {
<-rw.nilChan
return
func NewBlockingRW() *BlockingRW {
return &BlockingRW{
c: make(chan struct{}),
closeOnce: sync.Once{},
}
}
func (rw *BlockingRW) Read(p []byte) (int, error) {
<-rw.c
return 0, ErrClosed
}
func (rw *BlockingRW) Write(p []byte) (int, error) {
<-rw.c
return 0, ErrClosed
}
func (rw *BlockingRW) Close() error {
rw.closeOnce.Do(func() {
close(rw.c)
})
return nil
}
// NoopRW implements io.Reader and Writer but never returns when called