public static void CreateErrorResponse(HttpResponse response, RequestContext requestContext)
        {
            bool shouldLogAsError = true;

            var httpErrorCodeMessage = string.Format(CultureInfo.InvariantCulture, "HttpStatusCode: {0}: {1}", (int)response.StatusCode, response.StatusCode.ToString());

            requestContext.Logger.Info(httpErrorCodeMessage);

            Exception exceptionToThrow = null;

            try
            {
                exceptionToThrow = ExtractErrorsFromTheResponse(response, ref shouldLogAsError);
            }
            catch (JsonException)
            {
                exceptionToThrow = new AuthServiceException(
                    AuthError.NonParsableOAuthError,
                    AuthErrorMessage.NonParsableOAuthError)
                {
                    HttpResponse = response
                };
            }
            catch (Exception ex)
            {
                exceptionToThrow = new AuthServiceException(AuthError.UnknownError, response.Body, ex)
                {
                    HttpResponse = response
                };
            }

            if (exceptionToThrow == null)
            {
                exceptionToThrow = new AuthServiceException(
                    response.StatusCode == HttpStatusCode.NotFound
                        ? AuthError.HttpStatusNotFound
                        : AuthError.HttpStatusCodeNotOk, httpErrorCodeMessage)
                {
                    HttpResponse = response
                };
            }

            if (shouldLogAsError)
            {
                requestContext.Logger.ErrorPii(exceptionToThrow);
            }
            else
            {
                requestContext.Logger.InfoPii(exceptionToThrow);
            }

            throw exceptionToThrow;
        }
        private static Exception ExtractErrorsFromTheResponse(HttpResponse response, ref bool shouldLogAsError)
        {
            Exception exceptionToThrow = null;

            // In cases where the end-point is not found (404) response.body will be empty.
            if (string.IsNullOrWhiteSpace(response.Body))
            {
                return(null);
            }

            var authTokenResponse = JsonHelper.DeserializeFromJson <OAuth2TokenResponse>(response.Body);

            if (authTokenResponse?.Error == null)
            {
                return(null);
            }

            if (AuthError.InvalidGrantError.Equals(authTokenResponse.Error, StringComparison.OrdinalIgnoreCase))
            {
                exceptionToThrow = new AuthUiRequiredException(
                    AuthError.InvalidGrantError,
                    authTokenResponse.ErrorDescription)
                {
                    HttpResponse = response
                };
            }
            else
            {
                exceptionToThrow = new AuthServiceException(
                    authTokenResponse.Error,
                    authTokenResponse.ErrorDescription)
                {
                    HttpResponse = response
                };
            }

            // For device code flow, AuthorizationPending can occur a lot while waiting
            // for the user to auth via browser and this causes a lot of error noise in the logs.
            // So suppress this particular case to an Info so we still see the data but don't
            // log it as an error since it's expected behavior while waiting for the user.
            if (string.Compare(authTokenResponse.Error, OAuth2Error.AuthorizationPending, StringComparison.OrdinalIgnoreCase) == 0)
            {
                shouldLogAsError = false;
            }

            return(exceptionToThrow);
        }