Feature: filter by hostname for Mullvad servers
This commit is contained in:
@@ -32,15 +32,17 @@ func (hts hostToServer) add(data serverData) (err error) {
|
||||
}
|
||||
|
||||
server, ok := hts[data.Hostname]
|
||||
if !ok {
|
||||
server.Country = data.Country
|
||||
server.City = strings.ReplaceAll(data.City, ",", "")
|
||||
server.ISP = data.Provider
|
||||
server.Owned = data.Owned
|
||||
if ok { // API returns a server per hostname at most
|
||||
return nil
|
||||
}
|
||||
|
||||
server.IPs = append(server.IPs, ipv4)
|
||||
server.IPsV6 = append(server.IPsV6, ipv6)
|
||||
server.Country = data.Country
|
||||
server.City = strings.ReplaceAll(data.City, ",", "")
|
||||
server.Hostname = data.Hostname
|
||||
server.ISP = data.Provider
|
||||
server.Owned = data.Owned
|
||||
server.IPs = []net.IP{ipv4}
|
||||
server.IPsV6 = []net.IP{ipv6}
|
||||
|
||||
hts[data.Hostname] = server
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/models"
|
||||
)
|
||||
@@ -35,34 +34,7 @@ func GetServers(ctx context.Context, client *http.Client, minServers int) (
|
||||
|
||||
servers = hts.toServersSlice()
|
||||
|
||||
servers = groupByProperties(servers)
|
||||
|
||||
sortServers(servers)
|
||||
|
||||
return servers, nil
|
||||
}
|
||||
|
||||
// TODO group by hostname so remove this.
|
||||
func groupByProperties(serversByHost []models.MullvadServer) (serversByProps []models.MullvadServer) {
|
||||
propsToServer := make(map[string]models.MullvadServer, len(serversByHost))
|
||||
for _, server := range serversByHost {
|
||||
key := server.Country + server.City + server.ISP + strconv.FormatBool(server.Owned)
|
||||
serverByProps, ok := propsToServer[key]
|
||||
if !ok {
|
||||
serverByProps.Country = server.Country
|
||||
serverByProps.City = server.City
|
||||
serverByProps.ISP = server.ISP
|
||||
serverByProps.Owned = server.Owned
|
||||
}
|
||||
serverByProps.IPs = append(serverByProps.IPs, server.IPs...)
|
||||
serverByProps.IPsV6 = append(serverByProps.IPsV6, server.IPsV6...)
|
||||
propsToServer[key] = serverByProps
|
||||
}
|
||||
|
||||
serversByProps = make([]models.MullvadServer, 0, len(propsToServer))
|
||||
for _, serverByProp := range propsToServer {
|
||||
serversByProps = append(serversByProps, serverByProp)
|
||||
}
|
||||
|
||||
return serversByProps
|
||||
}
|
||||
|
||||
@@ -10,7 +10,10 @@ func sortServers(servers []models.MullvadServer) {
|
||||
sort.Slice(servers, func(i, j int) bool {
|
||||
if servers[i].Country == servers[j].Country {
|
||||
if servers[i].City == servers[j].City {
|
||||
return servers[i].ISP < servers[j].ISP
|
||||
if servers[i].Hostname == servers[j].Hostname {
|
||||
return servers[i].ISP < servers[j].ISP
|
||||
}
|
||||
return servers[i].Hostname < servers[j].Hostname
|
||||
}
|
||||
return servers[i].City < servers[j].City
|
||||
}
|
||||
|
||||
@@ -11,18 +11,19 @@ import (
|
||||
|
||||
func Test_Stringify(t *testing.T) {
|
||||
servers := []models.MullvadServer{{
|
||||
Country: "webland",
|
||||
City: "webcity",
|
||||
ISP: "not nsa",
|
||||
Owned: true,
|
||||
IPs: []net.IP{{1, 1, 1, 1}},
|
||||
IPsV6: []net.IP{{1, 1, 1, 1}},
|
||||
Country: "webland",
|
||||
City: "webcity",
|
||||
Hostname: "hostname",
|
||||
ISP: "not nsa",
|
||||
Owned: true,
|
||||
IPs: []net.IP{{1, 1, 1, 1}},
|
||||
IPsV6: []net.IP{{1, 1, 1, 1}},
|
||||
}}
|
||||
//nolint:lll
|
||||
expected := `
|
||||
func MullvadServers() []models.MullvadServer {
|
||||
return []models.MullvadServer{
|
||||
{Country: "webland", City: "webcity", ISP: "not nsa", Owned: true, IPs: []net.IP{{1, 1, 1, 1}}, IPsV6: []net.IP{{1, 1, 1, 1}}},
|
||||
{Country: "webland", City: "webcity", Hostname: "hostname", ISP: "not nsa", Owned: true, IPs: []net.IP{{1, 1, 1, 1}}, IPsV6: []net.IP{{1, 1, 1, 1}}},
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
Reference in New Issue
Block a user