Browse Source

Add establishment_duration field to server_tunnel

Rod Hynes 7 years ago
parent
commit
4dd4aac587
1 changed files with 60 additions and 51 deletions
  1. 60 51
      psiphon/server/api.go

+ 60 - 51
psiphon/server/api.go

@@ -317,6 +317,18 @@ var connectedRequestParams = append(
 		{"establishment_duration", isIntString, requestParamOptional | requestParamLogStringAsInt}},
 	baseRequestParams...)
 
+// updateOnConnectedParamNames are connected request parameters which are
+// copied to update data logged with server_tunnel: these fields either only
+// ship with or ship newer data with connected requests.
+var updateOnConnectedParamNames = []string{
+	"establishment_duration",
+	"upstream_bytes_fragmented",
+	"upstream_min_bytes_written",
+	"upstream_max_bytes_written",
+	"upstream_min_delayed",
+	"upstream_max_delayed",
+}
+
 // connectedAPIRequestHandler implements the "connected" API request.
 // Clients make the connected request once a tunnel connection has been
 // established and at least once per day. The last_connected input value,
@@ -334,15 +346,17 @@ func connectedAPIRequestHandler(
 		return nil, common.ContextError(err)
 	}
 
-	// Update upstream fragmentor metrics, as the client may have performed
-	// more upstream fragmentation since the previous metrics reported by the
-	// handshake request.
+	// Update, for server_tunnel logging, upstream fragmentor metrics, as the
+	// client may have performed more upstream fragmentation since the
+	// previous metrics reported by the handshake request. Also,
+	// establishment_duration, reported only in the connected request, is
+	// added to server_tunnel here.
 
 	// TODO: same session-ID-lookup TODO in handshakeAPIRequestHandler
 	// applies here.
 	sessionID, _ := getStringRequestParam(params, "client_session_id")
 	err = support.TunnelServer.UpdateClientAPIParameters(
-		sessionID, copyUpstreamFragmentorParams(params))
+		sessionID, copyUpdateOnConnectedParams(params))
 	if err != nil {
 		return nil, common.ContextError(err)
 	}
@@ -585,7 +599,44 @@ const (
 	requestParamLogFlagAsBool        = 64
 )
 
-var upstreamFragmentorParams = []requestParamSpec{
+// baseRequestParams is the list of required and optional
+// request parameters; derived from COMMON_INPUTS and
+// OPTIONAL_COMMON_INPUTS in psi_web.
+// Each param is expected to be a string, unless requestParamArray
+// is specified, in which case an array of string is expected.
+var baseRequestParams = []requestParamSpec{
+	{"server_secret", isServerSecret, requestParamNotLogged},
+	{"client_session_id", isHexDigits, requestParamNotLogged},
+	{"propagation_channel_id", isHexDigits, 0},
+	{"sponsor_id", isHexDigits, 0},
+	{"client_version", isIntString, requestParamLogStringAsInt},
+	{"client_platform", isClientPlatform, 0},
+	{"client_build_rev", isHexDigits, requestParamOptional},
+	{"relay_protocol", isRelayProtocol, 0},
+	{"tunnel_whole_device", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool},
+	{"device_region", isAnyString, requestParamOptional},
+	{"ssh_client_version", isAnyString, requestParamOptional},
+	{"upstream_proxy_type", isUpstreamProxyType, requestParamOptional},
+	{"upstream_proxy_custom_header_names", isAnyString, requestParamOptional | requestParamArray},
+	{"meek_dial_address", isDialAddress, requestParamOptional},
+	{"meek_resolved_ip_address", isIPAddress, requestParamOptional},
+	{"meek_sni_server_name", isDomain, requestParamOptional},
+	{"meek_host_header", isHostHeader, requestParamOptional},
+	{"meek_transformed_host_name", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool},
+	{"user_agent", isAnyString, requestParamOptional},
+	{"tls_profile", isAnyString, requestParamOptional},
+	{"server_entry_region", isRegionCode, requestParamOptional},
+	{"server_entry_source", isServerEntrySource, requestParamOptional},
+	{"server_entry_timestamp", isISO8601Date, requestParamOptional},
+	{tactics.APPLIED_TACTICS_TAG_PARAMETER_NAME, isAnyString, requestParamOptional},
+	{"dial_port_number", isIntString, requestParamOptional | requestParamLogStringAsInt},
+	{"quic_version", isAnyString, requestParamOptional},
+	{"quic_dial_sni_address", isAnyString, requestParamOptional},
+	{"padding", isAnyString, requestParamOptional | requestParamLogStringLengthAsInt},
+	{"pad_response", isIntString, requestParamOptional | requestParamLogStringAsInt},
+	{"is_replay", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool},
+	{"egress_region", isRegionCode, requestParamOptional},
+	{"dial_duration", isIntString, requestParamOptional | requestParamLogStringAsInt},
 	{"upstream_bytes_fragmented", isIntString, requestParamOptional | requestParamLogStringAsInt},
 	{"upstream_min_bytes_written", isIntString, requestParamOptional | requestParamLogStringAsInt},
 	{"upstream_max_bytes_written", isIntString, requestParamOptional | requestParamLogStringAsInt},
@@ -593,48 +644,6 @@ var upstreamFragmentorParams = []requestParamSpec{
 	{"upstream_max_delayed", isIntString, requestParamOptional | requestParamLogStringAsInt},
 }
 
-// baseRequestParams is the list of required and optional
-// request parameters; derived from COMMON_INPUTS and
-// OPTIONAL_COMMON_INPUTS in psi_web.
-// Each param is expected to be a string, unless requestParamArray
-// is specified, in which case an array of string is expected.
-var baseRequestParams = append(
-	[]requestParamSpec{
-		{"server_secret", isServerSecret, requestParamNotLogged},
-		{"client_session_id", isHexDigits, requestParamNotLogged},
-		{"propagation_channel_id", isHexDigits, 0},
-		{"sponsor_id", isHexDigits, 0},
-		{"client_version", isIntString, requestParamLogStringAsInt},
-		{"client_platform", isClientPlatform, 0},
-		{"client_build_rev", isHexDigits, requestParamOptional},
-		{"relay_protocol", isRelayProtocol, 0},
-		{"tunnel_whole_device", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool},
-		{"device_region", isAnyString, requestParamOptional},
-		{"ssh_client_version", isAnyString, requestParamOptional},
-		{"upstream_proxy_type", isUpstreamProxyType, requestParamOptional},
-		{"upstream_proxy_custom_header_names", isAnyString, requestParamOptional | requestParamArray},
-		{"meek_dial_address", isDialAddress, requestParamOptional},
-		{"meek_resolved_ip_address", isIPAddress, requestParamOptional},
-		{"meek_sni_server_name", isDomain, requestParamOptional},
-		{"meek_host_header", isHostHeader, requestParamOptional},
-		{"meek_transformed_host_name", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool},
-		{"user_agent", isAnyString, requestParamOptional},
-		{"tls_profile", isAnyString, requestParamOptional},
-		{"server_entry_region", isRegionCode, requestParamOptional},
-		{"server_entry_source", isServerEntrySource, requestParamOptional},
-		{"server_entry_timestamp", isISO8601Date, requestParamOptional},
-		{tactics.APPLIED_TACTICS_TAG_PARAMETER_NAME, isAnyString, requestParamOptional},
-		{"dial_port_number", isIntString, requestParamOptional | requestParamLogStringAsInt},
-		{"quic_version", isAnyString, requestParamOptional},
-		{"quic_dial_sni_address", isAnyString, requestParamOptional},
-		{"padding", isAnyString, requestParamOptional | requestParamLogStringLengthAsInt},
-		{"pad_response", isIntString, requestParamOptional | requestParamLogStringAsInt},
-		{"is_replay", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool},
-		{"egress_region", isRegionCode, requestParamOptional},
-		{"dial_duration", isIntString, requestParamOptional | requestParamLogStringAsInt},
-	},
-	upstreamFragmentorParams...)
-
 func validateRequestParams(
 	config *Config,
 	params common.APIParameters,
@@ -690,16 +699,16 @@ func copyBaseRequestParams(params common.APIParameters) common.APIParameters {
 	return paramsCopy
 }
 
-func copyUpstreamFragmentorParams(params common.APIParameters) common.APIParameters {
+func copyUpdateOnConnectedParams(params common.APIParameters) common.APIParameters {
 
 	// Note: not a deep copy
 	paramsCopy := make(common.APIParameters)
-	for _, baseParam := range upstreamFragmentorParams {
-		value := params[baseParam.name]
+	for _, name := range updateOnConnectedParamNames {
+		value := params[name]
 		if value == nil {
 			continue
 		}
-		paramsCopy[baseParam.name] = value
+		paramsCopy[name] = value
 	}
 	return paramsCopy
 }