using TechHelper.Client.HttpRepository; using Microsoft.AspNetCore.Components; using System.Net; using System.Net.Http.Headers; using MudBlazor; using Microsoft.Extensions.DependencyInjection; using System; namespace BlazorProducts.Client.HttpInterceptor { public class HttpInterceptorHandlerService : DelegatingHandler { private readonly NavigationManager _navManager; private readonly RefreshTokenService _refreshTokenService; private readonly ISnackbar _serviceProvider; private ISnackbar toastService = null; public HttpInterceptorHandlerService( NavigationManager navManager, RefreshTokenService refreshTokenService, ISnackbar serviceProvider) { _navManager = navManager; _refreshTokenService = refreshTokenService; _serviceProvider = serviceProvider; } protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var absolutePath = request.RequestUri?.AbsolutePath; if (absolutePath != null && !absolutePath.Contains("token") && !absolutePath.Contains("account")) { var token = await _refreshTokenService.TryRefreshToken(); if (!string.IsNullOrEmpty(token)) { request.Headers.Authorization = new AuthenticationHeaderValue("bearer", token); } } var response = await base.SendAsync(request, cancellationToken); HandleResponse(response); return response; } private void HandleResponse(HttpResponseMessage response) { if (response is null) { _navManager.NavigateTo("/error"); throw new HttpResponseException("Server not available."); } var message = ""; if (!response.IsSuccessStatusCode) { switch (response.StatusCode) { case HttpStatusCode.NotFound: _navManager.NavigateTo("/404"); message = "Resource not found."; break; case HttpStatusCode.BadRequest: message = "Invalid request. Please try again."; break; case HttpStatusCode.Unauthorized: _navManager.NavigateTo("/unauthorized"); message = "Unauthorized access"; break; default: _navManager.NavigateTo("/error"); message = "Something went wrong. Please contact the administrator."; break; } } } } }