From 1c5e7527ef89b57c229204e0528df8d7bcd0bb3d Mon Sep 17 00:00:00 2001 From: ahmadgika Date: Sun, 11 Feb 2024 00:55:18 +0700 Subject: [PATCH 1/9] feat: validate the cc when using city params --- speedtest/server.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/speedtest/server.go b/speedtest/server.go index 0a592a4..43e7aee 100644 --- a/speedtest/server.go +++ b/speedtest/server.go @@ -51,6 +51,7 @@ type Server struct { DLSpeed float64 `json:"dl_speed"` ULSpeed float64 `json:"ul_speed"` TestDuration TestDuration `json:"test_duration"` + CC string `json:"cc"` Context *Speedtest `json:"-"` } @@ -254,6 +255,14 @@ func (s *Speedtest) FetchServerListContext(ctx context.Context) (Servers, error) if err = decoder.Decode(&servers); err != nil { return servers, err } + if s.config.Location != nil { + for _, server := range servers { + if server.CC != strings.ToUpper(s.config.Location.CC) { + servers = append(servers[:0], servers[1:]...) + } + } + + } case typeXMLPayload: var list ServerList // Decode xml From 9e912b8194638c686e4a41d9a475692aff50dcfe Mon Sep 17 00:00:00 2001 From: ahmadgika Date: Sun, 11 Feb 2024 14:18:24 +0700 Subject: [PATCH 2/9] fix: add tmpVar --- speedtest/server.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/speedtest/server.go b/speedtest/server.go index 43e7aee..06e36fe 100644 --- a/speedtest/server.go +++ b/speedtest/server.go @@ -256,12 +256,13 @@ func (s *Speedtest) FetchServerListContext(ctx context.Context) (Servers, error) return servers, err } if s.config.Location != nil { + var tmpServers Servers for _, server := range servers { - if server.CC != strings.ToUpper(s.config.Location.CC) { - servers = append(servers[:0], servers[1:]...) + if server.CC == strings.ToUpper(s.config.Location.CC) { + tmpServers = append(tmpServers, server) } } - + servers = tmpServers } case typeXMLPayload: var list ServerList From 9db022754b37514818569e68f4d23daf5f876040 Mon Sep 17 00:00:00 2001 From: ahmadgika Date: Sun, 11 Feb 2024 14:18:39 +0700 Subject: [PATCH 3/9] feat: add test for validating cc --- speedtest/server_test.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/speedtest/server_test.go b/speedtest/server_test.go index aef1d39..1e7f325 100644 --- a/speedtest/server_test.go +++ b/speedtest/server_test.go @@ -3,6 +3,7 @@ package speedtest import ( "math" "math/rand" + "strings" "testing" "time" ) @@ -195,3 +196,19 @@ func TestTotalDurationCount(t *testing.T) { t.Error("addition in testDurationTotalCount didn't work") } } + +func TestCityFlag(t *testing.T) { + client := New(WithUserConfig(&UserConfig{CityFlag: "yishun"})) + servers, err := client.FetchServers() + if err != nil { + t.Errorf(err.Error()) + } + row := 1 + for _, server := range servers { + + if server.CC != strings.ToUpper(client.config.Location.CC) { + t.Error("server country code does not match client country code") + } + row++ + } +} From a0d6ca255b64c493f70928c02f9e3d23ca744bba Mon Sep 17 00:00:00 2001 From: gandol Date: Sun, 11 Feb 2024 17:43:41 +0700 Subject: [PATCH 4/9] Update speedtest/server_test.go Co-authored-by: r3inbowari --- speedtest/server_test.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/speedtest/server_test.go b/speedtest/server_test.go index 1e7f325..310750c 100644 --- a/speedtest/server_test.go +++ b/speedtest/server_test.go @@ -198,17 +198,21 @@ func TestTotalDurationCount(t *testing.T) { } func TestCityFlag(t *testing.T) { - client := New(WithUserConfig(&UserConfig{CityFlag: "yishun"})) - servers, err := client.FetchServers() - if err != nil { - t.Errorf(err.Error()) - } - row := 1 - for _, server := range servers { - - if server.CC != strings.ToUpper(client.config.Location.CC) { - t.Error("server country code does not match client country code") + testCC := "YISHUN" + testData := Servers{ + {CC: "YISHUN"}, + {CC: "TOKYO"}, + {CC: "YISHUN"}, + {CC: "TEST"}, + } + + var tmpServers Servers + for _, server := range testData { + if server.CC == strings.ToUpper(testCC) { + tmpServers = append(tmpServers, server) } - row++ + } + if tmpServers.Len() != 2 && tmpServers[0].CC != testCC { + t.Fatalf("not match: %s", testCC) } } From f08ae55cdee781427c42602784bcca4293b0be23 Mon Sep 17 00:00:00 2001 From: ahmadgika Date: Sat, 2 Mar 2024 17:38:31 +0700 Subject: [PATCH 5/9] feat: add new param for config --- speedtest.go | 5 ++++- speedtest/speedtest.go | 5 +++-- speedtest/user.go | 9 +++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/speedtest.go b/speedtest.go index 23c0a7e..07cc70e 100644 --- a/speedtest.go +++ b/speedtest.go @@ -3,12 +3,13 @@ package main import ( "context" "fmt" - "gopkg.in/alecthomas/kingpin.v2" "os" "strconv" "strings" "time" + "gopkg.in/alecthomas/kingpin.v2" + "github.com/showwin/speedtest-go/speedtest" ) @@ -30,6 +31,7 @@ var ( noUpload = kingpin.Flag("no-upload", "Disable upload test.").Bool() pingMode = kingpin.Flag("ping-mode", "Select a method for Ping. (support icmp/tcp/http)").Default("http").String() debug = kingpin.Flag("debug", "Enable debug mode.").Short('d').Bool() + countryCode = kingpin.Flag("cc", "Filter By Country Code").String() ) func main() { @@ -52,6 +54,7 @@ func main() { Keyword: *search, NoDownload: *noDownload, NoUpload: *noUpload, + CountryCode: *countryCode, })) speedtestClient.SetNThread(*thread) diff --git a/speedtest/speedtest.go b/speedtest/speedtest.go index c52250a..0e72eef 100644 --- a/speedtest/speedtest.go +++ b/speedtest/speedtest.go @@ -50,8 +50,9 @@ type UserConfig struct { Keyword string // Fuzzy search - NoDownload bool - NoUpload bool + NoDownload bool + NoUpload bool + CountryCode string } func parseAddr(addr string) (string, string) { diff --git a/speedtest/user.go b/speedtest/user.go index 1bb0ae0..8959fbf 100644 --- a/speedtest/user.go +++ b/speedtest/user.go @@ -12,10 +12,11 @@ const speedTestConfigUrl = "https://www.speedtest.net/speedtest-config.php" // User represents information determined about the caller by speedtest.net type User struct { - IP string `xml:"ip,attr"` - Lat string `xml:"lat,attr"` - Lon string `xml:"lon,attr"` - Isp string `xml:"isp,attr"` + IP string `xml:"ip,attr"` + Lat string `xml:"lat,attr"` + Lon string `xml:"lon,attr"` + Isp string `xml:"isp,attr"` + Country string `xml:"country,attr"` } // Users for decode xml From 65b9936ec2f248b41909fad47ca38aad3266c243 Mon Sep 17 00:00:00 2001 From: ahmadgika Date: Sat, 2 Mar 2024 17:38:59 +0700 Subject: [PATCH 6/9] feat: if params --cc was passed use the cc --- speedtest/server.go | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/speedtest/server.go b/speedtest/server.go index 06e36fe..214fd5b 100644 --- a/speedtest/server.go +++ b/speedtest/server.go @@ -213,6 +213,23 @@ func (s *Speedtest) FetchServerListContext(ctx context.Context) (Servers, error) query.Set("lat", strconv.FormatFloat(s.config.Location.Lat, 'f', -1, 64)) query.Set("lon", strconv.FormatFloat(s.config.Location.Lon, 'f', -1, 64)) } + + if len(s.config.CountryCode) > 0 { + var lowerCode = strings.ToLower(s.config.CountryCode) + var lat float64 = 0 + var lon float64 = 0 + for _, v := range Locations { + if v.CC == lowerCode { + lat = v.Lat + lon = v.Lon + } + } + if lat != 0 && lon != 0 { + query.Set("lat", strconv.FormatFloat(lat, 'f', -1, 64)) + query.Set("lon", strconv.FormatFloat(lon, 'f', -1, 64)) + } + } + u.RawQuery = query.Encode() dbg.Printf("Retrieving servers: %s\n", u.String()) req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) @@ -255,15 +272,25 @@ func (s *Speedtest) FetchServerListContext(ctx context.Context) (Servers, error) if err = decoder.Decode(&servers); err != nil { return servers, err } + var CountryCode = "" if s.config.Location != nil { - var tmpServers Servers - for _, server := range servers { - if server.CC == strings.ToUpper(s.config.Location.CC) { - tmpServers = append(tmpServers, server) - } + CountryCode = strings.ToUpper(s.config.Location.CC) + } else if len(s.config.CountryCode) > 0 { + CountryCode = strings.ToUpper(s.config.CountryCode) + } else { + defaultConfig, err := FetchUserInfo() + if err != nil { + return servers, err + } + CountryCode = defaultConfig.Country + } + var tmpServers Servers + for _, server := range servers { + if server.CC == CountryCode { + tmpServers = append(tmpServers, server) } - servers = tmpServers } + servers = tmpServers case typeXMLPayload: var list ServerList // Decode xml From 89d46a999f9747480905fa639560f29dbc6267b8 Mon Sep 17 00:00:00 2001 From: r3inbowari Date: Sun, 3 Mar 2024 03:51:25 +0800 Subject: [PATCH 7/9] update cc filter --- speedtest.go | 15 ++++++++--- speedtest/server.go | 54 ++++++++++++++-------------------------- speedtest/server_test.go | 8 +----- speedtest/speedtest.go | 5 ++-- speedtest/user.go | 3 +++ 5 files changed, 37 insertions(+), 48 deletions(-) diff --git a/speedtest.go b/speedtest.go index 0869c4d..8dc8aed 100644 --- a/speedtest.go +++ b/speedtest.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "os" + "slices" "strconv" "strings" "time" @@ -32,7 +33,7 @@ var ( noUpload = kingpin.Flag("no-upload", "Disable upload test.").Bool() pingMode = kingpin.Flag("ping-mode", "Select a method for Ping. (support icmp/tcp/http)").Default("http").String() debug = kingpin.Flag("debug", "Enable debug mode.").Short('d').Bool() - countryCode = kingpin.Flag("cc", "Filter By Country Code").String() + countryCode = kingpin.Flag("filter-cc", "Filter servers by Country Code(s).").Default("disable").Strings() ) func main() { @@ -56,7 +57,6 @@ func main() { Keyword: *search, NoDownload: *noDownload, NoUpload: *noUpload, - CountryCode: *countryCode, })) speedtestClient.SetNThread(*thread) @@ -99,7 +99,16 @@ func main() { } else { servers, err = speedtestClient.FetchServers() task.CheckError(err) - task.Printf("Found %d Public Servers", len(servers)) + // cc filter auto attach + if slices.Contains(*countryCode, "auto") { + *countryCode = append(*countryCode, speedtestClient.User.Country) + } + if len(*countryCode) > 0 { + servers = servers.CC(*countryCode) + task.Printf("Found %d Public Servers with Country Code[%v]", len(servers), strings.Join(*countryCode, ",")) + } else { + task.Printf("Found %d Public Servers", len(servers)) + } if *showList { task.Complete() task.manager.Reset() diff --git a/speedtest/server.go b/speedtest/server.go index 214fd5b..72ccb21 100644 --- a/speedtest/server.go +++ b/speedtest/server.go @@ -9,6 +9,7 @@ import ( "math" "net/http" "net/url" + "slices" "sort" "strconv" "strings" @@ -134,6 +135,24 @@ func (servers Servers) Swap(i, j int) { servers[i], servers[j] = servers[j], servers[i] } +// Filter filter by filterFunc +func (servers Servers) Filter(filterFunc func(server *Server) bool) Servers { + var retServers Servers + for i := range servers { + if filterFunc(servers[i]) { + retServers = append(retServers, servers[i]) + } + } + return retServers +} + +// CC filter by Country Code +func (servers Servers) CC(cc []string) Servers { + return servers.Filter(func(server *Server) bool { + return slices.Contains(cc, server.CC) + }) +} + // Less compares the distance. For sorting servers. func (b ByDistance) Less(i, j int) bool { return b.Servers[i].Distance < b.Servers[j].Distance @@ -214,22 +233,6 @@ func (s *Speedtest) FetchServerListContext(ctx context.Context) (Servers, error) query.Set("lon", strconv.FormatFloat(s.config.Location.Lon, 'f', -1, 64)) } - if len(s.config.CountryCode) > 0 { - var lowerCode = strings.ToLower(s.config.CountryCode) - var lat float64 = 0 - var lon float64 = 0 - for _, v := range Locations { - if v.CC == lowerCode { - lat = v.Lat - lon = v.Lon - } - } - if lat != 0 && lon != 0 { - query.Set("lat", strconv.FormatFloat(lat, 'f', -1, 64)) - query.Set("lon", strconv.FormatFloat(lon, 'f', -1, 64)) - } - } - u.RawQuery = query.Encode() dbg.Printf("Retrieving servers: %s\n", u.String()) req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) @@ -272,25 +275,6 @@ func (s *Speedtest) FetchServerListContext(ctx context.Context) (Servers, error) if err = decoder.Decode(&servers); err != nil { return servers, err } - var CountryCode = "" - if s.config.Location != nil { - CountryCode = strings.ToUpper(s.config.Location.CC) - } else if len(s.config.CountryCode) > 0 { - CountryCode = strings.ToUpper(s.config.CountryCode) - } else { - defaultConfig, err := FetchUserInfo() - if err != nil { - return servers, err - } - CountryCode = defaultConfig.Country - } - var tmpServers Servers - for _, server := range servers { - if server.CC == CountryCode { - tmpServers = append(tmpServers, server) - } - } - servers = tmpServers case typeXMLPayload: var list ServerList // Decode xml diff --git a/speedtest/server_test.go b/speedtest/server_test.go index 5873778..0f12ea7 100644 --- a/speedtest/server_test.go +++ b/speedtest/server_test.go @@ -4,7 +4,6 @@ import ( "errors" "math" "math/rand" - "strings" "testing" "time" ) @@ -215,12 +214,7 @@ func TestCityFlag(t *testing.T) { {CC: "TEST"}, } - var tmpServers Servers - for _, server := range testData { - if server.CC == strings.ToUpper(testCC) { - tmpServers = append(tmpServers, server) - } - } + tmpServers := testData.CC([]string{testCC}) if tmpServers.Len() != 2 && tmpServers[0].CC != testCC { t.Fatalf("not match: %s", testCC) } diff --git a/speedtest/speedtest.go b/speedtest/speedtest.go index d58d792..f8c6f29 100644 --- a/speedtest/speedtest.go +++ b/speedtest/speedtest.go @@ -52,9 +52,8 @@ type UserConfig struct { Keyword string // Fuzzy search - NoDownload bool - NoUpload bool - CountryCode string + NoDownload bool + NoUpload bool } func parseAddr(addr string) (string, string) { diff --git a/speedtest/user.go b/speedtest/user.go index 8959fbf..03a2915 100644 --- a/speedtest/user.go +++ b/speedtest/user.go @@ -62,6 +62,9 @@ func (s *Speedtest) FetchUserInfoContext(ctx context.Context) (*User, error) { } s.User = &users.Users[0] + if s.config.Location != nil && len(s.config.Location.CC) > 0 { + s.User.Country = s.config.Location.CC + } return s.User, nil } From c0d153f81f940ef460c91af6a57245d836e01e98 Mon Sep 17 00:00:00 2001 From: r3inbowari Date: Sun, 3 Mar 2024 04:07:23 +0800 Subject: [PATCH 8/9] fix: change to upper case --- speedtest/server.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/speedtest/server.go b/speedtest/server.go index 72ccb21..7e76581 100644 --- a/speedtest/server.go +++ b/speedtest/server.go @@ -148,8 +148,12 @@ func (servers Servers) Filter(filterFunc func(server *Server) bool) Servers { // CC filter by Country Code func (servers Servers) CC(cc []string) Servers { + var upperCC []string + for i := range cc { + upperCC = append(upperCC, strings.ToUpper(cc[i])) + } return servers.Filter(func(server *Server) bool { - return slices.Contains(cc, server.CC) + return slices.Contains(upperCC, server.CC) }) } From ae12748081a4693c0837648474121dc25cc5ed14 Mon Sep 17 00:00:00 2001 From: r3inbowari Date: Sun, 3 Mar 2024 04:36:53 +0800 Subject: [PATCH 9/9] remove disable tag --- speedtest.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speedtest.go b/speedtest.go index 8dc8aed..ebb62ef 100644 --- a/speedtest.go +++ b/speedtest.go @@ -33,7 +33,7 @@ var ( noUpload = kingpin.Flag("no-upload", "Disable upload test.").Bool() pingMode = kingpin.Flag("ping-mode", "Select a method for Ping. (support icmp/tcp/http)").Default("http").String() debug = kingpin.Flag("debug", "Enable debug mode.").Short('d').Bool() - countryCode = kingpin.Flag("filter-cc", "Filter servers by Country Code(s).").Default("disable").Strings() + countryCode = kingpin.Flag("filter-cc", "Filter servers by Country Code(s).").Strings() ) func main() {