Ver código fonte

Merge remote-tracking branch 'origin/master' into stable

tags/v2.1.2
9seconds 4 anos atrás
pai
commit
4814b0fcc1

+ 14
- 2
.github/workflows/ci.yaml Ver arquivo

2
 
2
 
3
 name: CI
3
 name: CI
4
 
4
 
5
+permissions:
6
+  actions: read
7
+  checks: read
8
+  contents: read
9
+  deployments: read
10
+  issues: read
11
+  discussions: read
12
+  pull-requests: read
13
+  repository-projects: read
14
+  security-events: read
15
+  statuses: read
16
+
5
 on:
17
 on:
6
   push:
18
   push:
7
     tags:
19
     tags:
71
       - name: Run linter
83
       - name: Run linter
72
         uses: golangci/golangci-lint-action@v2
84
         uses: golangci/golangci-lint-action@v2
73
         with:
85
         with:
74
-          version: v1.42.0
86
+          version: v1.42.1
75
 
87
 
76
   docker:
88
   docker:
77
     name: Docker
89
     name: Docker
78
     runs-on: ubuntu-latest
90
     runs-on: ubuntu-latest
79
-    timeout-minutes: 15
91
+    timeout-minutes: 20
80
     steps:
92
     steps:
81
       - name: Checkout
93
       - name: Checkout
82
         uses: actions/checkout@v2
94
         uses: actions/checkout@v2

+ 8
- 0
.github/workflows/codeql-analysis.yml Ver arquivo

11
 #
11
 #
12
 name: "CodeQL"
12
 name: "CodeQL"
13
 
13
 
14
+# https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions
15
+# https://github.com/github/codeql-action/issues/572
16
+permissions:
17
+  actions: read
18
+  contents: read
19
+  pull-requests: read
20
+  security-events: write
21
+
14
 on:
22
 on:
15
   push:
23
   push:
16
     branches: 
24
     branches: 

+ 4
- 4
Makefile Ver arquivo

2
 IMAGE_NAME   := mtg
2
 IMAGE_NAME   := mtg
3
 APP_NAME     := $(IMAGE_NAME)
3
 APP_NAME     := $(IMAGE_NAME)
4
 
4
 
5
-GOLANGCI_LINT_VERSION := v1.42.0
5
+GOLANGCI_LINT_VERSION := v1.42.1
6
 
6
 
7
 VERSION_GO         := $(shell go version)
7
 VERSION_GO         := $(shell go version)
8
 VERSION_DATE       := $(shell date -Ru)
8
 VERSION_DATE       := $(shell date -Ru)
83
 
83
 
84
 .PHONY: install-tools-godoc
84
 .PHONY: install-tools-godoc
85
 install-tools-godoc: .bin
85
 install-tools-godoc: .bin
86
-	@$(GOTOOL) go get -u golang.org/x/tools/cmd/godoc
86
+	@$(GOTOOL) go install golang.org/x/tools/cmd/godoc@latest
87
 
87
 
88
 .PHONY: install-tools-gofumpt
88
 .PHONY: install-tools-gofumpt
89
 install-tools-gofumpt: .bin
89
 install-tools-gofumpt: .bin
90
-	@$(GOTOOL) go get -u mvdan.cc/gofumpt
90
+	@$(GOTOOL) go install mvdan.cc/gofumpt@latest
91
 
91
 
92
 .PHONY: goreleaser
92
 .PHONY: goreleaser
93
 install-tools-goreleaser: .bin
93
 install-tools-goreleaser: .bin
94
-	@$(GOTOOL) go get -u github.com/goreleaser/goreleaser
94
+	@$(GOTOOL) go install github.com/goreleaser/goreleaser@latest
95
 
95
 
96
 .PHONY: update-deps
96
 .PHONY: update-deps
97
 update-deps:
97
 update-deps:

+ 13
- 0
example.config.toml Ver arquivo

56
 # time range of this parameter.
56
 # time range of this parameter.
57
 tolerate-time-skewness = "5s"
57
 tolerate-time-skewness = "5s"
58
 
58
 
59
+# Telegram has a concept of DC. You can think about DC as a number of a cluster
60
+# with a certain purpose. Some clusters serve media, some - messages, some rule
61
+# channels and so on. But sometimes unknown DC number is requested by client.
62
+# It could be a bug or some global reconfiguration of the Telegram.
63
+#
64
+# By default, proxy rejects such requests. But it is also possible to fallback
65
+# this request to any DC. Telegram works in a way that any DC is able to serve
66
+# any request but sacrificing a latency.
67
+#
68
+# If this setting is disabled (default), mtg will reject a connection.
69
+# Otherwise, chose a new DC.
70
+allow-fallback-on-unknown-dc = false
71
+
59
 # network defines different network-related settings
72
 # network defines different network-related settings
60
 [network]
73
 [network]
61
 # please be aware that mtg needs to do some external requests. For
74
 # please be aware that mtg needs to do some external requests. For

+ 8
- 8
go.mod Ver arquivo

5
 require (
5
 require (
6
 	github.com/OneOfOne/xxhash v1.2.8
6
 	github.com/OneOfOne/xxhash v1.2.8
7
 	github.com/alecthomas/kong v0.2.17
7
 	github.com/alecthomas/kong v0.2.17
8
-	github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15
8
+	github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a
9
 	github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
9
 	github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
10
 	github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6
10
 	github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6
11
 	github.com/d4l3k/messagediff v1.2.1 // indirect
11
 	github.com/d4l3k/messagediff v1.2.1 // indirect
12
 	github.com/golang/protobuf v1.5.2 // indirect
12
 	github.com/golang/protobuf v1.5.2 // indirect
13
 	github.com/gotd/td v0.34.0
13
 	github.com/gotd/td v0.34.0
14
 	github.com/jarcoal/httpmock v1.0.8
14
 	github.com/jarcoal/httpmock v1.0.8
15
-	github.com/kentik/patricia v0.0.0-20201202224819-f9447a6e25f1
15
+	github.com/kentik/patricia v0.0.0-20210909164817-21603333b70e
16
 	github.com/mccutchen/go-httpbin v1.1.1
16
 	github.com/mccutchen/go-httpbin v1.1.1
17
 	github.com/panjf2000/ants/v2 v2.4.6
17
 	github.com/panjf2000/ants/v2 v2.4.6
18
-	github.com/pelletier/go-toml v1.9.3
18
+	github.com/pelletier/go-toml v1.9.4
19
 	github.com/prometheus/client_golang v1.11.0
19
 	github.com/prometheus/client_golang v1.11.0
20
-	github.com/prometheus/common v0.30.0 // indirect
20
+	github.com/prometheus/common v0.31.1 // indirect
21
 	github.com/prometheus/procfs v0.7.3 // indirect
21
 	github.com/prometheus/procfs v0.7.3 // indirect
22
-	github.com/rs/zerolog v1.24.0
22
+	github.com/rs/zerolog v1.25.0
23
 	github.com/smira/go-statsd v1.3.2
23
 	github.com/smira/go-statsd v1.3.2
24
 	github.com/stretchr/objx v0.3.0 // indirect
24
 	github.com/stretchr/objx v0.3.0 // indirect
25
 	github.com/stretchr/testify v1.7.0
25
 	github.com/stretchr/testify v1.7.0
26
 	github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43
26
 	github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43
27
-	golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
28
-	golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985
29
-	golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
27
+	golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
28
+	golang.org/x/net v0.0.0-20211005001312-d4b1ae081e3b
29
+	golang.org/x/sys v0.0.0-20211004093028-2c5d950f24ef
30
 	google.golang.org/protobuf v1.27.1 // indirect
30
 	google.golang.org/protobuf v1.27.1 // indirect
31
 )
31
 )
32
 
32
 

+ 16
- 16
go.sum Ver arquivo

44
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
44
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
45
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
45
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
46
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
46
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
47
-github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 h1:AUNCr9CiJuwrRYS3XieqF+Z9B9gNxo/eANAJCF2eiN4=
48
-github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
47
+github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc=
48
+github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
49
 github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
49
 github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
50
 github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
50
 github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
51
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
51
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
169
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
169
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
170
 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
170
 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
171
 github.com/k0kubun/pp v2.4.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
171
 github.com/k0kubun/pp v2.4.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
172
-github.com/kentik/patricia v0.0.0-20201202224819-f9447a6e25f1 h1:D7qhJP3R49ZjUzpzKQ6B2H3lgejPs6DTO5gRomhhOpE=
173
-github.com/kentik/patricia v0.0.0-20201202224819-f9447a6e25f1/go.mod h1:2OfLA+0esiUJpwMjrH39pEk79cb8MvGTBS9YlZpejJ4=
172
+github.com/kentik/patricia v0.0.0-20210909164817-21603333b70e h1:1wAVuGu1c+lsdaOPQN+9xoP9+gaIMJV6H0ehGc+K5iA=
173
+github.com/kentik/patricia v0.0.0-20210909164817-21603333b70e/go.mod h1:2OfLA+0esiUJpwMjrH39pEk79cb8MvGTBS9YlZpejJ4=
174
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
174
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
175
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
175
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
176
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
176
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
195
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
195
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
196
 github.com/panjf2000/ants/v2 v2.4.6 h1:drmj9mcygn2gawZ155dRbo+NfXEfAssjZNU1qoIb4gQ=
196
 github.com/panjf2000/ants/v2 v2.4.6 h1:drmj9mcygn2gawZ155dRbo+NfXEfAssjZNU1qoIb4gQ=
197
 github.com/panjf2000/ants/v2 v2.4.6/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
197
 github.com/panjf2000/ants/v2 v2.4.6/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
198
-github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
199
-github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
198
+github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
199
+github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
200
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
200
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
201
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
201
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
202
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
202
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
217
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
217
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
218
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
218
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
219
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
219
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
220
-github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug=
221
-github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
220
+github.com/prometheus/common v0.31.1 h1:d18hG4PkHnNAKNMOmFuXFaiY8Us0nird/2m60uS1AMs=
221
+github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
222
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
222
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
223
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
223
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
224
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
224
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
229
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
229
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
230
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
230
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
231
 github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
231
 github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
232
-github.com/rs/zerolog v1.24.0 h1:76ivFxmVSRs1u2wUwJVg5VZDYQgeH1JpoS6ndgr9Wy8=
233
-github.com/rs/zerolog v1.24.0/go.mod h1:7KHcEGe0QZPOm2IE4Kpb5rTh6n1h2hIgS5OOnu1rUaI=
232
+github.com/rs/zerolog v1.25.0 h1:Rj7XygbUHKUlDPcVdoLyR91fJBsduXj5fRxyqIQj/II=
233
+github.com/rs/zerolog v1.25.0/go.mod h1:7KHcEGe0QZPOm2IE4Kpb5rTh6n1h2hIgS5OOnu1rUaI=
234
 github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
234
 github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
235
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
235
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
236
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
236
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
277
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
277
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
278
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
278
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
279
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
279
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
280
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
281
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
280
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
281
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
282
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
282
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
283
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
283
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
284
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
284
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
345
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
345
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
346
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
346
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
347
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
347
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
348
-golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8=
349
-golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
348
+golang.org/x/net v0.0.0-20211005001312-d4b1ae081e3b h1:SXy8Ld8oKlcogOvUAh0J5Pm5RKzgYBMMxLxt6n5XW50=
349
+golang.org/x/net v0.0.0-20211005001312-d4b1ae081e3b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
350
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
350
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
351
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
351
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
352
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
352
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
405
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
405
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
406
 golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
406
 golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
407
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
407
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
408
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
409
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
408
+golang.org/x/sys v0.0.0-20211004093028-2c5d950f24ef h1:fPxZ3Umkct3LZ8gK9nbk+DWDJ9fstZa2grBn+lWVKPs=
409
+golang.org/x/sys v0.0.0-20211004093028-2c5d950f24ef/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
410
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
410
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
411
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
411
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
412
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
412
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 3
- 1
internal/cli/run_proxy.go Ver arquivo

156
 func runProxy(conf *config.Config, version string) error {
156
 func runProxy(conf *config.Config, version string) error {
157
 	logger := makeLogger(conf)
157
 	logger := makeLogger(conf)
158
 
158
 
159
-	logger.BindStr("configuration", conf.String()).Debug("configuration")
159
+	logger.BindJSON("configuration", conf.String()).Debug("configuration")
160
 
160
 
161
 	ntw, err := makeNetwork(conf, version)
161
 	ntw, err := makeNetwork(conf, version)
162
 	if err != nil {
162
 	if err != nil {
184
 		BufferSize:         conf.TCPBuffer.Get(mtglib.DefaultBufferSize),
184
 		BufferSize:         conf.TCPBuffer.Get(mtglib.DefaultBufferSize),
185
 		DomainFrontingPort: conf.DomainFrontingPort.Get(mtglib.DefaultDomainFrontingPort),
185
 		DomainFrontingPort: conf.DomainFrontingPort.Get(mtglib.DefaultDomainFrontingPort),
186
 		PreferIP:           conf.PreferIP.Get(mtglib.DefaultPreferIP),
186
 		PreferIP:           conf.PreferIP.Get(mtglib.DefaultPreferIP),
187
+
188
+		AllowFallbackOnUnknownDC: conf.AllowFallbackOnUnknownDC.Get(false),
187
 	}
189
 	}
188
 
190
 
189
 	proxy, err := mtglib.NewProxy(opts)
191
 	proxy, err := mtglib.NewProxy(opts)

+ 1
- 0
internal/cli/simple_run.go Ver arquivo

71
 	}
71
 	}
72
 
72
 
73
 	conf.Debug.Value = s.Debug
73
 	conf.Debug.Value = s.Debug
74
+	conf.AllowFallbackOnUnknownDC.Value = true
74
 	conf.Defense.AntiReplay.Enabled.Value = true
75
 	conf.Defense.AntiReplay.Enabled.Value = true
75
 
76
 
76
 	if err := conf.Validate(); err != nil {
77
 	if err := conf.Validate(); err != nil {

+ 10
- 9
internal/config/config.go Ver arquivo

9
 )
9
 )
10
 
10
 
11
 type Config struct {
11
 type Config struct {
12
-	Debug                TypeBool        `json:"debug"`
13
-	Secret               mtglib.Secret   `json:"secret"`
14
-	BindTo               TypeHostPort    `json:"bindTo"`
15
-	TCPBuffer            TypeBytes       `json:"tcpBuffer"`
16
-	PreferIP             TypePreferIP    `json:"preferIp"`
17
-	DomainFrontingPort   TypePort        `json:"domainFrontingPort"`
18
-	TolerateTimeSkewness TypeDuration    `json:"tolerateTimeSkewness"`
19
-	Concurrency          TypeConcurrency `json:"concurrency"`
20
-	Defense              struct {
12
+	Debug                    TypeBool        `json:"debug"`
13
+	AllowFallbackOnUnknownDC TypeBool        `json:"allowFallbackOnUnknownDc"`
14
+	Secret                   mtglib.Secret   `json:"secret"`
15
+	BindTo                   TypeHostPort    `json:"bindTo"`
16
+	TCPBuffer                TypeBytes       `json:"tcpBuffer"`
17
+	PreferIP                 TypePreferIP    `json:"preferIp"`
18
+	DomainFrontingPort       TypePort        `json:"domainFrontingPort"`
19
+	TolerateTimeSkewness     TypeDuration    `json:"tolerateTimeSkewness"`
20
+	Concurrency              TypeConcurrency `json:"concurrency"`
21
+	Defense                  struct {
21
 		AntiReplay struct {
22
 		AntiReplay struct {
22
 			Enabled   TypeBool      `json:"enabled"`
23
 			Enabled   TypeBool      `json:"enabled"`
23
 			MaxSize   TypeBytes     `json:"maxSize"`
24
 			MaxSize   TypeBytes     `json:"maxSize"`

+ 10
- 9
internal/config/parse.go Ver arquivo

9
 )
9
 )
10
 
10
 
11
 type tomlConfig struct {
11
 type tomlConfig struct {
12
-	Debug                bool   `toml:"debug" json:"debug,omitempty"`
13
-	Secret               string `toml:"secret" json:"secret"`
14
-	BindTo               string `toml:"bind-to" json:"bindTo"`
15
-	TCPBuffer            string `toml:"tcp-buffer" json:"tcpBuffer,omitempty"`
16
-	PreferIP             string `toml:"prefer-ip" json:"preferIp,omitempty"`
17
-	DomainFrontingPort   uint   `toml:"domain-fronting-port" json:"domainFrontingPort,omitempty"`
18
-	TolerateTimeSkewness string `toml:"tolerate-time-skewness" json:"tolerateTimeSkewness,omitempty"`
19
-	Concurrency          uint   `toml:"concurrency" json:"concurrency,omitempty"`
20
-	Defense              struct {
12
+	Debug                    bool   `toml:"debug" json:"debug,omitempty"`
13
+	AllowFallbackOnUnknownDC bool   `toml:"allow-fallback-on-unknown-dc" json:"allowFallbackOnUnknownDc,omitempty"`
14
+	Secret                   string `toml:"secret" json:"secret"`
15
+	BindTo                   string `toml:"bind-to" json:"bindTo"`
16
+	TCPBuffer                string `toml:"tcp-buffer" json:"tcpBuffer,omitempty"`
17
+	PreferIP                 string `toml:"prefer-ip" json:"preferIp,omitempty"`
18
+	DomainFrontingPort       uint   `toml:"domain-fronting-port" json:"domainFrontingPort,omitempty"`
19
+	TolerateTimeSkewness     string `toml:"tolerate-time-skewness" json:"tolerateTimeSkewness,omitempty"`
20
+	Concurrency              uint   `toml:"concurrency" json:"concurrency,omitempty"`
21
+	Defense                  struct {
21
 		AntiReplay struct {
22
 		AntiReplay struct {
22
 			Enabled   bool    `toml:"enabled" json:"enabled,omitempty"`
23
 			Enabled   bool    `toml:"enabled" json:"enabled,omitempty"`
23
 			MaxSize   string  `toml:"max-size" json:"maxSize,omitempty"`
24
 			MaxSize   string  `toml:"max-size" json:"maxSize,omitempty"`

+ 1
- 0
internal/utils/rlimit.go Ver arquivo

1
+//go:build !windows
1
 // +build !windows
2
 // +build !windows
2
 
3
 
3
 package utils
4
 package utils

+ 1
- 0
internal/utils/rlimit_windows.go Ver arquivo

1
+//go:build windows
1
 // +build windows
2
 // +build windows
2
 
3
 
3
 package utils
4
 package utils

+ 1
- 0
internal/utils/root_context.go Ver arquivo

1
+//go:build !windows
1
 // +build !windows
2
 // +build !windows
2
 
3
 
3
 package utils
4
 package utils

+ 1
- 0
internal/utils/root_context_windows.go Ver arquivo

1
+//go:build windows
1
 // +build windows
2
 // +build windows
2
 
3
 
3
 package utils
4
 package utils

+ 6
- 18
ipblocklist/firehol.go Ver arquivo

121
 func (f *Firehol) containsIPv4(addr net.IP) bool {
121
 func (f *Firehol) containsIPv4(addr net.IP) bool {
122
 	ip := patricia.NewIPv4AddressFromBytes(addr, 32) // nolint: gomnd
122
 	ip := patricia.NewIPv4AddressFromBytes(addr, 32) // nolint: gomnd
123
 
123
 
124
-	if ok, _, err := f.treeV4.FindDeepestTag(ip); ok && err == nil {
124
+	if ok, _ := f.treeV4.FindDeepestTag(ip); ok {
125
 		return true
125
 		return true
126
 	}
126
 	}
127
 
127
 
131
 func (f *Firehol) containsIPv6(addr net.IP) bool {
131
 func (f *Firehol) containsIPv6(addr net.IP) bool {
132
 	ip := patricia.NewIPv6Address(addr, 128) // nolint: gomnd
132
 	ip := patricia.NewIPv6Address(addr, 128) // nolint: gomnd
133
 
133
 
134
-	if ok, _, err := f.treeV6.FindDeepestTag(ip); ok && err == nil {
134
+	if ok, _ := f.treeV6.FindDeepestTag(ip); ok {
135
 		return true
135
 		return true
136
 	}
136
 	}
137
 
137
 
267
 			return fmt.Errorf("cannot parse a line: %w", err)
267
 			return fmt.Errorf("cannot parse a line: %w", err)
268
 		}
268
 		}
269
 
269
 
270
-		if err := f.updateAddToTrees(ip, cidr, mutex, v4tree, v6tree); err != nil {
271
-			return fmt.Errorf("cannot add a node to the tree: %w", err)
272
-		}
270
+		f.updateAddToTrees(ip, cidr, mutex, v4tree, v6tree)
273
 	}
271
 	}
274
 
272
 
275
 	if scanner.Err() != nil {
273
 	if scanner.Err() != nil {
302
 
300
 
303
 func (f *Firehol) updateAddToTrees(ip net.IP, cidr uint,
301
 func (f *Firehol) updateAddToTrees(ip net.IP, cidr uint,
304
 	mutex sync.Locker,
302
 	mutex sync.Locker,
305
-	v4tree *bool_tree.TreeV4, v6tree *bool_tree.TreeV6) error {
303
+	v4tree *bool_tree.TreeV4, v6tree *bool_tree.TreeV6) {
306
 	mutex.Lock()
304
 	mutex.Lock()
307
 	defer mutex.Unlock()
305
 	defer mutex.Unlock()
308
 
306
 
309
 	if ip.To4() != nil {
307
 	if ip.To4() != nil {
310
-		addr := patricia.NewIPv4AddressFromBytes(ip, cidr)
311
-
312
-		if _, _, err := v4tree.Set(addr, true); err != nil {
313
-			return err // nolint: wrapcheck
314
-		}
308
+		v4tree.Set(patricia.NewIPv4AddressFromBytes(ip, cidr), true)
315
 	} else {
309
 	} else {
316
-		addr := patricia.NewIPv6Address(ip, cidr)
317
-
318
-		if _, _, err := v6tree.Set(addr, true); err != nil {
319
-			return err // nolint: wrapcheck
320
-		}
310
+		v6tree.Set(patricia.NewIPv6Address(ip, cidr), true)
321
 	}
311
 	}
322
-
323
-	return nil
324
 }
312
 }
325
 
313
 
326
 // NewFirehol creates a new instance of FireHOL IP blocklist.
314
 // NewFirehol creates a new instance of FireHOL IP blocklist.

+ 1
- 0
logger/noop.go Ver arquivo

7
 func (n noopLogger) Named(_ string) mtglib.Logger          { return n }
7
 func (n noopLogger) Named(_ string) mtglib.Logger          { return n }
8
 func (n noopLogger) BindInt(_ string, _ int) mtglib.Logger { return n }
8
 func (n noopLogger) BindInt(_ string, _ int) mtglib.Logger { return n }
9
 func (n noopLogger) BindStr(_, _ string) mtglib.Logger     { return n }
9
 func (n noopLogger) BindStr(_, _ string) mtglib.Logger     { return n }
10
+func (n noopLogger) BindJSON(_, _ string) mtglib.Logger    { return n }
10
 func (n noopLogger) Printf(_ string, _ ...interface{})     {}
11
 func (n noopLogger) Printf(_ string, _ ...interface{})     {}
11
 func (n noopLogger) Info(_ string)                         {}
12
 func (n noopLogger) Info(_ string)                         {}
12
 func (n noopLogger) Warning(_ string)                      {}
13
 func (n noopLogger) Warning(_ string)                      {}

+ 14
- 0
logger/zerolog.go Ver arquivo

15
 	zeroLogContextVarTypeUnknown zeroLogContextVarType = iota
15
 	zeroLogContextVarTypeUnknown zeroLogContextVarType = iota
16
 	zeroLogContextVarTypeStr
16
 	zeroLogContextVarTypeStr
17
 	zeroLogContextVarTypeInt
17
 	zeroLogContextVarTypeInt
18
+	zeroLogContextVarTypeJSON
18
 )
19
 )
19
 
20
 
20
 type zeroLogContext struct {
21
 type zeroLogContext struct {
66
 	}
67
 	}
67
 }
68
 }
68
 
69
 
70
+func (z *zeroLogContext) BindJSON(name, value string) mtglib.Logger {
71
+	return &zeroLogContext{
72
+		name:       z.name,
73
+		log:        z.log,
74
+		ctxVarType: zeroLogContextVarTypeJSON,
75
+		ctxVarName: name,
76
+		ctxVarStr:  value,
77
+		parent:     z,
78
+	}
79
+}
80
+
69
 func (z *zeroLogContext) Printf(format string, args ...interface{}) {
81
 func (z *zeroLogContext) Printf(format string, args ...interface{}) {
70
 	z.Debug(fmt.Sprintf(format, args...))
82
 	z.Debug(fmt.Sprintf(format, args...))
71
 }
83
 }
110
 		evt.Str(z.ctxVarName, z.ctxVarStr)
122
 		evt.Str(z.ctxVarName, z.ctxVarStr)
111
 	case zeroLogContextVarTypeInt:
123
 	case zeroLogContextVarTypeInt:
112
 		evt.Int(z.ctxVarName, z.ctxVarInt)
124
 		evt.Int(z.ctxVarName, z.ctxVarInt)
125
+	case zeroLogContextVarTypeJSON:
126
+		evt.RawJSON(z.ctxVarName, []byte(z.ctxVarStr))
113
 	case zeroLogContextVarTypeUnknown:
127
 	case zeroLogContextVarTypeUnknown:
114
 	}
128
 	}
115
 }
129
 }

+ 3
- 0
mtglib/init.go Ver arquivo

245
 	// BindStr binds new string parameter to a new logger instance.
245
 	// BindStr binds new string parameter to a new logger instance.
246
 	BindStr(name, value string) Logger
246
 	BindStr(name, value string) Logger
247
 
247
 
248
+	// BindJSON binds a new JSON-encoded string to a new logger instance.
249
+	BindJSON(name, value string) Logger
250
+
248
 	// Printf is to support log.Logger behavior.
251
 	// Printf is to support log.Logger behavior.
249
 	Printf(format string, args ...interface{})
252
 	Printf(format string, args ...interface{})
250
 
253
 

+ 1
- 0
mtglib/init_internal_test.go Ver arquivo

11
 func (n NoopLogger) Named(_ string) Logger             { return n }
11
 func (n NoopLogger) Named(_ string) Logger             { return n }
12
 func (n NoopLogger) BindInt(_ string, _ int) Logger    { return n }
12
 func (n NoopLogger) BindInt(_ string, _ int) Logger    { return n }
13
 func (n NoopLogger) BindStr(_, _ string) Logger        { return n }
13
 func (n NoopLogger) BindStr(_, _ string) Logger        { return n }
14
+func (n NoopLogger) BindJSON(_, _ string) Logger       { return n }
14
 func (n NoopLogger) Printf(_ string, _ ...interface{}) {}
15
 func (n NoopLogger) Printf(_ string, _ ...interface{}) {}
15
 func (n NoopLogger) Info(_ string)                     {}
16
 func (n NoopLogger) Info(_ string)                     {}
16
 func (n NoopLogger) Warning(_ string)                  {}
17
 func (n NoopLogger) Warning(_ string)                  {}

+ 8
- 0
mtglib/internal/telegram/address_pool.go Ver arquivo

7
 	v6 [][]tgAddr
7
 	v6 [][]tgAddr
8
 }
8
 }
9
 
9
 
10
+func (a addressPool) isValidDC(dc int) bool {
11
+	return dc > 0 && dc <= len(a.v4) && dc <= len(a.v6)
12
+}
13
+
14
+func (a addressPool) getRandomDC() int {
15
+	return 1 + rand.Intn(len(a.v4))
16
+}
17
+
10
 func (a addressPool) getV4(dc int) []tgAddr {
18
 func (a addressPool) getV4(dc int) []tgAddr {
11
 	return a.get(a.v4, dc-1)
19
 	return a.get(a.v4, dc-1)
12
 }
20
 }

+ 8
- 0
mtglib/internal/telegram/telegram.go Ver arquivo

42
 	return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
42
 	return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
43
 }
43
 }
44
 
44
 
45
+func (t Telegram) IsKnownDC(dc int) bool {
46
+	return t.pool.isValidDC(dc)
47
+}
48
+
49
+func (t Telegram) GetFallbackDC() int {
50
+	return t.pool.getRandomDC()
51
+}
52
+
45
 func New(dialer Dialer, ipPreference string, useTestDCs bool) (*Telegram, error) {
53
 func New(dialer Dialer, ipPreference string, useTestDCs bool) (*Telegram, error) {
46
 	var pref preferIP
54
 	var pref preferIP
47
 
55
 

+ 18
- 0
mtglib/internal/telegram/telegram_internal_test.go Ver arquivo

44
 		suite.T().Run(strconv.Itoa(value), func(t *testing.T) {
44
 		suite.T().Run(strconv.Itoa(value), func(t *testing.T) {
45
 			_, err := suite.t.Dial(context.Background(), value)
45
 			_, err := suite.t.Dial(context.Background(), value)
46
 			assert.Error(t, err)
46
 			assert.Error(t, err)
47
+			assert.False(t, suite.t.IsKnownDC(value))
47
 		})
48
 		})
48
 	}
49
 	}
49
 }
50
 }
71
 
72
 
72
 			_, err := suite.t.Dial(context.Background(), idx)
73
 			_, err := suite.t.Dial(context.Background(), idx)
73
 			assert.True(t, errors.Is(err, io.EOF))
74
 			assert.True(t, errors.Is(err, io.EOF))
75
+			assert.True(t, suite.t.IsKnownDC(idx))
74
 		})
76
 		})
75
 	}
77
 	}
76
 }
78
 }
135
 	suite.Error(err)
137
 	suite.Error(err)
136
 }
138
 }
137
 
139
 
140
+func (suite *TelegramTestSuite) TestFallbackDC() {
141
+	dcs := make([]int, 10)
142
+
143
+	for i := 0; i < len(dcs); i++ {
144
+		dcs[i] = suite.t.GetFallbackDC()
145
+	}
146
+
147
+	for _, v := range dcs {
148
+		value := v
149
+
150
+		suite.T().Run(strconv.Itoa(value), func(t *testing.T) {
151
+			assert.True(t, suite.t.IsKnownDC(value))
152
+		})
153
+	}
154
+}
155
+
138
 func TestTelegram(t *testing.T) {
156
 func TestTelegram(t *testing.T) {
139
 	t.Parallel()
157
 	t.Parallel()
140
 	suite.Run(t, &TelegramTestSuite{})
158
 	suite.Run(t, &TelegramTestSuite{})

+ 29
- 18
mtglib/proxy.go Ver arquivo

23
 	ctxCancel       context.CancelFunc
23
 	ctxCancel       context.CancelFunc
24
 	streamWaitGroup sync.WaitGroup
24
 	streamWaitGroup sync.WaitGroup
25
 
25
 
26
-	tolerateTimeSkewness time.Duration
27
-	bufferSize           int
28
-	domainFrontingPort   int
29
-	workerPool           *ants.PoolWithFunc
30
-	telegram             *telegram.Telegram
26
+	allowFallbackOnUnknownDC bool
27
+	tolerateTimeSkewness     time.Duration
28
+	bufferSize               int
29
+	domainFrontingPort       int
30
+	workerPool               *ants.PoolWithFunc
31
+	telegram                 *telegram.Telegram
31
 
32
 
32
 	secret          Secret
33
 	secret          Secret
33
 	network         Network
34
 	network         Network
207
 }
208
 }
208
 
209
 
209
 func (p *Proxy) doTelegramCall(ctx *streamContext) error {
210
 func (p *Proxy) doTelegramCall(ctx *streamContext) error {
210
-	conn, err := p.telegram.Dial(ctx, ctx.dc)
211
+	dc := ctx.dc
212
+
213
+	if p.allowFallbackOnUnknownDC && !p.telegram.IsKnownDC(dc) {
214
+		dc = p.telegram.GetFallbackDC()
215
+		ctx.logger = ctx.logger.BindInt("fallback_dc", dc)
216
+
217
+		ctx.logger.Warning("unknown DC, fallbacks")
218
+	}
219
+
220
+	conn, err := p.telegram.Dial(ctx, dc)
211
 	if err != nil {
221
 	if err != nil {
212
 		return fmt.Errorf("cannot dial to Telegram: %w", err)
222
 		return fmt.Errorf("cannot dial to Telegram: %w", err)
213
 	}
223
 	}
276
 
286
 
277
 	ctx, cancel := context.WithCancel(context.Background())
287
 	ctx, cancel := context.WithCancel(context.Background())
278
 	proxy := &Proxy{
288
 	proxy := &Proxy{
279
-		ctx:                  ctx,
280
-		ctxCancel:            cancel,
281
-		secret:               opts.Secret,
282
-		network:              opts.Network,
283
-		antiReplayCache:      opts.AntiReplayCache,
284
-		ipBlocklist:          opts.IPBlocklist,
285
-		eventStream:          opts.EventStream,
286
-		logger:               opts.getLogger("proxy"),
287
-		domainFrontingPort:   opts.getDomainFrontingPort(),
288
-		tolerateTimeSkewness: opts.getTolerateTimeSkewness(),
289
-		bufferSize:           opts.getBufferSize(),
290
-		telegram:             tg,
289
+		ctx:                      ctx,
290
+		ctxCancel:                cancel,
291
+		secret:                   opts.Secret,
292
+		network:                  opts.Network,
293
+		antiReplayCache:          opts.AntiReplayCache,
294
+		ipBlocklist:              opts.IPBlocklist,
295
+		eventStream:              opts.EventStream,
296
+		logger:                   opts.getLogger("proxy"),
297
+		domainFrontingPort:       opts.getDomainFrontingPort(),
298
+		tolerateTimeSkewness:     opts.getTolerateTimeSkewness(),
299
+		bufferSize:               opts.getBufferSize(),
300
+		allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
301
+		telegram:                 tg,
291
 	}
302
 	}
292
 
303
 
293
 	pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
304
 	pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),

+ 10
- 0
mtglib/proxy_opts.go Ver arquivo

90
 	// This is an optional setting.
90
 	// This is an optional setting.
91
 	DomainFrontingPort uint
91
 	DomainFrontingPort uint
92
 
92
 
93
+	// AllowFallbackOnUnknownDC defines how proxy behaves if unknown DC was
94
+	// requested. If this setting is set to false, then such connection
95
+	// will be rejected. Otherwise, proxy will chose any DC.
96
+	//
97
+	// Telegram is designed in a way that any DC can serve any request,
98
+	// the problem is a latency.
99
+	//
100
+	// This is an optional setting.
101
+	AllowFallbackOnUnknownDC bool
102
+
93
 	// UseTestDCs defines if we have to connect to production or to staging
103
 	// UseTestDCs defines if we have to connect to production or to staging
94
 	// DCs of Telegram.
104
 	// DCs of Telegram.
95
 	//
105
 	//

+ 4
- 16
network/sockopts.go Ver arquivo

3
 import (
3
 import (
4
 	"fmt"
4
 	"fmt"
5
 	"net"
5
 	"net"
6
-
7
-	"golang.org/x/sys/unix"
8
 )
6
 )
9
 
7
 
10
 // SetClientSocketOptions tunes a TCP socket that represents a connection to
8
 // SetClientSocketOptions tunes a TCP socket that represents a connection to
50
 
48
 
51
 	rawConn, err := conn.SyscallConn()
49
 	rawConn, err := conn.SyscallConn()
52
 	if err != nil {
50
 	if err != nil {
53
-		return fmt.Errorf("cannot get underlying raw connection")
51
+		return fmt.Errorf("cannot get underlying raw connection: %w", err)
54
 	}
52
 	}
55
 
53
 
56
-	rawConn.Control(func(fd uintptr) { // nolint: errcheck
57
-		err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
58
-		if err != nil {
59
-			err = fmt.Errorf("cannot set SO_REUSEADDR: %w", err)
60
-
61
-			return
62
-		}
63
-
64
-		err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1)
65
-		if err != nil {
66
-			err = fmt.Errorf("cannot set SO_REUSEPORT: %w", err)
67
-		}
68
-	})
54
+	if err := setSocketReuseAddrPort(rawConn, bufferSize); err != nil {
55
+		return fmt.Errorf("cannot setup SO_REUSEADDR/PORT: %w", err)
56
+	}
69
 
57
 
70
 	return nil
58
 	return nil
71
 }
59
 }

+ 31
- 0
network/sockopts_unix.go Ver arquivo

1
+//go:build !windows
2
+// +build !windows
3
+
4
+package network
5
+
6
+import (
7
+	"fmt"
8
+	"syscall"
9
+
10
+	"golang.org/x/sys/unix"
11
+)
12
+
13
+func setSocketReuseAddrPort(conn syscall.RawConn, bufferSize int) error {
14
+	var err error
15
+
16
+	conn.Control(func(fd uintptr) { // nolint: errcheck
17
+		err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
18
+		if err != nil {
19
+			err = fmt.Errorf("cannot set SO_REUSEADDR: %w", err)
20
+
21
+			return
22
+		}
23
+
24
+		err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1)
25
+		if err != nil {
26
+			err = fmt.Errorf("cannot set SO_REUSEPORT: %w", err)
27
+		}
28
+	})
29
+
30
+	return err
31
+}

+ 10
- 0
network/sockopts_windows.go Ver arquivo

1
+//go:build windows
2
+// +build windows
3
+
4
+package network
5
+
6
+import "syscall"
7
+
8
+func setSocketReuseAddrPort(conn syscall.RawConn, bufferSize int) error {
9
+	return nil
10
+}

Carregando…
Cancelar
Salvar