Skip to content

Commit cc21028

Browse files
committed
WIP-update
1 parent bcb0943 commit cc21028

File tree

1 file changed

+50
-36
lines changed

1 file changed

+50
-36
lines changed

main.go

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"os"
1616
"strings"
1717
"sync"
18+
"time"
1819
)
1920

2021
type ProxyConfig struct {
@@ -26,20 +27,21 @@ type ProxyManager struct {
2627
currentIdx int
2728
mu sync.Mutex
2829
enableEdge bool
30+
lastUsed time.Time
2931
}
3032

3133
func NewProxyManager(enableEdge bool) *ProxyManager {
3234
return &ProxyManager{
3335
proxies: make([]*ProxyConfig, 0),
3436
enableEdge: enableEdge,
37+
lastUsed: time.Now(),
3538
}
3639
}
3740

3841
func (pm *ProxyManager) LoadProxies(filename string) error {
3942
file, err := os.Open(filename)
4043
if err != nil {
4144
if pm.enableEdge {
42-
// If edge mode is enabled and no proxy file, that's okay
4345
return nil
4446
}
4547
return err
@@ -55,24 +57,18 @@ func (pm *ProxyManager) LoadProxies(filename string) error {
5557
continue
5658
}
5759

58-
proxyStr := line
59-
proxyURL, err := url.Parse(proxyStr)
60+
proxyURL, err := url.Parse(line)
6061
if err != nil {
6162
return fmt.Errorf("invalid proxy URL: %s", err)
6263
}
6364

64-
proxy := &ProxyConfig{
65-
proxyURL: proxyURL,
66-
}
67-
68-
pm.proxies = append(pm.proxies, proxy)
65+
pm.proxies = append(pm.proxies, &ProxyConfig{proxyURL: proxyURL})
6966
}
7067

7168
if err := scanner.Err(); err != nil {
7269
return err
7370
}
7471

75-
// Only return error if no proxies AND edge mode is disabled
7672
if len(pm.proxies) == 0 && !pm.enableEdge {
7773
return fmt.Errorf("no proxies loaded from configuration and edge mode is disabled")
7874
}
@@ -88,51 +84,73 @@ func (pm *ProxyManager) GetNextProxy() (*ProxyConfig, error) {
8884
return nil, fmt.Errorf("no proxies available")
8985
}
9086

87+
// Always increment the index
9188
proxy := pm.proxies[pm.currentIdx]
9289
pm.currentIdx = (pm.currentIdx + 1) % len(pm.proxies)
9390

91+
// Update last used time
92+
pm.lastUsed = time.Now()
93+
9494
return proxy, nil
9595
}
9696

97+
func (pm *ProxyManager) ShouldUseDirect() bool {
98+
pm.mu.Lock()
99+
defer pm.mu.Unlock()
100+
101+
if !pm.enableEdge {
102+
return false
103+
}
104+
105+
// If we have no proxies, always use direct
106+
if len(pm.proxies) == 0 {
107+
return true
108+
}
109+
110+
// In edge mode with proxies, use direct connection periodically
111+
// This ensures we rotate through direct connection as well
112+
return time.Since(pm.lastUsed) > 5*time.Second
113+
}
114+
97115
type ProxyDialer struct {
98116
manager *ProxyManager
99117
}
100118

101119
func (d *ProxyDialer) Dial(ctx context.Context, network, addr string) (net.Conn, error) {
102-
if d.manager.enableEdge {
103-
// If edge mode is enabled, try direct connection first
120+
var lastError error
121+
122+
// Check if we should try direct connection first
123+
if d.manager.ShouldUseDirect() {
104124
conn, err := net.Dial(network, addr)
105125
if err == nil {
106126
return conn, nil
107127
}
108-
// Only continue to proxies if we have any
109-
if len(d.manager.proxies) == 0 {
110-
return nil, fmt.Errorf("direct connection failed: %v", err)
111-
}
128+
lastError = err
112129
}
113130

114-
// If we get here and have no proxies, return error
115-
if len(d.manager.proxies) == 0 {
116-
return nil, fmt.Errorf("no proxies available and edge mode is disabled")
117-
}
118-
119-
// Try each proxy until one succeeds
120-
var lastError error
121-
for i := 0; i < len(d.manager.proxies); i++ {
131+
// If we have proxies, try them
132+
if len(d.manager.proxies) > 0 {
122133
proxy, err := d.manager.GetNextProxy()
123134
if err != nil {
135+
if lastError != nil {
136+
return nil, fmt.Errorf("direct connection failed: %v, proxy error: %v", lastError, err)
137+
}
124138
return nil, err
125139
}
126140

127141
conn, err := d.dialWithProxy(proxy, network, addr)
128-
if err != nil {
129-
lastError = err
130-
continue
142+
if err == nil {
143+
return conn, nil
131144
}
132-
return conn, nil
145+
lastError = err
146+
} else if !d.manager.enableEdge {
147+
return nil, fmt.Errorf("no proxies available and edge mode is disabled")
133148
}
134149

135-
return nil, fmt.Errorf("all proxies failed, last error: %v", lastError)
150+
if lastError != nil {
151+
return nil, fmt.Errorf("all connection attempts failed, last error: %v", lastError)
152+
}
153+
return nil, fmt.Errorf("no connection methods available")
136154
}
137155

138156
func (d *ProxyDialer) dialWithProxy(proxy *ProxyConfig, network, addr string) (net.Conn, error) {
@@ -283,19 +301,15 @@ func main() {
283301
log.Fatal(err)
284302
}
285303

286-
port := os.Getenv("DC_SOCKS_PROXY_PORT")
287-
if port == "" {
288-
port = "1080"
289-
}
304+
log.Printf("SOCKS5 server running on :1080 (Edge Mode: %v, Users: %d, Proxies: %d)\n",
305+
enableEdge, len(credentials), len(proxyManager.proxies))
290306

291-
log.Printf("SOCKS5 server running on :%s (Edge Mode: %v, Users: %d, Proxies: %d)\n",
292-
port, enableEdge, len(credentials), len(proxyManager.proxies))
293-
if err := server.ListenAndServe("tcp", ":"+port); err != nil {
307+
// Always listen on port 1080 inside container
308+
if err := server.ListenAndServe("tcp", ":1080"); err != nil {
294309
log.Fatal(err)
295310
}
296311
}
297312

298-
// Helper functions for SOCKS5
299313
func performSocks5Handshake(conn net.Conn, proxyURL *url.URL) error {
300314
_, err := conn.Write([]byte{0x05, 0x01, 0x02})
301315
if err != nil {

0 commit comments

Comments
 (0)