ソースを参照

Use minimal placeholders in server entry prefix

Only legacy clients using the web API may use values from the server entry
space-delimited prefix. When the web server certificate is not present, the
web API cannot be used, and it's safe to use minimal placeholders to reduce
the size of the encoded server entry.
Rod Hynes 5 年 前
コミット
d1f8c58fd6
1 ファイル変更22 行追加6 行削除
  1. 22 6
      psiphon/common/protocol/serverEntry.go

+ 22 - 6
psiphon/common/protocol/serverEntry.go

@@ -623,7 +623,10 @@ func EncodeServerEntryFields(serverEntryFields ServerEntryFields) (string, error
 }
 
 func encodeServerEntry(
-	IPAddress, webServerPort, webServerSecret, webServerCertificate string,
+	prefixIPAddress string,
+	prefixWebServerPort string,
+	prefixWebServerSecret string,
+	prefixWebServerCertificate string,
 	serverEntry interface{}) (string, error) {
 
 	serverEntryJSON, err := json.Marshal(serverEntry)
@@ -631,13 +634,26 @@ func encodeServerEntry(
 		return "", errors.Trace(err)
 	}
 
-	// Legacy clients expect the space-delimited fields.
+	// Legacy clients use a space-delimited fields prefix, and all clients expect
+	// to at least parse the prefix in order to skip over it.
+	//
+	// When the server entry has no web API server certificate, the entire prefix
+	// can be compacted down to single character placeholders. Clients that can
+	// use the ssh API always prefer it over the web API and won't use the prefix
+	// values.
+	if len(prefixWebServerCertificate) == 0 {
+		prefixIPAddress = "0"
+		prefixWebServerPort = "0"
+		prefixWebServerSecret = "0"
+		prefixWebServerCertificate = "0"
+	}
+
 	return hex.EncodeToString([]byte(fmt.Sprintf(
 		"%s %s %s %s %s",
-		IPAddress,
-		webServerPort,
-		webServerSecret,
-		webServerCertificate,
+		prefixIPAddress,
+		prefixWebServerPort,
+		prefixWebServerSecret,
+		prefixWebServerCertificate,
 		serverEntryJSON))), nil
 }