private async Task HandleStartOrchestratorRequestAsync()

in src/WebJobs.Extensions.DurableTask/HttpApiHandler.cs [860:946]


        private async Task<HttpResponseMessage> HandleStartOrchestratorRequestAsync(
            HttpRequestMessage request,
            string functionName,
            string instanceId)
        {
            try
            {
                IDurableOrchestrationClient client = this.GetClient(request);

                var queryNameValuePairs = request.GetQueryNameValuePairs();

                string json = null;
                object input = null;

                if (request.Content != null && request.Content.Headers?.ContentLength != 0)
                {
                    json = await request.Content.ReadAsStringAsync();
                    input = JsonConvert.DeserializeObject(json, this.messageDataConverter.JsonSettings);
                }

                string id = "";
                if (client is DurableClient durableClient)
                {
                    var instance = new OrchestrationInstance
                    {
                        InstanceId = Guid.NewGuid().ToString("N"),
                        ExecutionId = Guid.NewGuid().ToString(),
                    };

                    // Create the ExecutionStartedEvent
                    ExecutionStartedEvent executionStartedEvent = new ExecutionStartedEvent(-1, json)
                    {
                        Name = functionName,
                        OrchestrationInstance = instance,
                    };

                    string traceParent = GetHeaderValueFromHeaders("traceparent", request.Headers);
                    string traceState = GetHeaderValueFromHeaders("tracestate", request.Headers);

                    if (traceParent != null)
                    {
                        ActivityContext.TryParse(traceParent, traceState, out ActivityContext parentActivityContext);
                        using Activity scheduleOrchestrationActivity = StartActivityForNewOrchestration(executionStartedEvent, parentActivityContext);
                    }
                    else
                    {
                        using Activity scheduleOrchestrationActivity = StartActivityForNewOrchestration(executionStartedEvent, default);
                    }

                    await durableClient.DurabilityProvider.CreateTaskOrchestrationAsync(
                        new TaskMessage
                        {
                            Event = executionStartedEvent,
                            OrchestrationInstance = instance,
                        },
                        this.config.Options.OverridableExistingInstanceStates.ToDedupeStatuses());

                    id = instance.InstanceId;
                }
                else
                {
                    id = await client.StartNewAsync(functionName, instanceId, input);
                }

                TryGetTimeSpanQueryParameterValue(queryNameValuePairs, TimeoutParameter, out TimeSpan? timeout);
                TryGetTimeSpanQueryParameterValue(queryNameValuePairs, PollingInterval, out TimeSpan? pollingInterval);

                // for durability providers that support poll-free waiting, we override the specified polling interval
                if (client is DurableClient pollFreeDurableClient && pollFreeDurableClient.DurabilityProvider.SupportsPollFreeWait)
                {
                    pollingInterval = timeout;
                }

                if (timeout.HasValue && pollingInterval.HasValue)
                {
                    return await client.WaitForCompletionOrCreateCheckStatusResponseAsync(request, id, timeout, pollingInterval);
                }
                else
                {
                    return client.CreateCheckStatusResponse(request, id);
                }
            }
            catch (JsonReaderException e)
            {
                return request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid JSON content", e);
            }
        }