github.com/cjdelisle/matterfoss@v5.11.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 remoteIOReader struct {
    13  	conn io.ReadWriteCloser
    14  }
    15  
    16  func (r *remoteIOReader) Read(b []byte) (int, error) {
    17  	var buf [10]byte
    18  	n := binary.PutVarint(buf[:], int64(len(b)))
    19  	if _, err := r.conn.Write(buf[:n]); err != nil {
    20  		return 0, err
    21  	}
    22  	return r.conn.Read(b)
    23  }
    24  
    25  func (r *remoteIOReader) Close() error {
    26  	return r.conn.Close()
    27  }
    28  
    29  func connectIOReader(conn io.ReadWriteCloser) io.ReadCloser {
    30  	return &remoteIOReader{conn}
    31  }
    32  
    33  func serveIOReader(r io.Reader, conn io.ReadWriteCloser) {
    34  	cr := bufio.NewReader(conn)
    35  	defer conn.Close()
    36  	buf := make([]byte, 32*1024)
    37  	for {
    38  		n, err := binary.ReadVarint(cr)
    39  		if err != nil {
    40  			break
    41  		}
    42  		if written, err := io.CopyBuffer(conn, io.LimitReader(r, n), buf); err != nil || written < n {
    43  			break
    44  		}
    45  	}
    46  }