x/internal/net/transport.go
2022-08-31 20:18:52 +08:00

51 lines
782 B
Go

package net
import (
"bufio"
"io"
"net"
"github.com/go-gost/core/common/bufpool"
)
func Transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1)
go func() {
errc <- copyBuffer(rw1, rw2)
}()
go func() {
errc <- copyBuffer(rw2, rw1)
}()
if err := <-errc; err != nil && err != io.EOF {
return err
}
return nil
}
func copyBuffer(dst io.Writer, src io.Reader) error {
buf := bufpool.Get(4 * 1024)
defer bufpool.Put(buf)
_, err := io.CopyBuffer(dst, src, *buf)
return err
}
type bufferReaderConn struct {
net.Conn
br *bufio.Reader
}
func NewBufferReaderConn(conn net.Conn, br *bufio.Reader) net.Conn {
return &bufferReaderConn{
Conn: conn,
br: br,
}
}
func (c *bufferReaderConn) Read(b []byte) (int, error) {
return c.br.Read(b)
}