Skip to content

Commit 82276c6

Browse files
committed
Update network handler usages
1 parent 6d70ef9 commit 82276c6

6 files changed

Lines changed: 80 additions & 43 deletions

File tree

brutal.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"github.com/sagernet/sing/common"
88
"github.com/sagernet/sing/common/buf"
99
E "github.com/sagernet/sing/common/exceptions"
10-
"github.com/sagernet/sing/common/rw"
10+
"github.com/sagernet/sing/common/varbin"
1111
)
1212

1313
const (
@@ -32,7 +32,7 @@ func WriteBrutalResponse(writer io.Writer, receiveBPS uint64, ok bool, message s
3232
if ok {
3333
common.Must(binary.Write(buffer, binary.BigEndian, receiveBPS))
3434
} else {
35-
err := rw.WriteVString(buffer, message)
35+
err := varbin.Write(buffer, binary.BigEndian, message)
3636
if err != nil {
3737
return err
3838
}
@@ -52,7 +52,7 @@ func ReadBrutalResponse(reader io.Reader) (uint64, error) {
5252
return receiveBPS, err
5353
} else {
5454
var message string
55-
message, err = rw.ReadVString(reader)
55+
message, err = varbin.ReadValue[string](reader, binary.BigEndian)
5656
if err != nil {
5757
return 0, err
5858
}

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
module github.com/sagernet/sing-mux
22

3-
go 1.18
3+
go 1.20
44

55
require (
6-
github.com/hashicorp/yamux v0.1.1
7-
github.com/sagernet/sing v0.3.0
6+
github.com/hashicorp/yamux v0.1.2
7+
github.com/sagernet/sing v0.5.0-rc.4.0.20241020064342-b036e5c3ee02
88
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7
9-
golang.org/x/net v0.19.0
10-
golang.org/x/sys v0.16.0
9+
golang.org/x/net v0.30.0
10+
golang.org/x/sys v0.26.0
1111
)
1212

13-
require golang.org/x/text v0.14.0 // indirect
13+
require golang.org/x/text v0.19.0 // indirect

go.sum

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2-
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
3-
github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
2+
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
3+
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
44
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
55
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
6-
github.com/sagernet/sing v0.3.0 h1:PIDVFZHnQAAYRL1UYqNM+0k5s8f/tb1lUW6UDcQiOc8=
7-
github.com/sagernet/sing v0.3.0/go.mod h1:9pfuAH6mZfgnz/YjP6xu5sxx882rfyjpcrTdUpd6w3g=
6+
github.com/sagernet/sing v0.5.0-rc.4.0.20241020064342-b036e5c3ee02 h1:dbGXq6JHiizl+YC6V+zQYL0/+SXFh32s62kpy7XbTYU=
7+
github.com/sagernet/sing v0.5.0-rc.4.0.20241020064342-b036e5c3ee02/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
88
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
99
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
10-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
11-
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
12-
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
10+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
11+
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
12+
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
1313
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
14-
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
15-
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
16-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
17-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
14+
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
15+
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
16+
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
17+
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
1818
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

protocol.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
M "github.com/sagernet/sing/common/metadata"
1313
N "github.com/sagernet/sing/common/network"
1414
"github.com/sagernet/sing/common/rw"
15+
"github.com/sagernet/sing/common/varbin"
1516
)
1617

1718
const (
@@ -41,14 +42,18 @@ type Request struct {
4142
}
4243

4344
func ReadRequest(reader io.Reader) (*Request, error) {
44-
version, err := rw.ReadByte(reader)
45+
var (
46+
version byte
47+
protocol byte
48+
)
49+
err := binary.Read(reader, binary.BigEndian, &version)
4550
if err != nil {
4651
return nil, err
4752
}
4853
if version < Version0 || version > Version1 {
4954
return nil, E.New("unsupported version: ", version)
5055
}
51-
protocol, err := rw.ReadByte(reader)
56+
err = binary.Read(reader, binary.BigEndian, &protocol)
5257
if err != nil {
5358
return nil, err
5459
}
@@ -166,13 +171,12 @@ type StreamResponse struct {
166171

167172
func ReadStreamResponse(reader io.Reader) (*StreamResponse, error) {
168173
var response StreamResponse
169-
status, err := rw.ReadByte(reader)
174+
err := binary.Read(reader, binary.BigEndian, &response.Status)
170175
if err != nil {
171176
return nil, err
172177
}
173-
response.Status = status
174-
if status == statusError {
175-
response.Message, err = rw.ReadVString(reader)
178+
if response.Status == statusError {
179+
response.Message, err = varbin.ReadValue[string](reader, binary.BigEndian)
176180
if err != nil {
177181
return nil, err
178182
}

server.go

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,24 @@ import (
1313
"github.com/sagernet/sing/common/task"
1414
)
1515

16+
// Deprecated: Use ServiceHandlerEx instead.
17+
//
18+
//nolint:staticcheck
1619
type ServiceHandler interface {
1720
N.TCPConnectionHandler
1821
N.UDPConnectionHandler
1922
}
2023

24+
type ServiceHandlerEx interface {
25+
N.TCPConnectionHandlerEx
26+
N.UDPConnectionHandlerEx
27+
}
28+
2129
type Service struct {
2230
newStreamContext func(context.Context, net.Conn) context.Context
2331
logger logger.ContextLogger
2432
handler ServiceHandler
33+
handlerEx ServiceHandlerEx
2534
padding bool
2635
brutal BrutalOptions
2736
}
@@ -30,6 +39,7 @@ type ServiceOptions struct {
3039
NewStreamContext func(context.Context, net.Conn) context.Context
3140
Logger logger.ContextLogger
3241
Handler ServiceHandler
42+
HandlerEx ServiceHandlerEx
3343
Padding bool
3444
Brutal BrutalOptions
3545
}
@@ -42,12 +52,26 @@ func NewService(options ServiceOptions) (*Service, error) {
4252
newStreamContext: options.NewStreamContext,
4353
logger: options.Logger,
4454
handler: options.Handler,
55+
handlerEx: options.HandlerEx,
4556
padding: options.Padding,
4657
brutal: options.Brutal,
4758
}, nil
4859
}
4960

61+
// Deprecated: Use NewConnectionEx instead.
5062
func (s *Service) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
63+
return s.newConnection(ctx, conn, metadata.Source)
64+
}
65+
66+
func (s *Service) NewConnectionEx(ctx context.Context, conn net.Conn, source M.Socksaddr, destination M.Socksaddr, onClose N.CloseHandler) {
67+
err := s.newConnection(ctx, conn, source)
68+
if err != nil {
69+
N.CloseOnHandshakeFailure(conn, onClose, err)
70+
s.logger.ErrorContext(ctx, E.Cause(err, "process multiplex connection from ", source))
71+
}
72+
}
73+
74+
func (s *Service) newConnection(ctx context.Context, conn net.Conn, source M.Socksaddr) error {
5175
request, err := ReadRequest(conn)
5276
if err != nil {
5377
return err
@@ -71,9 +95,10 @@ func (s *Service) NewConnection(ctx context.Context, conn net.Conn, metadata M.M
7195
}
7296
streamCtx := s.newStreamContext(ctx, stream)
7397
go func() {
74-
hErr := s.newConnection(streamCtx, conn, stream, metadata)
98+
hErr := s.newSession(streamCtx, conn, stream, source)
7599
if hErr != nil {
76-
s.logger.ErrorContext(streamCtx, E.Cause(hErr, "handle connection"))
100+
stream.Close()
101+
s.logger.ErrorContext(streamCtx, E.Cause(hErr, "process multiplex stream"))
77102
}
78103
}()
79104
}
@@ -84,13 +109,13 @@ func (s *Service) NewConnection(ctx context.Context, conn net.Conn, metadata M.M
84109
return group.Run(ctx)
85110
}
86111

87-
func (s *Service) newConnection(ctx context.Context, sessionConn net.Conn, stream net.Conn, metadata M.Metadata) error {
112+
func (s *Service) newSession(ctx context.Context, sessionConn net.Conn, stream net.Conn, source M.Socksaddr) error {
88113
stream = &wrapStream{stream}
89114
request, err := ReadStreamRequest(stream)
90115
if err != nil {
91116
return E.Cause(err, "read multiplex stream request")
92117
}
93-
metadata.Destination = request.Destination
118+
destination := request.Destination
94119
if request.Network == N.NetworkTCP {
95120
conn := &serverConn{ExtendedConn: bufio.NewExtendedConn(stream)}
96121
if request.Destination.Fqdn == BrutalExchangeDomain {
@@ -128,20 +153,28 @@ func (s *Service) newConnection(ctx context.Context, sessionConn net.Conn, strea
128153
}
129154
return nil
130155
}
131-
s.logger.InfoContext(ctx, "inbound multiplex connection to ", metadata.Destination)
132-
s.handler.NewConnection(ctx, conn, metadata)
133-
stream.Close()
156+
s.logger.InfoContext(ctx, "inbound multiplex connection to ", destination)
157+
if s.handler != nil {
158+
//nolint:staticcheck
159+
s.handler.NewConnection(ctx, conn, M.Metadata{Source: source, Destination: destination})
160+
} else {
161+
s.handlerEx.NewConnectionEx(ctx, conn, source, destination, nil)
162+
}
134163
} else {
135164
var packetConn N.PacketConn
136165
if !request.PacketAddr {
137-
s.logger.InfoContext(ctx, "inbound multiplex packet connection to ", metadata.Destination)
166+
s.logger.InfoContext(ctx, "inbound multiplex packet connection to ", destination)
138167
packetConn = &serverPacketConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: request.Destination}
139168
} else {
140169
s.logger.InfoContext(ctx, "inbound multiplex packet connection")
141170
packetConn = &serverPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream)}
142171
}
143-
s.handler.NewPacketConnection(ctx, packetConn, metadata)
144-
stream.Close()
172+
if s.handler != nil {
173+
//nolint:staticcheck
174+
s.handler.NewPacketConnection(ctx, packetConn, M.Metadata{Source: source, Destination: destination})
175+
} else {
176+
s.handlerEx.NewPacketConnectionEx(ctx, packetConn, source, destination, nil)
177+
}
145178
}
146179
return nil
147180
}

server_conn.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/sagernet/sing/common/buf"
1111
M "github.com/sagernet/sing/common/metadata"
1212
N "github.com/sagernet/sing/common/network"
13-
"github.com/sagernet/sing/common/rw"
13+
"github.com/sagernet/sing/common/varbin"
1414
)
1515

1616
type serverConn struct {
@@ -24,11 +24,11 @@ func (c *serverConn) NeedHandshake() bool {
2424

2525
func (c *serverConn) HandshakeFailure(err error) error {
2626
errMessage := err.Error()
27-
buffer := buf.NewSize(1 + rw.UVariantLen(uint64(len(errMessage))) + len(errMessage))
27+
buffer := buf.NewSize(1 + varbin.UvarintLen(uint64(len(errMessage))) + len(errMessage))
2828
defer buffer.Release()
2929
common.Must(
3030
buffer.WriteByte(statusError),
31-
rw.WriteVString(buffer, errMessage),
31+
varbin.Write(buffer, binary.BigEndian, errMessage),
3232
)
3333
return common.Error(c.ExtendedConn.Write(buffer.Bytes()))
3434
}
@@ -88,11 +88,11 @@ func (c *serverPacketConn) NeedHandshake() bool {
8888

8989
func (c *serverPacketConn) HandshakeFailure(err error) error {
9090
errMessage := err.Error()
91-
buffer := buf.NewSize(1 + rw.UVariantLen(uint64(len(errMessage))) + len(errMessage))
91+
buffer := buf.NewSize(1 + varbin.UvarintLen(uint64(len(errMessage))) + len(errMessage))
9292
defer buffer.Release()
9393
common.Must(
9494
buffer.WriteByte(statusError),
95-
rw.WriteVString(buffer, errMessage),
95+
varbin.Write(buffer, binary.BigEndian, errMessage),
9696
)
9797
return common.Error(c.ExtendedConn.Write(buffer.Bytes()))
9898
}
@@ -188,11 +188,11 @@ func (c *serverPacketAddrConn) NeedHandshake() bool {
188188

189189
func (c *serverPacketAddrConn) HandshakeFailure(err error) error {
190190
errMessage := err.Error()
191-
buffer := buf.NewSize(1 + rw.UVariantLen(uint64(len(errMessage))) + len(errMessage))
191+
buffer := buf.NewSize(1 + varbin.UvarintLen(uint64(len(errMessage))) + len(errMessage))
192192
defer buffer.Release()
193193
common.Must(
194194
buffer.WriteByte(statusError),
195-
rw.WriteVString(buffer, errMessage),
195+
varbin.Write(buffer, binary.BigEndian, errMessage),
196196
)
197197
return common.Error(c.ExtendedConn.Write(buffer.Bytes()))
198198
}

0 commit comments

Comments
 (0)