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  }