mirror of https://github.com/synctv-org/synctv
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
901 B
Go
60 lines
901 B
Go
package proxy
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"sync"
|
|
)
|
|
|
|
const (
|
|
DefaultBufferSize = 16 * 1024
|
|
)
|
|
|
|
var sharedBufferPool = sync.Pool{
|
|
New: func() interface{} {
|
|
buffer := make([]byte, DefaultBufferSize)
|
|
return &buffer
|
|
},
|
|
}
|
|
|
|
func getBuffer() *[]byte {
|
|
return sharedBufferPool.Get().(*[]byte)
|
|
}
|
|
|
|
func putBuffer(buffer *[]byte) {
|
|
sharedBufferPool.Put(buffer)
|
|
}
|
|
|
|
func copyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
|
|
buf := getBuffer()
|
|
defer putBuffer(buf)
|
|
for {
|
|
nr, er := src.Read(*buf)
|
|
if nr > 0 {
|
|
nw, ew := dst.Write((*buf)[0:nr])
|
|
if nw < 0 || nr < nw {
|
|
nw = 0
|
|
if ew == nil {
|
|
ew = errors.New("invalid write result")
|
|
}
|
|
}
|
|
written += int64(nw)
|
|
if ew != nil {
|
|
err = ew
|
|
break
|
|
}
|
|
if nr != nw {
|
|
err = io.ErrShortWrite
|
|
break
|
|
}
|
|
}
|
|
if er != nil {
|
|
if er != io.EOF {
|
|
err = er
|
|
}
|
|
break
|
|
}
|
|
}
|
|
return written, err
|
|
}
|