gost/pkg/handler/transport.go
2021-11-01 21:57:28 +08:00

44 lines
598 B
Go

package handler
import (
"io"
"sync"
)
const (
poolBufferSize = 32 * 1024
)
var (
pool = sync.Pool{
New: func() interface{} {
return make([]byte, poolBufferSize)
},
}
)
func Transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1)
go func() {
errc <- copyBuffer(rw1, rw2)
}()
go func() {
errc <- copyBuffer(rw2, rw1)
}()
err := <-errc
if err != nil && err == io.EOF {
err = nil
}
return err
}
func copyBuffer(dst io.Writer, src io.Reader) error {
buf := pool.Get().([]byte)
defer pool.Put(buf)
_, err := io.CopyBuffer(dst, src, buf)
return err
}