Remove dead client SOCKS state and simplify session handling

This commit is contained in:
Amin.MasterkinG
2026-04-21 16:12:24 +03:30
parent 787bd90ffd
commit 8ef36418a0
5 changed files with 16 additions and 34 deletions
+2
View File
@@ -49,6 +49,8 @@ func (b *relayHeaderBuilder) Apply(req *http.Request) {
b.applyCDNProfile(req) b.applyCDNProfile(req)
case "api": case "api":
b.applyAPIProfile(req) b.applyAPIProfile(req)
case "minimal":
// Intentionally leave only the default request headers untouched.
} }
if b.cfg.HTTPRandomizeHeaders { if b.cfg.HTTPRandomizeHeaders {
-4
View File
@@ -448,7 +448,6 @@ func (c *Client) reclaimExpiredInFlight() {
} }
if dropped > 0 { if dropped > 0 {
socksConn.ConnectFailure = "max retry exceeded"
socksConn.CompleteConnect(fmt.Errorf("max retry exceeded")) socksConn.CompleteConnect(fmt.Errorf("max retry exceeded"))
socksConn.ResetTransportState() socksConn.ResetTransportState()
_ = socksConn.CloseLocal() _ = socksConn.CloseLocal()
@@ -467,7 +466,6 @@ func (c *Client) reclaimExpiredReorder() {
"<yellow>socks_id=<cyan>%d</cyan> inbound reorder gap expired, closing connection</yellow>", "<yellow>socks_id=<cyan>%d</cyan> inbound reorder gap expired, closing connection</yellow>",
socksConn.ID, socksConn.ID,
) )
socksConn.ConnectFailure = "inbound reorder timeout"
socksConn.ResetTransportState() socksConn.ResetTransportState()
_ = socksConn.CloseLocal() _ = socksConn.CloseLocal()
} }
@@ -654,7 +652,6 @@ func (c *Client) applyResponsePacket(packet protocol.Packet) error {
"<yellow>inbound reorder buffer overflow socks_id=<cyan>%d</cyan> type=<cyan>%s</cyan> seq=<cyan>%d</cyan></yellow>", "<yellow>inbound reorder buffer overflow socks_id=<cyan>%d</cyan> type=<cyan>%s</cyan> seq=<cyan>%d</cyan></yellow>",
socksConn.ID, packet.Type, packet.Sequence, socksConn.ID, packet.Type, packet.Sequence,
) )
socksConn.ConnectFailure = "inbound reorder overflow"
socksConn.ResetTransportState() socksConn.ResetTransportState()
_ = socksConn.CloseLocal() _ = socksConn.CloseLocal()
return nil return nil
@@ -710,7 +707,6 @@ func (c *Client) applyOrderedResponsePacket(socksConn *SOCKSConnection, packet p
} }
_ = socksConn.AckPacket(packet) _ = socksConn.AckPacket(packet)
socksConn.ConnectFailure = message
c.log.Warnf( c.log.Warnf(
"<yellow>connect failure applied socks_id=<cyan>%d</cyan> reason=<cyan>%s</cyan></yellow>", "<yellow>connect failure applied socks_id=<cyan>%d</cyan> reason=<cyan>%s</cyan></yellow>",
socksConn.ID, message, socksConn.ID, message,
+12 -12
View File
@@ -47,7 +47,7 @@ func TestSOCKSConnectionStoreDeleteClearsTransportState(t *testing.T) {
localConn, peerConn := net.Pipe() localConn, peerConn := net.Pipe()
defer peerConn.Close() defer peerConn.Close()
socksConn := store.New("client-session", "127.0.0.1:1000", chunkPolicy) socksConn := store.New("client-session", chunkPolicy)
socksConn.LocalConn = localConn socksConn.LocalConn = localConn
socksConn.BufferedBytes = len("initial-payload") socksConn.BufferedBytes = len("initial-payload")
@@ -179,9 +179,9 @@ func TestBuildNextBatchRotatesAcrossConnections(t *testing.T) {
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
conn1 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) conn1 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
conn2 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1002", client.chunkPolicy) conn2 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
conn3 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1003", client.chunkPolicy) conn3 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
for _, socksConn := range []*SOCKSConnection{conn1, conn2, conn3} { for _, socksConn := range []*SOCKSConnection{conn1, conn2, conn3} {
if err := socksConn.EnqueuePacket(socksConn.BuildSOCKSDataPacket([]byte("x"), false)); err != nil { if err := socksConn.EnqueuePacket(socksConn.BuildSOCKSDataPacket([]byte("x"), false)); err != nil {
@@ -213,8 +213,8 @@ func TestBuildNextBatchHonorsPerSOCKSPacketLimit(t *testing.T) {
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
conn1 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) conn1 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
conn2 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1002", client.chunkPolicy) conn2 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
if err := conn1.EnqueuePacket(conn1.BuildSOCKSDataPacket([]byte("a"), false)); err != nil { if err := conn1.EnqueuePacket(conn1.BuildSOCKSDataPacket([]byte("a"), false)); err != nil {
@@ -360,7 +360,7 @@ func TestBuildPollBatchSkipsWhenTransportBusy(t *testing.T) {
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
socksConn := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) socksConn := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
if err := socksConn.EnqueuePacket(socksConn.BuildSOCKSDataPacket([]byte("busy"), false)); err != nil { if err := socksConn.EnqueuePacket(socksConn.BuildSOCKSDataPacket([]byte("busy"), false)); err != nil {
t.Fatalf("enqueue packet: %v", err) t.Fatalf("enqueue packet: %v", err)
} }
@@ -375,7 +375,7 @@ func TestBuildPollBatchAllowsOnlySinglePingInFlight(t *testing.T) {
cfg := testClientConfig() cfg := testClientConfig()
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
client.noteMeaningfulActivity(time.Now().Add(-10 * time.Second)) client.noteMeaningfulActivity(time.Now().Add(-10 * time.Second))
batch, ok := client.buildPollBatch(client.socksConnections.Snapshot(), 0) batch, ok := client.buildPollBatch(client.socksConnections.Snapshot(), 0)
@@ -418,7 +418,7 @@ func TestShouldSendPingWhenIdleIntervalHasElapsed(t *testing.T) {
cfg := testClientConfig() cfg := testClientConfig()
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
now := time.Now() now := time.Now()
client.nextPingDueUnixMS.Store(now.Add(-2 * time.Second).UnixMilli()) client.nextPingDueUnixMS.Store(now.Add(-2 * time.Second).UnixMilli())
@@ -431,7 +431,7 @@ func TestShouldNotSendPingBeforeIdleInterval(t *testing.T) {
cfg := testClientConfig() cfg := testClientConfig()
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
now := time.Now() now := time.Now()
client.nextPingDueUnixMS.Store(now.Add(500 * time.Millisecond).UnixMilli()) client.nextPingDueUnixMS.Store(now.Add(500 * time.Millisecond).UnixMilli())
@@ -444,7 +444,7 @@ func TestShouldSendPingWithOnlyInFlightPackets(t *testing.T) {
cfg := testClientConfig() cfg := testClientConfig()
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
socksConn := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) socksConn := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
packet := socksConn.BuildSOCKSDataPacket([]byte("hello"), false) packet := socksConn.BuildSOCKSDataPacket([]byte("hello"), false)
item := &SOCKSOutboundQueueItem{ item := &SOCKSOutboundQueueItem{
@@ -595,7 +595,7 @@ func TestInboundReorderAllowsCloseReadAndCloseWriteOnSameSequence(t *testing.T)
client := New(cfg, nil) client := New(cfg, nil)
client.chunkPolicy = newChunkPolicy(cfg) client.chunkPolicy = newChunkPolicy(cfg)
socksConn := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) socksConn := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy)
socksConn.ConnectAccepted = true socksConn.ConnectAccepted = true
closeWrite := protocol.NewPacket(client.clientSessionKey, protocol.PacketTypeSOCKSCloseWrite) closeWrite := protocol.NewPacket(client.clientSessionKey, protocol.PacketTypeSOCKSCloseWrite)
+1 -15
View File
@@ -54,20 +54,13 @@ type SOCKSConnection struct {
ChunkPolicy ChunkPolicy ChunkPolicy ChunkPolicy
CreatedAt time.Time CreatedAt time.Time
LastActivityAt time.Time LastActivityAt time.Time
ClientAddress string
TargetHost string TargetHost string
TargetPort uint16 TargetPort uint16
TargetAddressType byte TargetAddressType byte
BufferedBytes int BufferedBytes int
NextSequence uint64 NextSequence uint64
SOCKSAuthMethod byte SOCKSAuthMethod byte
SOCKSUsername string
HandshakeDone bool
ConnectAccepted bool ConnectAccepted bool
ConnectFailure string
CloseReadSent bool
CloseWriteSent bool
ResetSent bool
LocalConn net.Conn LocalConn net.Conn
localWriteMu sync.Mutex localWriteMu sync.Mutex
@@ -98,7 +91,7 @@ func NewSOCKSConnectionStore() *SOCKSConnectionStore {
} }
} }
func (s *SOCKSConnectionStore) New(clientSessionKey string, clientAddress string, chunkPolicy ChunkPolicy) *SOCKSConnection { func (s *SOCKSConnectionStore) New(clientSessionKey string, chunkPolicy ChunkPolicy) *SOCKSConnection {
id := s.nextID.Add(1) id := s.nextID.Add(1)
now := time.Now() now := time.Now()
socksConn := &SOCKSConnection{ socksConn := &SOCKSConnection{
@@ -107,7 +100,6 @@ func (s *SOCKSConnectionStore) New(clientSessionKey string, clientAddress string
ChunkPolicy: chunkPolicy, ChunkPolicy: chunkPolicy,
CreatedAt: now, CreatedAt: now,
LastActivityAt: now, LastActivityAt: now,
ClientAddress: clientAddress,
closedC: make(chan struct{}), closedC: make(chan struct{}),
connectResultC: make(chan error, 1), connectResultC: make(chan error, 1),
InFlight: make(map[string]*SOCKSOutboundQueueItem), InFlight: make(map[string]*SOCKSOutboundQueueItem),
@@ -169,8 +161,6 @@ func (s *SOCKSConnection) BuildSOCKSDataPacket(payload []byte, final bool) proto
} }
func (s *SOCKSConnection) BuildSOCKSCloseReadPacket() protocol.Packet { func (s *SOCKSConnection) BuildSOCKSCloseReadPacket() protocol.Packet {
s.CloseReadSent = true
packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSCloseRead) packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSCloseRead)
packet.SOCKSID = s.ID packet.SOCKSID = s.ID
packet.Sequence = s.nextSequence() packet.Sequence = s.nextSequence()
@@ -179,8 +169,6 @@ func (s *SOCKSConnection) BuildSOCKSCloseReadPacket() protocol.Packet {
} }
func (s *SOCKSConnection) BuildSOCKSCloseWritePacket() protocol.Packet { func (s *SOCKSConnection) BuildSOCKSCloseWritePacket() protocol.Packet {
s.CloseWriteSent = true
packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSCloseWrite) packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSCloseWrite)
packet.SOCKSID = s.ID packet.SOCKSID = s.ID
packet.Sequence = s.nextSequence() packet.Sequence = s.nextSequence()
@@ -189,8 +177,6 @@ func (s *SOCKSConnection) BuildSOCKSCloseWritePacket() protocol.Packet {
} }
func (s *SOCKSConnection) BuildSOCKSRSTPacket() protocol.Packet { func (s *SOCKSConnection) BuildSOCKSRSTPacket() protocol.Packet {
s.ResetSent = true
packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSRST) packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSRST)
packet.SOCKSID = s.ID packet.SOCKSID = s.ID
packet.Sequence = s.nextSequence() packet.Sequence = s.nextSequence()
+1 -3
View File
@@ -46,7 +46,7 @@ func (c *Client) handleConn(ctx context.Context, conn net.Conn) {
defer c.unregisterConn(conn) defer c.unregisterConn(conn)
defer conn.Close() defer conn.Close()
socksConn := c.socksConnections.New(c.clientSessionKey, conn.RemoteAddr().String(), c.chunkPolicy) socksConn := c.socksConnections.New(c.clientSessionKey, c.chunkPolicy)
socksConn.LocalConn = conn socksConn.LocalConn = conn
defer c.socksConnections.Delete(socksConn.ID) defer c.socksConnections.Delete(socksConn.ID)
@@ -90,7 +90,6 @@ func (c *Client) handleSOCKS5(ctx context.Context, conn net.Conn, socksConn *SOC
socksConn.TargetPort = targetPort socksConn.TargetPort = targetPort
socksConn.TargetAddressType = atyp socksConn.TargetAddressType = atyp
socksConn.ConnectAccepted = true socksConn.ConnectAccepted = true
socksConn.HandshakeDone = true
socksConn.LastActivityAt = time.Now() socksConn.LastActivityAt = time.Now()
c.log.Infof( c.log.Infof(
@@ -174,7 +173,6 @@ func (c *Client) handleUserPassAuth(conn net.Conn, socksConn *SOCKSConnection) e
} }
ok := string(username) == c.cfg.SOCKSUsername && string(password) == c.cfg.SOCKSPassword ok := string(username) == c.cfg.SOCKSUsername && string(password) == c.cfg.SOCKSPassword
socksConn.SOCKSUsername = string(username)
if ok { if ok {
_, err := conn.Write([]byte{socksUserPassVersion, socksAuthSuccess}) _, err := conn.Write([]byte{socksUserPassVersion, socksAuthSuccess})
return err return err