private bool AddCommonHeaders(RequestContext requestContext, bool addCorrelationId) { if (addCorrelationId) { _headers.Add(OAuth2Header.CorrelationId, requestContext.Logger.CorrelationId.ToString()); _headers.Add(OAuth2Header.RequestCorrelationIdInResponse, "true"); } if (!string.IsNullOrWhiteSpace(requestContext.Logger.ClientName)) { _headers.Add(OAuth2Header.AppName, requestContext.Logger.ClientName); } if (!string.IsNullOrWhiteSpace(requestContext.Logger.ClientVersion)) { _headers.Add(OAuth2Header.AppVer, requestContext.Logger.ClientVersion); } _headers.Add(TelemetryConstants.XClientLastTelemetry, _telemetryManager.FetchAndResetPreviousHttpTelemetryContent()); _headers.Add(TelemetryConstants.XClientCurrentTelemetry, _telemetryManager.FetchCurrentHttpTelemetryContent(requestContext.CorrelationId.AsMatsCorrelationId())); return(addCorrelationId); }
internal async Task <T> ExecuteRequestAsync <T>(Uri endPoint, HttpMethod method, RequestContext requestContext) { bool addCorrelationId = requestContext != null && !string.IsNullOrEmpty(requestContext.Logger.CorrelationId.ToString()); if (addCorrelationId) { _headers.Add(OAuth2Header.CorrelationId, requestContext.Logger.CorrelationId.ToString()); _headers.Add(OAuth2Header.RequestCorrelationIdInResponse, "true"); } if (!string.IsNullOrWhiteSpace(requestContext.Logger.ClientName)) { _headers.Add(OAuth2Header.AppName, requestContext.Logger.ClientName); } if (!string.IsNullOrWhiteSpace(requestContext.Logger.ClientVersion)) { _headers.Add(OAuth2Header.AppVer, requestContext.Logger.ClientVersion); } _headers.Add(TelemetryConstants.XClientLastTelemetry, _telemetryManager.FetchAndResetPreviousHttpTelemetryContent()); _headers.Add(TelemetryConstants.XClientCurrentTelemetry, _telemetryManager.FetchCurrentHttpTelemetryContent(requestContext.CorrelationId.AsMatsCorrelationId())); HttpResponse response = null; Uri endpointUri = CreateFullEndpointUri(endPoint); var httpEvent = new HttpEvent(requestContext.CorrelationId.AsMatsCorrelationId()) { HttpPath = endpointUri, QueryParams = endpointUri.Query }; using (_telemetryManager.CreateTelemetryHelper(httpEvent)) { if (method == HttpMethod.Post) { response = await _httpManager.SendPostAsync(endpointUri, _headers, _bodyParameters, requestContext.Logger) .ConfigureAwait(false); } else { response = await _httpManager.SendGetAsync(endpointUri, _headers, requestContext.Logger).ConfigureAwait(false); } httpEvent.HttpResponseStatus = (int)response.StatusCode; httpEvent.UserAgent = response.UserAgent; httpEvent.HttpMethod = method.Method; IDictionary <string, string> headersAsDictionary = response.HeadersAsDictionary; if (headersAsDictionary.ContainsKey("x-ms-request-id") && headersAsDictionary["x-ms-request-id"] != null) { httpEvent.RequestIdHeader = headersAsDictionary["x-ms-request-id"]; } if (headersAsDictionary.ContainsKey("x-ms-clitelem") && headersAsDictionary["x-ms-clitelem"] != null) { XmsCliTelemInfo xmsCliTeleminfo = new XmsCliTelemInfoParser().ParseXMsTelemHeader( headersAsDictionary["x-ms-clitelem"], requestContext.Logger); if (xmsCliTeleminfo != null) { httpEvent.TokenAge = xmsCliTeleminfo.TokenAge; httpEvent.SpeInfo = xmsCliTeleminfo.SpeInfo; httpEvent.ServerErrorCode = xmsCliTeleminfo.ServerErrorCode; httpEvent.ServerSubErrorCode = xmsCliTeleminfo.ServerSubErrorCode; } } if (response.StatusCode != HttpStatusCode.OK) { try { httpEvent.OauthErrorCode = MsalError.UnknownError; // In cases where the end-point is not found (404) response.body will be empty. // CreateResponse handles throwing errors - in the case of HttpStatusCode <> and ErrorResponse will be created. if (!string.IsNullOrWhiteSpace(response.Body)) { var msalTokenResponse = JsonHelper.DeserializeFromJson <MsalTokenResponse>(response.Body); if (msalTokenResponse != null) { httpEvent.OauthErrorCode = msalTokenResponse.Error; } } } catch (SerializationException) // in the rare case we get an error response we cannot deserialize { // CreateErrorResponse does the same validation. Will be logging the error there. } } } return(CreateResponse <T>(response, requestContext, addCorrelationId)); }