Skip to content

Commit 036c950

Browse files
committed
init
0 parents  commit 036c950

File tree

6 files changed

+474
-0
lines changed

6 files changed

+474
-0
lines changed

README.MD

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# 📖 Introduction
2+
A lightweight proxy tool based on the WebSocket protocol
3+
# 🚀 Features
4+
- Lightweight
5+
- No configuration
6+
- Wrap CDN
7+
# 🔨️ Build
8+
```shell
9+
git clone github.com/golangboy/wsproxy
10+
```
11+
12+
## Client
13+
```shell
14+
cd client
15+
go build .
16+
./client -h
17+
```
18+
19+
### Server
20+
```shell
21+
cd server
22+
go build .
23+
./server -h
24+
```

client/main.go

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
package main
2+
3+
import (
4+
"encoding/base64"
5+
"flag"
6+
"fmt"
7+
"io"
8+
"log"
9+
"main/common"
10+
"net"
11+
"net/url"
12+
"os"
13+
"strconv"
14+
15+
"github.com/gorilla/websocket"
16+
uuid "github.com/satori/go.uuid"
17+
)
18+
19+
var wsServer *string
20+
21+
func main() {
22+
os.Setenv("http_proxy", "")
23+
os.Setenv("https_proxy", "")
24+
os.Setenv("HTTP_PROXY", "")
25+
os.Setenv("HTTPS_PROXY", "")
26+
os.Setenv("ALL_PROXY", "")
27+
28+
listenAddr := flag.String("listen", ":1180", "listen socks5 address")
29+
wsServer = flag.String("ws", "localhost:80", "websocket server address")
30+
flag.Parse()
31+
log.SetFlags(log.LstdFlags | log.Lshortfile | log.Lmicroseconds)
32+
listener, err := net.Listen("tcp", *listenAddr)
33+
if err != nil {
34+
log.Fatalf("Failed to listen on %s: %v", listenAddr, err)
35+
}
36+
37+
log.Printf("SOCKS5 proxy server is listening on %s", *listenAddr)
38+
39+
for {
40+
conn, err := listener.Accept()
41+
if err != nil {
42+
log.Printf("Failed to accept connection: %v", err)
43+
continue
44+
}
45+
46+
go handleConnection(conn)
47+
}
48+
}
49+
50+
func handleConnection(clientConn net.Conn) {
51+
defer clientConn.Close()
52+
53+
// Step 1: Version identification and authentication
54+
// Read and verify the SOCKS5 initial handshake message
55+
buf := make([]byte, 257)
56+
_, err := io.ReadAtLeast(clientConn, buf, 2)
57+
if err != nil {
58+
log.Printf("Failed to read client handshake: %v", err)
59+
return
60+
}
61+
62+
// Check SOCKS version and authentication methods
63+
if buf[0] != 0x05 {
64+
log.Printf("Unsupported SOCKS version: %v", buf[0])
65+
return
66+
}
67+
68+
// Number of authentication methods supported
69+
numMethods := int(buf[1])
70+
authMethods := buf[2 : 2+numMethods]
71+
72+
// Check if "no authentication" method (0x00) is supported
73+
noAuth := false
74+
for _, m := range authMethods {
75+
if m == 0x00 {
76+
noAuth = true
77+
break
78+
}
79+
}
80+
81+
if !noAuth {
82+
log.Printf("No supported authentication methods")
83+
// Send handshake failure response to client
84+
clientConn.Write([]byte{0x05, 0xFF})
85+
return
86+
}
87+
88+
// Send handshake response to client indicating "no authentication" method
89+
clientConn.Write([]byte{0x05, 0x00})
90+
91+
// Step 2: Request processing
92+
// Read and verify the SOCKS5 request
93+
_, err = io.ReadAtLeast(clientConn, buf, 4)
94+
if err != nil {
95+
log.Printf("Failed to read client request: %v", err)
96+
return
97+
}
98+
99+
if buf[0] != 0x05 {
100+
log.Printf("Unsupported SOCKS version: %v", buf[0])
101+
return
102+
}
103+
104+
if buf[1] != 0x01 {
105+
log.Printf("Unsupported command: %v", buf[1])
106+
return
107+
}
108+
109+
// Check the address type
110+
var destAddr string
111+
var destPort string
112+
switch buf[3] {
113+
case 0x01: // IPv4 address
114+
ip := net.IP(buf[4 : 4+net.IPv4len])
115+
destAddr = ip.String()
116+
destPort = fmt.Sprintf("%d", int(buf[8])<<8+int(buf[9]))
117+
case 0x03: // Domain name
118+
domainLen := int(buf[4])
119+
domain := string(buf[5 : 5+domainLen])
120+
destAddr = domain
121+
destPort = strconv.Itoa(int(buf[5+domainLen])<<8 + int(buf[5+domainLen+1]))
122+
case 0x04: // IPv6 address
123+
ip := net.IP(buf[4 : 4+net.IPv6len])
124+
destAddr = ip.String()
125+
destPort = strconv.Itoa(int(buf[20])<<8 + int(buf[21]))
126+
default:
127+
log.Printf("Unsupported address type: %v", buf[3])
128+
return
129+
}
130+
131+
// Send request response to client indicating success
132+
clientConn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
133+
134+
u := url.URL{
135+
Scheme: "ws",
136+
Host: *wsServer,
137+
Path: "/chat",
138+
}
139+
msgId := uuid.NewV4().String()
140+
log.Printf("[%s]Client requests proxy connection: %s:%s", msgId, destAddr, destPort)
141+
// connection to websocket server
142+
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
143+
if err != nil {
144+
log.Printf("[%s]Failed to connect to the WebSocket server: %v", msgId, err)
145+
clientConn.Close()
146+
return
147+
}
148+
ws := common.WsConn{
149+
Conn: conn,
150+
}
151+
ws.Lock()
152+
err = ws.Conn.WriteJSON(common.Proto{
153+
MsgType: common.ReqConnect,
154+
Data: []byte(base64.StdEncoding.EncodeToString([]byte(destAddr + ":" + destPort))),
155+
MsgId: msgId,
156+
})
157+
ws.Unlock()
158+
if err != nil {
159+
log.Printf("[%s]Failed to write connect request to WebSocket server: %v", msgId, err)
160+
clientConn.Close()
161+
return
162+
}
163+
connectResp := common.Proto{}
164+
165+
err = ws.Conn.ReadJSON(&connectResp)
166+
if err != nil {
167+
log.Printf("[%s]Failed to request proxy target from WebSocket server: %v", msgId, err)
168+
clientConn.Close()
169+
return
170+
}
171+
172+
if connectResp.MsgType != common.ReqConnect {
173+
log.Printf("[%s]ReqConnect failed: %v", msgId, err)
174+
ws.Conn.Close()
175+
clientConn.Close()
176+
return
177+
}
178+
go func() {
179+
resp := common.Proto{}
180+
for {
181+
err = ws.Conn.ReadJSON(&resp)
182+
if err != nil {
183+
log.Printf("[%s]Failed to read data from WebSocket server: %v", msgId, err)
184+
break
185+
}
186+
_, err = clientConn.Write(resp.Data)
187+
if err != nil {
188+
log.Printf("[%s]Failed to write data to the client: %v", msgId, err)
189+
break
190+
}
191+
}
192+
}()
193+
for {
194+
var buf [10240]byte
195+
n, err := clientConn.Read(buf[:])
196+
if err != nil {
197+
log.Printf("[%s]Failed to read data from the client: %v", msgId, err)
198+
break
199+
}
200+
ws.Lock()
201+
err = ws.Conn.WriteJSON(common.Proto{
202+
MsgType: common.ReqData,
203+
Data: buf[:n],
204+
})
205+
ws.Unlock()
206+
if err != nil {
207+
log.Printf("[%s]Failed to write data to the WebSocket server: %v", msgId, err)
208+
break
209+
}
210+
}
211+
ws.Conn.Close()
212+
clientConn.Close()
213+
log.Printf("[%s]Closing the connection", msgId)
214+
}

common/main.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package common
2+
3+
import (
4+
"github.com/gorilla/websocket"
5+
"sync"
6+
)
7+
8+
type Proto struct {
9+
MsgType int `json:"msg_type"`
10+
MsgId string `json:"msg_id"`
11+
Data []byte `json:"data"`
12+
}
13+
type WsConn struct {
14+
Conn *websocket.Conn
15+
sync.Mutex
16+
}
17+
18+
const (
19+
ReqConnect = iota
20+
ReqData = iota
21+
)

go.mod

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module main
2+
3+
go 1.20
4+
5+
require (
6+
github.com/gin-gonic/gin v1.9.1
7+
github.com/gorilla/websocket v1.5.0
8+
github.com/satori/go.uuid v1.2.0
9+
)
10+
11+
require (
12+
github.com/bytedance/sonic v1.9.1 // indirect
13+
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
14+
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
15+
github.com/gin-contrib/sse v0.1.0 // indirect
16+
github.com/go-playground/locales v0.14.1 // indirect
17+
github.com/go-playground/universal-translator v0.18.1 // indirect
18+
github.com/go-playground/validator/v10 v10.14.0 // indirect
19+
github.com/goccy/go-json v0.10.2 // indirect
20+
github.com/json-iterator/go v1.1.12 // indirect
21+
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
22+
github.com/leodido/go-urn v1.2.4 // indirect
23+
github.com/mattn/go-isatty v0.0.19 // indirect
24+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
25+
github.com/modern-go/reflect2 v1.0.2 // indirect
26+
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
27+
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
28+
github.com/ugorji/go/codec v1.2.11 // indirect
29+
golang.org/x/arch v0.3.0 // indirect
30+
golang.org/x/crypto v0.9.0 // indirect
31+
golang.org/x/net v0.10.0 // indirect
32+
golang.org/x/sys v0.8.0 // indirect
33+
golang.org/x/text v0.9.0 // indirect
34+
google.golang.org/protobuf v1.30.0 // indirect
35+
gopkg.in/yaml.v3 v3.0.1 // indirect
36+
)

go.sum

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
2+
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
3+
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
4+
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
5+
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
6+
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
7+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
9+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10+
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
11+
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
12+
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
13+
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
14+
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
15+
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
16+
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
17+
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
18+
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
19+
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
20+
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
21+
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
22+
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
23+
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
24+
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
25+
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
26+
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
27+
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
28+
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
29+
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
30+
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
31+
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
32+
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
33+
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
34+
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
35+
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
36+
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
37+
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
38+
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
39+
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
40+
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
41+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
42+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
43+
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
44+
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
45+
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
46+
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
47+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
48+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
49+
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
50+
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
51+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
52+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
53+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
54+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
55+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
56+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
57+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
58+
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
59+
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
60+
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
61+
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
62+
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
63+
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
64+
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
65+
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
66+
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
67+
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
68+
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
69+
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
70+
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
71+
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
72+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
73+
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
74+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
75+
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
76+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
77+
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
78+
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
79+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
80+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
81+
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
82+
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
83+
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
84+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
85+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
86+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
87+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
88+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
89+
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

0 commit comments

Comments
 (0)