Skip to content

Commit 9a6dfa0

Browse files
committed
refactor(proxy): make proxy configuration explicit
- introduce `SLING_PROXY` environment variable for proxy configuration - allow setting proxy URL directly on connection via `PROXY_URL` property - prioritize `PROXY_URL` over `SLING_PROXY` environment variable - pass proxy URL directly to `OpenTunnelProxy` for improved clarity and testability - remove dependency on generic `ALL_PROXY` environment variable
1 parent bac92cc commit 9a6dfa0

3 files changed

Lines changed: 18 additions & 21 deletions

File tree

core/dbio/database/database.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -680,8 +680,12 @@ func (conn *BaseConn) Connect(timeOut ...int) (err error) {
680680
conn.SetProp("ssh_url", connURL) // set ssh url for 3rd party bulk loading
681681
}
682682

683-
// start SOCKS5 proxy tunnel with ALL_PROXY env var
684-
if os.Getenv("ALL_PROXY") != "" {
683+
// start SOCKS5 proxy tunnel with SLING_PROXY env var
684+
proxyURL := conn.GetProp("PROXY_URL")
685+
if proxyURL == "" {
686+
proxyURL = os.Getenv("SLING_PROXY")
687+
}
688+
if proxyURL != "" {
685689
connU, err := url.Parse(connURL)
686690
if err != nil {
687691
return g.Error(err, "could not parse connection URL for proxy forwarding")
@@ -698,7 +702,7 @@ func (conn *BaseConn) Connect(timeOut ...int) (err error) {
698702
)
699703
}
700704

701-
localPort, err := iop.OpenTunnelProxy(connHost, connPort)
705+
localPort, err := iop.OpenTunnelProxy(proxyURL, connHost, connPort)
702706
if err != nil {
703707
return g.Error(err, "could not establish SOCKS5 proxy tunnel")
704708
}

core/dbio/iop/proxy.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,27 @@ import (
44
"io"
55
"net"
66
"net/url"
7-
"os"
87
"strings"
98
"sync"
109

1110
"github.com/flarco/g"
1211
"golang.org/x/net/proxy"
1312
)
1413

15-
// OpenTunnelProxy forwards traffic through the SOCKS5 proxy in ALL_PROXY
16-
func OpenTunnelProxy(tgtHost string, tgtPort int) (localPort int, err error) {
17-
proxyURL := os.Getenv("ALL_PROXY")
14+
// OpenTunnelProxy forwards traffic through the SOCKS5 proxy
15+
func OpenTunnelProxy(proxyURL, tgtHost string, tgtPort int) (localPort int, err error) {
1816
if proxyURL == "" {
19-
return 0, g.Error("no proxy configured in environment (ALL_PROXY)")
17+
return 0, g.Error("no proxy URL provided")
2018
}
2119

2220
u, err := url.Parse(proxyURL)
2321
if err != nil {
24-
return 0, g.Error(err, "could not parse ALL_PROXY URL")
22+
return 0, g.Error(err, "could not parse proxy URL")
2523
}
2624

2725
dialer, err := proxy.FromURL(u, proxy.Direct)
2826
if err != nil {
29-
return 0, g.Error(err, "could not create dialer from ALL_PROXY URL")
27+
return 0, g.Error(err, "could not create dialer from proxy URL")
3028
}
3129

3230
localPort, err = g.GetPort("localhost:0")

core/dbio/iop/proxy_test.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"io"
66
"net"
7-
"os"
87
"testing"
98
"time"
109

@@ -89,23 +88,20 @@ func startEchoServer(t *testing.T) net.Listener {
8988
}
9089

9190
func TestOpenTunnelProxy_NoProxyConfigured(t *testing.T) {
92-
os.Unsetenv("ALL_PROXY")
93-
94-
_, err := OpenTunnelProxy("example.com", 5432)
91+
_, err := OpenTunnelProxy("", "example.com", 5432)
9592
assert.Error(t, err)
9693
assert.Contains(t, err.Error(), "no proxy configured")
9794
}
9895

9996
func TestOpenTunnelProxy_UnreachableProxy(t *testing.T) {
100-
// Point ALL_PROXY at a port with nothing listening
97+
// supply proxyURL at a port with nothing listening
10198
ln, err := net.Listen("tcp", "127.0.0.1:0")
10299
g.AssertNoError(t, err)
103100
deadPort := ln.Addr().(*net.TCPAddr).Port
104101
ln.Close() // close immediately so the port is unreachable
105102

106-
t.Setenv("ALL_PROXY", fmt.Sprintf("socks5://127.0.0.1:%d", deadPort))
107-
108-
localPort, err := OpenTunnelProxy("127.0.0.1", 5432)
103+
proxyURL := fmt.Sprintf("socks5://127.0.0.1:%d", deadPort)
104+
localPort, err := OpenTunnelProxy(proxyURL, "127.0.0.1", 5432)
109105
// tunnel setup succeeds (listener created), but connecting through it should fail
110106
g.AssertNoError(t, err)
111107

@@ -133,9 +129,8 @@ func TestOpenTunnelProxy_ForwardsTraffic(t *testing.T) {
133129
defer socksLn.Close()
134130
go minimalSOCKS5(t, socksLn)
135131

136-
t.Setenv("ALL_PROXY", fmt.Sprintf("socks5://127.0.0.1:%d", socksLn.Addr().(*net.TCPAddr).Port))
137-
138-
localPort, err := OpenTunnelProxy("127.0.0.1", echoAddr.Port)
132+
proxyURL := fmt.Sprintf("socks5://127.0.0.1:%d", socksLn.Addr().(*net.TCPAddr).Port)
133+
localPort, err := OpenTunnelProxy(proxyURL, "127.0.0.1", echoAddr.Port)
139134
g.AssertNoError(t, err)
140135
assert.Greater(t, localPort, 0)
141136

0 commit comments

Comments
 (0)