Compare commits

..

4 Commits

Author SHA1 Message Date
世界
e3f8567690 documentation: Bump version 2024-01-02 14:31:53 +08:00
世界
40c7f3e170 Fix geoip close 2024-01-02 14:31:23 +08:00
世界
c506255e0f Fix grpc lite transport encoding 2024-01-01 16:16:58 +08:00
世界
87c6fd4c0f Fix h2mux request context 2024-01-01 16:15:49 +08:00
6 changed files with 31 additions and 22 deletions

View File

@@ -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()
}

View File

@@ -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
View File

@@ -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
View File

@@ -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=

View File

@@ -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")
}) })
} }

View File

@@ -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 {