private void InjectRequestHeaders()

in WEB/Src/DependencyCollector/DependencyCollector/HttpCoreDiagnosticSourceListener.cs [535:637]


        private void InjectRequestHeaders(HttpRequestMessage request, string instrumentationKey)
        {
            try
            {
                HttpRequestHeaders requestHeaders = request.Headers;
                if (requestHeaders != null && this.setComponentCorrelationHttpHeaders && !this.correlationDomainExclusionList.Contains(request.RequestUri.Host))
                {
                    string sourceApplicationId = null;
                    try
                    {
                        if (!string.IsNullOrEmpty(instrumentationKey)
                            && !HttpHeadersUtilities.ContainsRequestContextKeyValue(requestHeaders, RequestResponseHeaders.RequestContextCorrelationSourceKey)
                            && (this.configuration.ApplicationIdProvider?.TryGetApplicationId(instrumentationKey, out sourceApplicationId) ?? false))
                        {
                            HttpHeadersUtilities.SetRequestContextKeyValue(requestHeaders, RequestResponseHeaders.RequestContextCorrelationSourceKey, sourceApplicationId);
                        }
                    }
                    catch (Exception e)
                    {
                        AppMapCorrelationEventSource.Log.UnknownError(ExceptionUtilities.GetExceptionDetailString(e));
                    }

                    var currentActivity = Activity.Current;

                    switch (this.httpInstrumentationVersion)
                    {
                        case HttpInstrumentationVersion.V1:
                            // HttpClient does not add any headers
                            // add W3C or Request-Id depending on Activity format
                            // add correlation-context anyway
                            if (currentActivity.IdFormat == ActivityIdFormat.W3C)
                            {
                                InjectW3CHeaders(currentActivity, requestHeaders);
                                if (this.injectRequestIdInW3CMode)
                                {
                                    InjectBackCompatibleRequestId(currentActivity, requestHeaders);
                                }
                            }
                            else
                            {
                                if (!requestHeaders.Contains(RequestResponseHeaders.RequestIdHeader))
                                {
                                    requestHeaders.Add(RequestResponseHeaders.RequestIdHeader, currentActivity.Id);
                                }
                            }

                            InjectCorrelationContext(requestHeaders, currentActivity);
                            break;
                        case HttpInstrumentationVersion.V2:
                            // On V2, HttpClient adds Request-Id and Correlation-Context
                            // but not W3C
                            if (currentActivity.IdFormat == ActivityIdFormat.W3C)
                            {
                                // we are going to add W3C and Request-Id (in W3C-compatible format)
                                // as a result HttpClient will not add Request-Id AND Correlation-Context
                                InjectW3CHeaders(currentActivity, requestHeaders);
                                if (this.injectRequestIdInW3CMode)
                                {
                                    InjectBackCompatibleRequestId(currentActivity, requestHeaders);
                                }

                                InjectCorrelationContext(requestHeaders, currentActivity);
                            }

                            break;
                        case HttpInstrumentationVersion.V3:
                            // on V3, HttpClient adds either W3C or Request-Id depending on Activity format
                            // and adds Correlation-Context
                            if (currentActivity.IdFormat == ActivityIdFormat.W3C && this.injectRequestIdInW3CMode)
                            {
                                // we are going to override Request-Id to be in W3C compatible mode
                                InjectBackCompatibleRequestId(currentActivity, requestHeaders);
                            }

                            break;
                    }

                    if (this.injectLegacyHeaders)
                    {
                        // Add the root ID (Activity.RootId works with W3C and Hierarchical format)
                        string rootId = currentActivity.RootId;
                        if (!string.IsNullOrEmpty(rootId) && !requestHeaders.Contains(RequestResponseHeaders.StandardRootIdHeader))
                        {
                            requestHeaders.Add(RequestResponseHeaders.StandardRootIdHeader, rootId);
                        }

                        // Add the parent ID
                        string parentId = currentActivity.IdFormat == ActivityIdFormat.W3C ? 
                            currentActivity.SpanId.ToHexString() :
                            currentActivity.Id;

                        if (!string.IsNullOrEmpty(parentId) && !requestHeaders.Contains(RequestResponseHeaders.StandardParentIdHeader))
                        {
                            requestHeaders.Add(RequestResponseHeaders.StandardParentIdHeader, parentId);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                AppMapCorrelationEventSource.Log.UnknownError(ExceptionUtilities.GetExceptionDetailString(e));
            }
        }