Просмотр исходного кода

Merge pull request #274 from mirokuratczyk/master

return a single random homepage in handshake response
Rod Hynes 9 лет назад
Родитель
Сommit
92a5800928
3 измененных файлов с 18 добавлено и 3 удалено
  1. 1 1
      psiphon/server/api.go
  2. 14 2
      psiphon/server/psinet/psinet.go
  3. 3 0
      psiphon/server/services.go

+ 1 - 1
psiphon/server/api.go

@@ -169,7 +169,7 @@ func handshakeAPIRequestHandler(
 	// Note: no guarantee that PsinetDatabase won't reload between database calls
 	db := support.PsinetDatabase
 	handshakeResponse := common.HandshakeResponse{
-		Homepages:            db.GetHomepages(sponsorID, geoIPData.Country, isMobile),
+		Homepages:            db.GetRandomHomepage(sponsorID, geoIPData.Country, isMobile),
 		UpgradeClientVersion: db.GetUpgradeClientVersion(clientVersion, normalizedPlatform),
 		HttpsRequestRegexes:  db.GetHttpsRequestRegexes(sponsorID),
 		EncodedServerList:    db.DiscoverServers(geoIPData.DiscoveryValue),

+ 14 - 2
psiphon/server/psinet/psinet.go

@@ -29,6 +29,7 @@ import (
 	"fmt"
 	"io/ioutil"
 	"math"
+	"math/rand"
 	"strconv"
 	"strings"
 	"time"
@@ -150,7 +151,18 @@ func NewDatabase(filename string) (*Database, error) {
 	return database, nil
 }
 
-// GetHomepages returns a list of  home pages for the specified sponsor,
+// GetRandomHomepage returns a random home page from a set of home pages
+// for the specified sponsor, region, and platform.
+func (db *Database) GetRandomHomepage(sponsorID, clientRegion string, isMobilePlatform bool) []string {
+	homepages := db.GetHomepages(sponsorID, clientRegion, isMobilePlatform)
+	if len(homepages) > 0 {
+		index := rand.Intn(len(homepages))
+		return homepages[index:index+1]
+	}
+	return nil
+}
+
+// GetHomepages returns a list of home pages for the specified sponsor,
 // region, and platform.
 func (db *Database) GetHomepages(sponsorID, clientRegion string, isMobilePlatform bool) []string {
 	db.ReloadableFile.RLock()
@@ -181,7 +193,7 @@ func (db *Database) GetHomepages(sponsorID, clientRegion string, isMobilePlatfor
 	}
 
 	// Case: lookup failed or no corresponding homepages found for region --> use default
-	if sponsorHomePages == nil {
+	if len(sponsorHomePages) == 0 {
 		defaultHomePages, ok := homePages["None"]
 		if ok {
 			for _, homePage := range defaultHomePages {

+ 3 - 0
psiphon/server/services.go

@@ -24,6 +24,7 @@
 package server
 
 import (
+	"math/rand"
 	"os"
 	"os/signal"
 	"path/filepath"
@@ -42,6 +43,8 @@ import (
 // os.Kill signals are received. The config determines which components are run.
 func RunServices(configJSON []byte) error {
 
+	rand.Seed(int64(time.Now().Nanosecond()))
+
 	config, err := LoadConfig(configJSON)
 	if err != nil {
 		log.WithContextFields(LogFields{"error": err}).Error("load config failed")