stream_proxy.go (28 lines of code) (raw):

package terminal import ( "fmt" "io" ) type StreamProxy struct { StopCh chan error } func NewStreamProxy(stoppers int) *StreamProxy { return &StreamProxy{ StopCh: make(chan error, stoppers+2), // each proxy() call is a stopper } } func (p *StreamProxy) GetStopCh() chan error { return p.StopCh } func (p *StreamProxy) Serve(client io.ReadWriter, server io.ReadWriter) error { go p.proxy(client, server) go p.proxy(server, client) err := <-p.StopCh return err } func (p *StreamProxy) proxy(to, from io.ReadWriter) { _, err := io.Copy(to, from) if err != nil { p.StopCh <- fmt.Errorf("failed to pipe stream: %v", err) } }