Skip to content

Commit 63134c8

Browse files
committed
fix:修复panic恢复机制
1 parent 3a1baa2 commit 63134c8

7 files changed

Lines changed: 121 additions & 30 deletions

File tree

.github/workflows/ci.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ jobs:
1212
runs-on: ${{ matrix.os }}
1313
steps:
1414
- name: Checkout
15-
uses: actions/checkout@v2
15+
uses: actions/checkout@v6
1616
- name: Setup Go
17-
uses: actions/setup-go@v2
17+
uses: actions/setup-go@v6
1818
with:
1919
go-version: ${{ matrix.go }}
2020
- name: Test
@@ -25,7 +25,7 @@ jobs:
2525
run: |
2626
git config --global user.name 'github-actions'
2727
git config --global user.email 'github-actions@github.com'
28-
TAG="v0.0.11-$(date +'%Y%m%d%H%M%S')"
28+
TAG="v0.0.12-$(date +'%Y%m%d%H%M%S')"
2929
git tag $TAG
3030
git push origin $TAG
3131
echo "TAG=$TAG" >> $GITHUB_ENV

.github/workflows/main.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ jobs:
1515
runs-on: ubuntu-latest
1616
steps:
1717
- name: Checkout code
18-
uses: actions/checkout@v3
18+
uses: actions/checkout@v6
1919

2020
- name: Set up Go
21-
uses: actions/setup-go@v3
21+
uses: actions/setup-go@v6
2222
with:
2323
go-version: 'stable'
2424

@@ -44,10 +44,10 @@ jobs:
4444
needs: build
4545
steps:
4646
- name: Checkout code
47-
uses: actions/checkout@v3
47+
uses: actions/checkout@v6
4848

4949
- name: Set up Go
50-
uses: actions/setup-go@v3
50+
uses: actions/setup-go@v6
5151
with:
5252
go-version: 'stable'
5353

cmd/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77
"os"
88
"strings"
9+
"time"
910

1011
. "github.com/oneclickvirt/defaultset"
1112
"github.com/oneclickvirt/speedtest/model"
@@ -14,7 +15,11 @@ import (
1415

1516
func main() {
1617
go func() {
17-
http.Get("https://hits.spiritlhl.net/speedtest.svg?action=hit&title=Hits&title_bg=%23555555&count_bg=%230eecf8&edge_flat=false")
18+
client := &http.Client{Timeout: 3 * time.Second}
19+
resp, err := client.Get("https://hits.spiritlhl.net/speedtest.svg?action=hit&title=Hits&title_bg=%23555555&count_bg=%230eecf8&edge_flat=false")
20+
if err == nil && resp != nil {
21+
resp.Body.Close()
22+
}
1823
}()
1924
fmt.Println("项目地址:", Blue("https://github.com/oneclickvirt/speedtest"))
2025
var showVersion, nearByServer, showHead, help bool

model/model.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package model
22

3-
const SpeedTestVersion = "v0.0.11"
3+
const SpeedTestVersion = "v0.0.12"
44

55
var EnableLoger = false
66
var (

sp/logger.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package sp
2+
3+
import "log"
4+
5+
type simpleLogger struct{}
6+
7+
func (l *simpleLogger) Info(msg string) {
8+
log.Printf("[speedtest] %s", msg)
9+
}
10+
11+
func (l *simpleLogger) Sync() error {
12+
return nil
13+
}
14+
15+
var Logger = &simpleLogger{}
16+
17+
func InitLogger() {}

sp/sp.go

Lines changed: 81 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"strings"
88
"time"
99

10-
. "github.com/oneclickvirt/defaultset"
1110
"github.com/oneclickvirt/speedtest/model"
1211
"github.com/showwin/speedtest-go/speedtest"
1312
"github.com/showwin/speedtest-go/speedtest/transport"
@@ -120,6 +119,9 @@ func OfficialCustomSpeedTest(url, byWhat string, num int, language string) {
120119
var err error
121120
serverMap := make(map[time.Duration]*speedtest.Server)
122121
for _, server := range targets {
122+
if server == nil {
123+
continue
124+
}
123125
err = server.PingTest(nil)
124126
if err != nil {
125127
server.Latency = 1000 * time.Millisecond
@@ -133,18 +135,22 @@ func OfficialCustomSpeedTest(url, byWhat string, num int, language string) {
133135
sort.Slice(pingList, func(i, j int) bool {
134136
return pingList[i] < pingList[j]
135137
})
136-
if num == -1 || num >= len(pingList) {
137-
num = len(pingList)
138-
} else if len(pingList) == 0 {
138+
if len(pingList) == 0 {
139139
fmt.Println("No match servers")
140140
if model.EnableLoger {
141141
Logger.Info("No match servers")
142142
}
143143
return
144144
}
145+
if num == -1 || num >= len(pingList) {
146+
num = len(pingList)
147+
}
145148
var serverName, UPStr, DLStr, Latency, PacketLoss string
146149
for i := 0; i < len(pingList); i++ {
147150
server := serverMap[pingList[i]]
151+
if server == nil {
152+
continue
153+
}
148154
if i < num {
149155
// speedtest --progress=no --accept-license --accept-gdpr
150156
sptCheck := execCommand("speedtest", "--progress=no", "--server-id="+server.ID, "--accept-license", "--accept-gdpr")
@@ -191,26 +197,65 @@ func NearbySpeedTest() {
191197
InitLogger()
192198
defer Logger.Sync()
193199
}
194-
serverList, _ := speedtestClient.FetchServers()
195-
targets, _ := serverList.FindServer([]int{})
200+
serverList, err := speedtestClient.FetchServers()
201+
if err != nil || serverList == nil {
202+
if model.EnableLoger && err != nil {
203+
Logger.Info(err.Error())
204+
}
205+
return
206+
}
207+
targets, err := serverList.FindServer([]int{})
208+
if err != nil {
209+
if model.EnableLoger {
210+
Logger.Info(err.Error())
211+
}
212+
return
213+
}
196214
analyzer := speedtest.NewPacketLossAnalyzer(nil)
197215
var LowestLatency time.Duration
198216
var NearbyServer *speedtest.Server
199217
var PacketLoss string
200218
for _, server := range targets {
201-
server.PingTest(nil)
219+
if server == nil {
220+
continue
221+
}
222+
if err := server.PingTest(nil); err != nil {
223+
if model.EnableLoger {
224+
Logger.Info(err.Error())
225+
}
226+
continue
227+
}
202228
if LowestLatency == 0 && NearbyServer == nil {
203229
LowestLatency = server.Latency
204230
NearbyServer = server
205231
} else if server.Latency < LowestLatency && NearbyServer != nil {
232+
LowestLatency = server.Latency
206233
NearbyServer = server
207234
}
208-
server.Context.Reset()
235+
if server.Context != nil {
236+
server.Context.Reset()
237+
}
209238
}
210239
if NearbyServer != nil {
211-
NearbyServer.DownloadTest()
212-
NearbyServer.UploadTest()
240+
err = NearbyServer.DownloadTest()
241+
if err != nil {
242+
if model.EnableLoger {
243+
Logger.Info(err.Error())
244+
}
245+
return
246+
}
247+
err = NearbyServer.UploadTest()
248+
if err != nil {
249+
if model.EnableLoger {
250+
Logger.Info(err.Error())
251+
}
252+
return
253+
}
213254
err := analyzer.Run(NearbyServer.Host, func(packetLoss *transport.PLoss) {
255+
if packetLoss == nil {
256+
PacketLoss = "N/A"
257+
return
258+
}
214259
PacketLoss = strings.ReplaceAll(packetLoss.String(), "Packet Loss: ", "")
215260
})
216261
if err == nil {
@@ -220,7 +265,9 @@ func NearbySpeedTest() {
220265
fmt.Print(formatString(NearbyServer.Latency.String(), 16))
221266
fmt.Print(formatString(PacketLoss, 16))
222267
fmt.Println()
223-
NearbyServer.Context.Reset()
268+
if NearbyServer.Context != nil {
269+
NearbyServer.Context.Reset()
270+
}
224271
} else if model.EnableLoger {
225272
Logger.Info(err.Error())
226273
}
@@ -243,6 +290,9 @@ func CustomSpeedTest(url, byWhat string, num int, language string) {
243290
var err, err1, err2, err3 error
244291
serverMap := make(map[time.Duration]*speedtest.Server)
245292
for _, server := range targets {
293+
if server == nil {
294+
continue
295+
}
246296
err = server.PingTest(nil)
247297
if err != nil {
248298
server.Latency = 1000 * time.Millisecond
@@ -258,21 +308,29 @@ func CustomSpeedTest(url, byWhat string, num int, language string) {
258308
})
259309
analyzer := speedtest.NewPacketLossAnalyzer(nil)
260310
var PacketLoss string
261-
if num == -1 || num >= len(pingList) {
262-
num = len(pingList)
263-
} else if len(pingList) == 0 {
311+
if len(pingList) == 0 {
264312
fmt.Println("No match servers")
265313
if model.EnableLoger {
266314
Logger.Info("No match servers")
267315
}
268316
return
269317
}
318+
if num == -1 || num >= len(pingList) {
319+
num = len(pingList)
320+
}
270321
for i := 0; i < len(pingList); i++ {
271322
server := serverMap[pingList[i]]
323+
if server == nil {
324+
continue
325+
}
272326
if i < num {
273327
err1 = server.DownloadTest()
274328
err2 = server.UploadTest()
275329
err3 = analyzer.Run(server.Host, func(packetLoss *transport.PLoss) {
330+
if packetLoss == nil {
331+
PacketLoss = "N/A"
332+
return
333+
}
276334
PacketLoss = strings.ReplaceAll(packetLoss.String(), "Packet Loss: ", "")
277335
})
278336
if err3 != nil {
@@ -287,15 +345,19 @@ func CustomSpeedTest(url, byWhat string, num int, language string) {
287345
Logger.Info(server.ID)
288346
Logger.Info(err1.Error())
289347
}
290-
server.Context.Reset()
348+
if server.Context != nil {
349+
server.Context.Reset()
350+
}
291351
continue
292352
}
293353
if err2 != nil {
294354
if model.EnableLoger {
295355
Logger.Info(server.ID)
296356
Logger.Info(err2.Error())
297357
}
298-
server.Context.Reset()
358+
if server.Context != nil {
359+
server.Context.Reset()
360+
}
299361
continue
300362
}
301363
if language == "zh" {
@@ -315,6 +377,8 @@ func CustomSpeedTest(url, byWhat string, num int, language string) {
315377
fmt.Print(formatString(PacketLoss, 16))
316378
fmt.Println()
317379
}
318-
server.Context.Reset()
380+
if server.Context != nil {
381+
server.Context.Reset()
382+
}
319383
}
320384
}

sp/utils.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"unicode/utf8"
1111

1212
"github.com/imroc/req/v3"
13-
. "github.com/oneclickvirt/defaultset"
1413
"github.com/oneclickvirt/speedtest/model"
1514
"github.com/showwin/speedtest-go/speedtest"
1615
)
@@ -29,7 +28,7 @@ func checkCDN(baseUrl string) bool {
2928
client.SetTimeout(6 * time.Second)
3029

3130
resp, err := client.R().Get(testUrl)
32-
if err != nil {
31+
if err != nil || resp == nil {
3332
return false
3433
}
3534
defer resp.Body.Close()
@@ -73,7 +72,7 @@ func getData(endpoint string) string {
7372
}
7473
// Try direct access without CDN
7574
resp, err := client.R().Get(endpoint)
76-
if err == nil {
75+
if err == nil && resp != nil {
7776
defer resp.Body.Close()
7877
b, err := io.ReadAll(resp.Body)
7978
if err == nil && !strings.Contains(string(b), "error") {
@@ -92,7 +91,7 @@ func getData(endpoint string) string {
9291
// Use the available CDN
9392
url := availableCdn + endpoint
9493
resp, err := client.R().Get(url)
95-
if err == nil {
94+
if err == nil && resp != nil {
9695
defer resp.Body.Close()
9796
b, err := io.ReadAll(resp.Body)
9897
if err == nil && !strings.Contains(string(b), "error") {
@@ -173,6 +172,9 @@ func parseDataFromURL(data, url string) speedtest.Servers {
173172
}
174173
continue
175174
}
175+
if target == nil {
176+
continue
177+
}
176178
target.Name = record[10] + record[7] + record[8]
177179
targets = append(targets, target)
178180
}
@@ -229,6 +231,9 @@ func parseDataFromID(data, url string) speedtest.Servers {
229231
}
230232
continue
231233
}
234+
if serverPtr == nil {
235+
continue
236+
}
232237

233238
if strings.Contains(url, "Mobile") {
234239
serverPtr.Name = "移动" + record[3]

0 commit comments

Comments
 (0)