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