From 8ef36418a07d1434435174ae4b8961502325eb9d Mon Sep 17 00:00:00 2001 From: "Amin.MasterkinG" Date: Tue, 21 Apr 2026 16:12:24 +0330 Subject: [PATCH] Remove dead client SOCKS state and simplify session handling --- internal/client/http_headers.go | 2 ++ internal/client/sender_workers.go | 4 ---- internal/client/sender_workers_test.go | 24 ++++++++++++------------ internal/client/session.go | 16 +--------------- internal/client/socks5.go | 4 +--- 5 files changed, 16 insertions(+), 34 deletions(-) diff --git a/internal/client/http_headers.go b/internal/client/http_headers.go index ec40330..6be4be0 100644 --- a/internal/client/http_headers.go +++ b/internal/client/http_headers.go @@ -49,6 +49,8 @@ func (b *relayHeaderBuilder) Apply(req *http.Request) { b.applyCDNProfile(req) case "api": b.applyAPIProfile(req) + case "minimal": + // Intentionally leave only the default request headers untouched. } if b.cfg.HTTPRandomizeHeaders { diff --git a/internal/client/sender_workers.go b/internal/client/sender_workers.go index 852b8bf..a022594 100644 --- a/internal/client/sender_workers.go +++ b/internal/client/sender_workers.go @@ -448,7 +448,6 @@ func (c *Client) reclaimExpiredInFlight() { } if dropped > 0 { - socksConn.ConnectFailure = "max retry exceeded" socksConn.CompleteConnect(fmt.Errorf("max retry exceeded")) socksConn.ResetTransportState() _ = socksConn.CloseLocal() @@ -467,7 +466,6 @@ func (c *Client) reclaimExpiredReorder() { "socks_id=%d inbound reorder gap expired, closing connection", socksConn.ID, ) - socksConn.ConnectFailure = "inbound reorder timeout" socksConn.ResetTransportState() _ = socksConn.CloseLocal() } @@ -654,7 +652,6 @@ func (c *Client) applyResponsePacket(packet protocol.Packet) error { "inbound reorder buffer overflow socks_id=%d type=%s seq=%d", socksConn.ID, packet.Type, packet.Sequence, ) - socksConn.ConnectFailure = "inbound reorder overflow" socksConn.ResetTransportState() _ = socksConn.CloseLocal() return nil @@ -710,7 +707,6 @@ func (c *Client) applyOrderedResponsePacket(socksConn *SOCKSConnection, packet p } _ = socksConn.AckPacket(packet) - socksConn.ConnectFailure = message c.log.Warnf( "connect failure applied socks_id=%d reason=%s", socksConn.ID, message, diff --git a/internal/client/sender_workers_test.go b/internal/client/sender_workers_test.go index df165d1..202a7e9 100644 --- a/internal/client/sender_workers_test.go +++ b/internal/client/sender_workers_test.go @@ -47,7 +47,7 @@ func TestSOCKSConnectionStoreDeleteClearsTransportState(t *testing.T) { localConn, peerConn := net.Pipe() defer peerConn.Close() - socksConn := store.New("client-session", "127.0.0.1:1000", chunkPolicy) + socksConn := store.New("client-session", chunkPolicy) socksConn.LocalConn = localConn socksConn.BufferedBytes = len("initial-payload") @@ -179,9 +179,9 @@ func TestBuildNextBatchRotatesAcrossConnections(t *testing.T) { client := New(cfg, nil) client.chunkPolicy = newChunkPolicy(cfg) - conn1 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) - conn2 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1002", client.chunkPolicy) - conn3 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1003", client.chunkPolicy) + conn1 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy) + conn2 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy) + conn3 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy) for _, socksConn := range []*SOCKSConnection{conn1, conn2, conn3} { 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.chunkPolicy = newChunkPolicy(cfg) - conn1 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1001", client.chunkPolicy) - conn2 := client.socksConnections.New(client.clientSessionKey, "127.0.0.1:1002", client.chunkPolicy) + conn1 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy) + conn2 := client.socksConnections.New(client.clientSessionKey, client.chunkPolicy) for i := 0; i < 3; i++ { 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.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 { t.Fatalf("enqueue packet: %v", err) } @@ -375,7 +375,7 @@ func TestBuildPollBatchAllowsOnlySinglePingInFlight(t *testing.T) { cfg := testClientConfig() client := New(cfg, nil) 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)) batch, ok := client.buildPollBatch(client.socksConnections.Snapshot(), 0) @@ -418,7 +418,7 @@ func TestShouldSendPingWhenIdleIntervalHasElapsed(t *testing.T) { cfg := testClientConfig() client := New(cfg, nil) 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() client.nextPingDueUnixMS.Store(now.Add(-2 * time.Second).UnixMilli()) @@ -431,7 +431,7 @@ func TestShouldNotSendPingBeforeIdleInterval(t *testing.T) { cfg := testClientConfig() client := New(cfg, nil) 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() client.nextPingDueUnixMS.Store(now.Add(500 * time.Millisecond).UnixMilli()) @@ -444,7 +444,7 @@ func TestShouldSendPingWithOnlyInFlightPackets(t *testing.T) { cfg := testClientConfig() client := New(cfg, nil) 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) item := &SOCKSOutboundQueueItem{ @@ -595,7 +595,7 @@ func TestInboundReorderAllowsCloseReadAndCloseWriteOnSameSequence(t *testing.T) client := New(cfg, nil) 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 closeWrite := protocol.NewPacket(client.clientSessionKey, protocol.PacketTypeSOCKSCloseWrite) diff --git a/internal/client/session.go b/internal/client/session.go index 3a08006..5743671 100644 --- a/internal/client/session.go +++ b/internal/client/session.go @@ -54,20 +54,13 @@ type SOCKSConnection struct { ChunkPolicy ChunkPolicy CreatedAt time.Time LastActivityAt time.Time - ClientAddress string TargetHost string TargetPort uint16 TargetAddressType byte BufferedBytes int NextSequence uint64 SOCKSAuthMethod byte - SOCKSUsername string - HandshakeDone bool ConnectAccepted bool - ConnectFailure string - CloseReadSent bool - CloseWriteSent bool - ResetSent bool LocalConn net.Conn 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) now := time.Now() socksConn := &SOCKSConnection{ @@ -107,7 +100,6 @@ func (s *SOCKSConnectionStore) New(clientSessionKey string, clientAddress string ChunkPolicy: chunkPolicy, CreatedAt: now, LastActivityAt: now, - ClientAddress: clientAddress, closedC: make(chan struct{}), connectResultC: make(chan error, 1), InFlight: make(map[string]*SOCKSOutboundQueueItem), @@ -169,8 +161,6 @@ func (s *SOCKSConnection) BuildSOCKSDataPacket(payload []byte, final bool) proto } func (s *SOCKSConnection) BuildSOCKSCloseReadPacket() protocol.Packet { - s.CloseReadSent = true - packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSCloseRead) packet.SOCKSID = s.ID packet.Sequence = s.nextSequence() @@ -179,8 +169,6 @@ func (s *SOCKSConnection) BuildSOCKSCloseReadPacket() protocol.Packet { } func (s *SOCKSConnection) BuildSOCKSCloseWritePacket() protocol.Packet { - s.CloseWriteSent = true - packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSCloseWrite) packet.SOCKSID = s.ID packet.Sequence = s.nextSequence() @@ -189,8 +177,6 @@ func (s *SOCKSConnection) BuildSOCKSCloseWritePacket() protocol.Packet { } func (s *SOCKSConnection) BuildSOCKSRSTPacket() protocol.Packet { - s.ResetSent = true - packet := protocol.NewPacket(s.ClientSessionKey, protocol.PacketTypeSOCKSRST) packet.SOCKSID = s.ID packet.Sequence = s.nextSequence() diff --git a/internal/client/socks5.go b/internal/client/socks5.go index cc3dbfa..eac8d87 100644 --- a/internal/client/socks5.go +++ b/internal/client/socks5.go @@ -46,7 +46,7 @@ func (c *Client) handleConn(ctx context.Context, conn net.Conn) { defer c.unregisterConn(conn) 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 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.TargetAddressType = atyp socksConn.ConnectAccepted = true - socksConn.HandshakeDone = true socksConn.LastActivityAt = time.Now() 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 - socksConn.SOCKSUsername = string(username) if ok { _, err := conn.Write([]byte{socksUserPassVersion, socksAuthSuccess}) return err