mirror of
https://github.com/masterking32/MasterHttpRelayVPN.git
synced 2026-05-17 21:24:37 +03:00
Remove dead client SOCKS state and simplify session handling
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user