func makeStatusRequestPayload( serverId string) ([]byte, *statusRequestPayloadInfo, error) { transferStats := transferstats.TakeOutStatsForServer(serverId) persistentStats, err := TakeOutUnreportedPersistentStats( PSIPHON_API_PERSISTENT_STATS_MAX_COUNT) if err != nil { NoticeAlert( "TakeOutUnreportedPersistentStats failed: %s", common.ContextError(err)) persistentStats = nil // Proceed with transferStats only } payloadInfo := &statusRequestPayloadInfo{ serverId, transferStats, persistentStats} payload := make(map[string]interface{}) hostBytes, bytesTransferred := transferStats.GetStatsForStatusRequest() payload["host_bytes"] = hostBytes payload["bytes_transferred"] = bytesTransferred // We're not recording these fields, but the server requires them. payload["page_views"] = make([]string, 0) payload["https_requests"] = make([]string, 0) persistentStatPayloadNames := make(map[string]string) persistentStatPayloadNames[PERSISTENT_STAT_TYPE_TUNNEL] = "tunnel_stats" persistentStatPayloadNames[PERSISTENT_STAT_TYPE_REMOTE_SERVER_LIST] = "remote_server_list_stats" for statType, stats := range persistentStats { // Persistent stats records are already in JSON format jsonStats := make([]json.RawMessage, len(stats)) for i, stat := range stats { jsonStats[i] = json.RawMessage(stat) } payload[persistentStatPayloadNames[statType]] = jsonStats } jsonPayload, err := json.Marshal(payload) if err != nil { // Send the transfer stats and tunnel stats later putBackStatusRequestPayload(payloadInfo) return nil, nil, common.ContextError(err) } return jsonPayload, payloadInfo, nil }
func makeStatusRequestPayload( serverId string) ([]byte, *statusRequestPayloadInfo, error) { transferStats := transferstats.TakeOutStatsForServer(serverId) tunnelStats, err := TakeOutUnreportedTunnelStats( PSIPHON_API_TUNNEL_STATS_MAX_COUNT) if err != nil { NoticeAlert( "TakeOutUnreportedTunnelStats failed: %s", ContextError(err)) tunnelStats = nil // Proceed with transferStats only } payloadInfo := &statusRequestPayloadInfo{ serverId, transferStats, tunnelStats} payload := make(map[string]interface{}) hostBytes, bytesTransferred := transferStats.GetStatsForStatusRequest() payload["host_bytes"] = hostBytes payload["bytes_transferred"] = bytesTransferred // We're not recording these fields, but the server requires them. payload["page_views"] = make([]string, 0) payload["https_requests"] = make([]string, 0) // Tunnel stats records are already in JSON format jsonTunnelStats := make([]json.RawMessage, len(tunnelStats)) for i, tunnelStatsRecord := range tunnelStats { jsonTunnelStats[i] = json.RawMessage(tunnelStatsRecord) } payload["tunnel_stats"] = jsonTunnelStats jsonPayload, err := json.Marshal(payload) if err != nil { // Send the transfer stats and tunnel stats later putBackStatusRequestPayload(payloadInfo) return nil, nil, ContextError(err) } return jsonPayload, payloadInfo, nil }