Feature: filter by hostname for Mullvad servers

This commit is contained in:
Quentin McGaw
2021-05-08 19:17:36 +00:00
parent a34769ae02
commit 2ec2f45c82
11 changed files with 382 additions and 143 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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}}},
}
}
`