Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3f8567690 | ||
|
|
40c7f3e170 | ||
|
|
c506255e0f | ||
|
|
87c6fd4c0f |
@@ -32,3 +32,7 @@ func (r *Reader) Lookup(addr netip.Addr) string {
|
|||||||
}
|
}
|
||||||
return "unknown"
|
return "unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Reader) Close() error {
|
||||||
|
return r.reader.Close()
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ icon: material/alert-decagram
|
|||||||
|
|
||||||
# ChangeLog
|
# ChangeLog
|
||||||
|
|
||||||
|
#### 1.7.8
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
#### 1.7.7
|
#### 1.7.7
|
||||||
|
|
||||||
* Fix V2Ray transport `path` validation behavior **1**
|
* Fix V2Ray transport `path` validation behavior **1**
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -28,7 +28,7 @@ require (
|
|||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691
|
||||||
github.com/sagernet/sing v0.2.20
|
github.com/sagernet/sing v0.2.20
|
||||||
github.com/sagernet/sing-dns v0.1.12
|
github.com/sagernet/sing-dns v0.1.12
|
||||||
github.com/sagernet/sing-mux v0.1.6
|
github.com/sagernet/sing-mux v0.1.7
|
||||||
github.com/sagernet/sing-quic v0.1.6
|
github.com/sagernet/sing-quic v0.1.6
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.6
|
github.com/sagernet/sing-shadowsocks v0.2.6
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.1.5
|
github.com/sagernet/sing-shadowsocks2 v0.1.5
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -114,8 +114,8 @@ github.com/sagernet/sing v0.2.20 h1:ckcCB/5xu8G8wElNeH74IF6Soac5xWN+eQUXRuonjPQ=
|
|||||||
github.com/sagernet/sing v0.2.20/go.mod h1:Ce5LNojQOgOiWhiD8pPD6E9H7e2KgtOe3Zxx4Ou5u80=
|
github.com/sagernet/sing v0.2.20/go.mod h1:Ce5LNojQOgOiWhiD8pPD6E9H7e2KgtOe3Zxx4Ou5u80=
|
||||||
github.com/sagernet/sing-dns v0.1.12 h1:1HqZ+ln+Rezx/aJMStaS0d7oPeX2EobSV1NT537kyj4=
|
github.com/sagernet/sing-dns v0.1.12 h1:1HqZ+ln+Rezx/aJMStaS0d7oPeX2EobSV1NT537kyj4=
|
||||||
github.com/sagernet/sing-dns v0.1.12/go.mod h1:rx/DTOisneQpCgNQ4jbFU/JNEtnz0lYcHXenlVzpjEU=
|
github.com/sagernet/sing-dns v0.1.12/go.mod h1:rx/DTOisneQpCgNQ4jbFU/JNEtnz0lYcHXenlVzpjEU=
|
||||||
github.com/sagernet/sing-mux v0.1.6 h1:9+LsHgrtG/hgKpJOhtGcEFPeWHXaWeJDO3x4DeDQk5g=
|
github.com/sagernet/sing-mux v0.1.7 h1:+48spVReBwIrv6ZdUujiRFCCnblZFwxmbPgrs5zezlI=
|
||||||
github.com/sagernet/sing-mux v0.1.6/go.mod h1:UmcVSPrVjsOGe95jDXmGgOyKKIXOcjz6FKbFy+0LeDU=
|
github.com/sagernet/sing-mux v0.1.7/go.mod h1:UmcVSPrVjsOGe95jDXmGgOyKKIXOcjz6FKbFy+0LeDU=
|
||||||
github.com/sagernet/sing-quic v0.1.6 h1:yNkZiNOlmEGpS+A7I4/Zavhe/fRrLz7yCO/dVMZzt+k=
|
github.com/sagernet/sing-quic v0.1.6 h1:yNkZiNOlmEGpS+A7I4/Zavhe/fRrLz7yCO/dVMZzt+k=
|
||||||
github.com/sagernet/sing-quic v0.1.6/go.mod h1:g1Ogcy2KSwKvC7eDXEUu9AnHbjotC+2xsSP+A1i/VOA=
|
github.com/sagernet/sing-quic v0.1.6/go.mod h1:g1Ogcy2KSwKvC7eDXEUu9AnHbjotC+2xsSP+A1i/VOA=
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.6 h1:xr7ylAS/q1cQYS8oxKKajhuQcchd5VJJ4K4UZrrpp0s=
|
github.com/sagernet/sing-shadowsocks v0.2.6 h1:xr7ylAS/q1cQYS8oxKKajhuQcchd5VJJ4K4UZrrpp0s=
|
||||||
|
|||||||
@@ -535,7 +535,7 @@ func (r *Router) Close() error {
|
|||||||
}
|
}
|
||||||
if r.geoIPReader != nil {
|
if r.geoIPReader != nil {
|
||||||
r.logger.Trace("closing geoip reader")
|
r.logger.Trace("closing geoip reader")
|
||||||
err = E.Append(err, common.Close(r.geoIPReader), func(err error) error {
|
err = E.Append(err, r.geoIPReader.Close(), func(err error) error {
|
||||||
return E.Cause(err, "close geoip reader")
|
return E.Cause(err, "close geoip reader")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,19 +2,16 @@ package v2raygrpclite
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
std_bufio "bufio"
|
std_bufio "bufio"
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
"github.com/sagernet/sing/common/baderror"
|
"github.com/sagernet/sing/common/baderror"
|
||||||
"github.com/sagernet/sing/common/buf"
|
"github.com/sagernet/sing/common/buf"
|
||||||
"github.com/sagernet/sing/common/bufio"
|
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
"github.com/sagernet/sing/common/rw"
|
"github.com/sagernet/sing/common/rw"
|
||||||
)
|
)
|
||||||
@@ -30,7 +27,6 @@ type GunConn struct {
|
|||||||
create chan struct{}
|
create chan struct{}
|
||||||
err error
|
err error
|
||||||
readRemaining int
|
readRemaining int
|
||||||
writeAccess sync.Mutex
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newGunConn(reader io.Reader, writer io.Writer, flusher http.Flusher) *GunConn {
|
func newGunConn(reader io.Reader, writer io.Writer, flusher http.Flusher) *GunConn {
|
||||||
@@ -100,19 +96,22 @@ func (c *GunConn) read(b []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *GunConn) Write(b []byte) (n int, err error) {
|
func (c *GunConn) Write(b []byte) (n int, err error) {
|
||||||
protobufHeader := [1 + binary.MaxVarintLen64]byte{0x0A}
|
varLen := rw.UVariantLen(uint64(len(b)))
|
||||||
varuintLen := binary.PutUvarint(protobufHeader[1:], uint64(len(b)))
|
buffer := buf.NewSize(6 + varLen + len(b))
|
||||||
grpcHeader := buf.Get(5)
|
header := buffer.Extend(6 + varLen)
|
||||||
grpcPayloadLen := uint32(1 + varuintLen + len(b))
|
header[0] = 0x00
|
||||||
binary.BigEndian.PutUint32(grpcHeader[1:5], grpcPayloadLen)
|
binary.BigEndian.PutUint32(header[1:5], uint32(1+varLen+len(b)))
|
||||||
c.writeAccess.Lock()
|
header[5] = 0x0A
|
||||||
_, err = bufio.Copy(c.writer, io.MultiReader(bytes.NewReader(grpcHeader), bytes.NewReader(protobufHeader[:varuintLen+1]), bytes.NewReader(b)))
|
binary.PutUvarint(header[6:], uint64(len(b)))
|
||||||
c.writeAccess.Unlock()
|
common.Must1(buffer.Write(b))
|
||||||
buf.Put(grpcHeader)
|
_, err = c.writer.Write(buffer.Bytes())
|
||||||
if err == nil && c.flusher != nil {
|
if err != nil {
|
||||||
|
return 0, baderror.WrapH2(err)
|
||||||
|
}
|
||||||
|
if c.flusher != nil {
|
||||||
c.flusher.Flush()
|
c.flusher.Flush()
|
||||||
}
|
}
|
||||||
return len(b), baderror.WrapH2(err)
|
return len(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GunConn) WriteBuffer(buffer *buf.Buffer) error {
|
func (c *GunConn) WriteBuffer(buffer *buf.Buffer) error {
|
||||||
@@ -120,16 +119,18 @@ func (c *GunConn) WriteBuffer(buffer *buf.Buffer) error {
|
|||||||
dataLen := buffer.Len()
|
dataLen := buffer.Len()
|
||||||
varLen := rw.UVariantLen(uint64(dataLen))
|
varLen := rw.UVariantLen(uint64(dataLen))
|
||||||
header := buffer.ExtendHeader(6 + varLen)
|
header := buffer.ExtendHeader(6 + varLen)
|
||||||
_ = header[6]
|
|
||||||
header[0] = 0x00
|
header[0] = 0x00
|
||||||
binary.BigEndian.PutUint32(header[1:5], uint32(1+varLen+dataLen))
|
binary.BigEndian.PutUint32(header[1:5], uint32(1+varLen+dataLen))
|
||||||
header[5] = 0x0A
|
header[5] = 0x0A
|
||||||
binary.PutUvarint(header[6:], uint64(dataLen))
|
binary.PutUvarint(header[6:], uint64(dataLen))
|
||||||
err := rw.WriteBytes(c.writer, buffer.Bytes())
|
err := rw.WriteBytes(c.writer, buffer.Bytes())
|
||||||
if err == nil && c.flusher != nil {
|
if err != nil {
|
||||||
|
return baderror.WrapH2(err)
|
||||||
|
}
|
||||||
|
if c.flusher != nil {
|
||||||
c.flusher.Flush()
|
c.flusher.Flush()
|
||||||
}
|
}
|
||||||
return baderror.WrapH2(err)
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GunConn) FrontHeadroom() int {
|
func (c *GunConn) FrontHeadroom() int {
|
||||||
|
|||||||
Reference in New Issue
Block a user