diff --git a/node/proxy.go b/node/proxy.go index 126ed02232e3b70692ff8a5ac0941447c19a2134..2baa027549c7263f6595992f16811bbb130576d1 100644 --- a/node/proxy.go +++ b/node/proxy.go @@ -57,13 +57,13 @@ type wrappedWriter interface { // instrumentation. func doIcecastProxy(rw http.ResponseWriter, req *http.Request, target *url.URL, streamName string) { log.Printf("proxy: in=%s out=%s stream=%s", req.URL.String(), target.String(), streamName) + outreq := new(http.Request) *outreq = *req // includes shallow copies of maps, but okay // Make a HTTP/1.0 connection to the backend. outreq.URL.Scheme = target.Scheme outreq.URL.Host = target.Host - //outreq.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) outreq.URL.Path = target.Path outreq.Proto = "HTTP/1.0" outreq.ProtoMajor = 1 @@ -150,7 +150,7 @@ func doIcecastProxy(rw http.ResponseWriter, req *http.Request, target *url.URL, // Copy data between two network connections. On recent Go versions // (>1.11), this is quite fast as io.CopyBuffer uses the splice() // system call internally (in exchange we lose the ability to figure -// out which connection is the source of the error). +// out which end of the connection is the source of the error). func copyStream(tag string, out, in *net.TCPConn, promCounter prometheus.Counter, cntr *uint64) { buf := getBuf() defer releaseBuf(buf) @@ -164,22 +164,13 @@ func copyStream(tag string, out, in *net.TCPConn, promCounter prometheus.Counter defer in.Close() //nolint defer out.Close() //nolint - for { - n, err := io.CopyBuffer(out, in, buf) - promCounter.Add(float64(n)) - if cntr != nil { - atomic.AddUint64(cntr, uint64(n)) - } - if err != nil { - if !isCloseError(err) { - log.Printf("http: proxy error (%s): %v", tag, err) - } - return - } - if n == 0 { - log.Printf("http: proxy got 0 bytes from splice()") - return - } + n, err := io.CopyBuffer(out, in, buf) + promCounter.Add(float64(n)) + if cntr != nil { + atomic.AddUint64(cntr, uint64(n)) + } + if err != nil && !isCloseError(err) { + log.Printf("http: proxy error (%s): %v", tag, err) } } @@ -216,8 +207,8 @@ func handleProxy(conn *net.TCPConn, upstream *net.TCPConn, streamName string) { // Implementation of a simple buffer cache, to minimize large // allocations at runtime. const ( - bufSize = 8192 - bufPoolSize = 512 + bufSize = 4096 + bufPoolSize = 128 ) var bufPool chan []byte