/// <summary>
    /// Extract the first maxMessages messages from stackdriverEntries into stackdriverEntriesInFlight
    /// </summary>
    private static void extractStackdriverEntries(StackdriverEntries stackdriverEntries, StackdriverEntries stackdriverEntriesInFlight, int maxMessages)
    {
        if (stackdriverEntriesInFlight.entries.Count > 0)
        {
            UberDebug.LogErrorChannel(StackdriverChannel, "Attempted to extract a new set of messages while the previous set already was in-flight");
            stackdriverEntriesInFlight.entries.Clear();
        }

        int messageExtractCount = Math.Min(stackdriverEntries.entries.Count, maxMessages);

        stackdriverEntriesInFlight.entries.AddRange(stackdriverEntries.entries.GetRange(0, messageExtractCount));
        stackdriverEntries.entries.RemoveRange(0, messageExtractCount);
    }
    public UberLoggerStackdriver(StartCoroutineDelegate startCoroutine, string backendUrl, int maxMessagesPerPost, float minIntervalBetweenPosts, LogSeverityLevel logSeverityLevel, IncludeCallstackMode includeCallstacks, int maxRetries, string sessionId)
    {
        this.startCoroutine          = startCoroutine;
        this.backendUrl              = backendUrl;
        this.maxMessagesPerPost      = maxMessagesPerPost;
        this.minIntervalBetweenPosts = minIntervalBetweenPosts;
        this.logSeverityLevel        = logSeverityLevel;
        this.includeCallstacks       = includeCallstacks;
        this.maxRetries              = maxRetries;
        this.sessionId = sessionId;

        stackdriverEntries         = new StackdriverEntries(sessionId);
        stackdriverEntriesInFlight = new StackdriverEntries(sessionId);

        Assert.IsNotNull(this.backendUrl, "You must supply a target URL for the UberLoggerStackdriver backend API. UberLoggerStackdriver will be inactive.");
    }
    /// <summary>
    /// Given a list of messages, construct a UnityWebRequest that will post these messages to the backend entry point in Google Cloud
    /// </summary>
    private static UnityWebRequest createPost(StackdriverEntries stackdriverEntries, string url)
    {
        string jsonMessage = stackdriverEntries.ToJson();

        byte[] jsonMessageBytes = Encoding.UTF8.GetBytes(jsonMessage);

        UnityWebRequest request = UnityWebRequest.Post(url, "");

        // Hack: provide the JSON data via a custom upload handler
        // UnityWebRequest.Post will assume that body is going to be sent as application/x-www-form-urlencoded format, and it will apply that conversion to the body string
        //   ( so {"a":"b"} turns into %7b%22a%22:%22b%22%7d )
        // To get around this, we provide a handler that will send raw JSON bytes and with the appropriate content type
        request.uploadHandler             = new UploadHandlerRaw(jsonMessageBytes);
        request.uploadHandler.contentType = "application/json";

        return(request);
    }