From aefb9cd7ae2561b1184ae5c4363a47251a051f22 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Thu, 22 Oct 2020 19:42:42 +0800 Subject: [PATCH] proxy: enable splice in relay when using proxy.Conn --- README.md | 2 +- config.go | 2 +- config/glider.conf.example | 2 +- go.mod | 3 +-- go.sum | 7 +++---- proxy/conn.go | 26 ++++++++++++++------------ proxy/ws/frame.go | 2 +- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 6f7906f..28f2c1c 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,7 @@ Websocket client scheme: ws://host:port[/path][?host=HOST] Websocket server scheme: - ws://:port[/path]?host=HOST + ws://:port[/path][?host=HOST] Websocket with a specified proxy protocol: ws://host:port[/path][?host=HOST],scheme:// diff --git a/config.go b/config.go index 5ee3125..d27259f 100644 --- a/config.go +++ b/config.go @@ -210,7 +210,7 @@ func usage() { fmt.Fprintf(w, "\n") fmt.Fprintf(w, "Websocket server scheme:\n") - fmt.Fprintf(w, " ws://:port[/path]?host=HOST\n") + fmt.Fprintf(w, " ws://:port[/path][?host=HOST]\n") fmt.Fprintf(w, "\n") fmt.Fprintf(w, "Websocket with a specified proxy protocol:\n") diff --git a/config/glider.conf.example b/config/glider.conf.example index 063b344..8c0b574 100644 --- a/config/glider.conf.example +++ b/config/glider.conf.example @@ -138,7 +138,7 @@ listen=socks5://:1080 # forward=tls://server.com:443,vmess://5a146038-0b56-4e95-b1dc-5c6f5a32cd98@?alterID=2 # vmess over websocket -# forward=ws://server.com:80/path,vmess://chacha20-poly1305:5a146038-0b56-4e95-b1dc-5c6f5a32cd98@?alterID=2 +# forward=ws://1.1.1.1:80/path?host=server.com,vmess://chacha20-poly1305:5a146038-0b56-4e95-b1dc-5c6f5a32cd98@?alterID=2 # vmess over ws over tls # forward=tls://server.com:443,ws://,vmess://5a146038-0b56-4e95-b1dc-5c6f5a32cd98@?alterID=2 diff --git a/go.mod b/go.mod index aa23020..7cd8d6a 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,8 @@ require ( github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/xtaci/kcp-go/v5 v5.6.1 golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 - golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a // indirect - golang.org/x/tools v0.0.0-20201021000207-d49c4edd7d96 // indirect + golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect ) diff --git a/go.sum b/go.sum index 93a5ba0..e97b327 100644 --- a/go.sum +++ b/go.sum @@ -139,13 +139,12 @@ golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -177,8 +176,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU= golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201021000207-d49c4edd7d96 h1:K+nJoPcImWk+ZGPHOKkDocKcQPACCz8usiCiVQYfXsk= -golang.org/x/tools v0.0.0-20201021000207-d49c4edd7d96/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9 h1:sEvmEcJVKBNUvgCUClbUQeHOAa9U0I2Ce1BooMvVCY4= +golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= diff --git a/proxy/conn.go b/proxy/conn.go index 7069f90..4aac230 100644 --- a/proxy/conn.go +++ b/proxy/conn.go @@ -34,19 +34,13 @@ func NewConn(c net.Conn) *Conn { return &Conn{bufio.NewReader(c), c} } -// Peek returns the next n bytes without advancing the reader. -func (c *Conn) Peek(n int) ([]byte, error) { - return c.r.Peek(n) -} - -func (c *Conn) Read(p []byte) (int, error) { - return c.r.Read(p) -} - // Reader returns the internal bufio.Reader. -func (c *Conn) Reader() *bufio.Reader { - return c.r -} +func (c *Conn) Reader() *bufio.Reader { return c.r } + +// Peek returns the next n bytes without advancing the reader. +func (c *Conn) Peek(n int) ([]byte, error) { return c.r.Peek(n) } +func (c *Conn) Read(p []byte) (int, error) { return c.r.Read(p) } +func (c *Conn) WriteTo(w io.Writer) (n int64, err error) { return c.r.WriteTo(w) } // Relay relays between left and right. func Relay(left, right net.Conn) error { @@ -93,6 +87,13 @@ func worthReadFrom(src io.Reader) bool { } } +func underlyingWriter(c io.Writer) io.Writer { + if wrap, ok := c.(*Conn); ok { + return wrap.Conn + } + return c +} + // Copy copies from src to dst. // it will try to avoid memory allocating by using WriteTo or ReadFrom method, // if both failed, then it'll fallback to call CopyBuffer method. @@ -100,6 +101,7 @@ func Copy(dst io.Writer, src io.Reader) (written int64, err error) { if wt, ok := src.(io.WriterTo); ok { return wt.WriteTo(dst) } + dst = underlyingWriter(dst) if rt, ok := dst.(io.ReaderFrom); ok && worthReadFrom(src) { return rt.ReadFrom(src) } diff --git a/proxy/ws/frame.go b/proxy/ws/frame.go index 7c85f9e..ae9174c 100644 --- a/proxy/ws/frame.go +++ b/proxy/ws/frame.go @@ -90,7 +90,7 @@ func (w *frameWriter) Write(b []byte) (int, error) { } buf := pool.GetBuffer(nPayload) - pool.PutBuffer(buf) + defer pool.PutBuffer(buf) // mask _, err = w.Writer.Write(w.maskKey[:])