github.com/levb/mattermost-server@v5.3.1+incompatible/plugin/io_rpc.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package plugin 5 6 import ( 7 "bufio" 8 "encoding/binary" 9 "io" 10 ) 11 12 type rwc struct { 13 io.ReadCloser 14 io.WriteCloser 15 } 16 17 func (rwc *rwc) Close() (err error) { 18 err = rwc.WriteCloser.Close() 19 if rerr := rwc.ReadCloser.Close(); err == nil { 20 err = rerr 21 } 22 return 23 } 24 25 type remoteIOReader struct { 26 conn io.ReadWriteCloser 27 } 28 29 func (r *remoteIOReader) Read(b []byte) (int, error) { 30 var buf [10]byte 31 n := binary.PutVarint(buf[:], int64(len(b))) 32 if _, err := r.conn.Write(buf[:n]); err != nil { 33 return 0, err 34 } 35 return r.conn.Read(b) 36 } 37 38 func (r *remoteIOReader) Close() error { 39 return r.conn.Close() 40 } 41 42 func connectIOReader(conn io.ReadWriteCloser) io.ReadCloser { 43 return &remoteIOReader{conn} 44 } 45 46 func serveIOReader(r io.Reader, conn io.ReadWriteCloser) { 47 cr := bufio.NewReader(conn) 48 defer conn.Close() 49 buf := make([]byte, 32*1024) 50 for { 51 n, err := binary.ReadVarint(cr) 52 if err != nil { 53 break 54 } 55 if written, err := io.CopyBuffer(conn, io.LimitReader(r, n), buf); err != nil || written < n { 56 break 57 } 58 } 59 }