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)
|
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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user