Skip to content

Commit 2abc77d

Browse files
committed
feat: add http & socks5 proxy
1 parent a02b32f commit 2abc77d

File tree

4 files changed

+104
-2
lines changed

4 files changed

+104
-2
lines changed

go.mod

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ require (
66
github.com/bytedance/sonic v1.8.6
77
github.com/gin-gonic/gin v1.7.7
88
github.com/pkg/errors v0.9.1
9+
github.com/spf13/pflag v1.0.5
910
github.com/spf13/viper v1.16.0
11+
github.com/stretchr/testify v1.8.4
12+
golang.org/x/net v0.10.0
1013
)
1114

1215
require (
1316
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
17+
github.com/davecgh/go-spew v1.1.1 // indirect
1418
github.com/fsnotify/fsnotify v1.6.0 // indirect
1519
github.com/gin-contrib/sse v0.1.0 // indirect
1620
github.com/go-playground/locales v0.14.1 // indirect
@@ -27,10 +31,10 @@ require (
2731
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
2832
github.com/modern-go/reflect2 v1.0.2 // indirect
2933
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
34+
github.com/pmezard/go-difflib v1.0.0 // indirect
3035
github.com/spf13/afero v1.9.5 // indirect
3136
github.com/spf13/cast v1.5.1 // indirect
3237
github.com/spf13/jwalterweatherman v1.1.0 // indirect
33-
github.com/spf13/pflag v1.0.5 // indirect
3438
github.com/subosito/gotenv v1.4.2 // indirect
3539
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
3640
github.com/ugorji/go/codec v1.2.11 // indirect

go.sum

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
212212
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
213213
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
214214
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
215-
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
216215
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
216+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
217+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
217218
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
218219
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
219220
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
@@ -309,6 +310,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
309310
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
310311
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
311312
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
313+
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
314+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
312315
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
313316
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
314317
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

util/http_proxy.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package util
2+
3+
import (
4+
"context"
5+
"encoding/base64"
6+
"fmt"
7+
"net"
8+
"net/http"
9+
"net/url"
10+
11+
"golang.org/x/net/proxy"
12+
)
13+
14+
func NewHttpProxy(proxyAddress string) (*http.Transport, error) {
15+
proxyURL, err := url.Parse(proxyAddress)
16+
if err != nil {
17+
return nil, fmt.Errorf("error parsing proxy URL: %v", err)
18+
}
19+
20+
transport := &http.Transport{
21+
Proxy: http.ProxyURL(proxyURL),
22+
}
23+
24+
if proxyURL.User != nil {
25+
proxyAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(proxyURL.User.String()))
26+
27+
transport.ProxyConnectHeader = http.Header{
28+
"Proxy-Authorization": []string{proxyAuth},
29+
}
30+
}
31+
32+
return transport, nil
33+
}
34+
35+
func NewSocksProxy(proxyAddress string) (*http.Transport, error) {
36+
// proxyAddress: socks5://user:[email protected]:1080
37+
proxyURL, err := url.Parse(proxyAddress)
38+
if err != nil {
39+
return nil, fmt.Errorf("error parsing proxy URL: %v", err)
40+
}
41+
42+
dialer, err := proxy.FromURL(proxyURL, proxy.Direct)
43+
if err != nil {
44+
return nil, fmt.Errorf("error creating proxy dialer: %v", err)
45+
}
46+
47+
transport := &http.Transport{
48+
DialContext: func(ctx context.Context, network, address string) (net.Conn, error) {
49+
return dialer.Dial(network, address)
50+
},
51+
}
52+
53+
return transport, nil
54+
}

util/http_proxy_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package util
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"net/http"
6+
"testing"
7+
)
8+
9+
func TestHttpProxy(t *testing.T) {
10+
proxyAddress := "http://127.0.0.1:1087"
11+
transport, err := NewHttpProxy(proxyAddress)
12+
13+
assert.NoError(t, err)
14+
assert.NotNil(t, transport)
15+
16+
client := &http.Client{
17+
Transport: transport,
18+
}
19+
20+
resp, err := client.Get("https://www.google.com")
21+
assert.NoError(t, err)
22+
assert.NotNil(t, resp)
23+
assert.Equal(t, 200, resp.StatusCode)
24+
}
25+
26+
func TestSocksProxy(t *testing.T) {
27+
proxyAddress := "socks5://127.0.0.1:1080"
28+
transport, err := NewSocksProxy(proxyAddress)
29+
30+
assert.NoError(t, err)
31+
assert.NotNil(t, transport)
32+
33+
client := &http.Client{
34+
Transport: transport,
35+
}
36+
37+
resp, err := client.Get("https://www.google.com")
38+
assert.NoError(t, err)
39+
assert.NotNil(t, resp)
40+
assert.Equal(t, 200, resp.StatusCode)
41+
}

0 commit comments

Comments
 (0)