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)
case "api":
b.applyAPIProfile(req)
case "minimal":
// Intentionally leave only the default request headers untouched.
}
if b.cfg.HTTPRandomizeHeaders {
-4
View File
@@ -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() {
"<yellow>socks_id=<cyan>%d</cyan> inbound reorder gap expired, closing connection</yellow>",
socksConn.ID,
)
socksConn.ConnectFailure = "inbound reorder timeout"
socksConn.ResetTransportState()
_ = 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>",
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(
"<yellow>connect failure applied socks_id=<cyan>%d</cyan> reason=<cyan>%s</cyan></yellow>",
socksConn.ID, message,
+12 -12
View File
@@ -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)
+1 -15
View File
@@ -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()
+1 -3
View File
@@ -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