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); }