From ab9f7a2af1fcd31bd22eee777a57c16c8540efdb Mon Sep 17 00:00:00 2001 From: Pc Date: Fri, 7 Apr 2023 17:18:00 +0330 Subject: [PATCH] chore: Update problem details extensions for more additional info --- .../ProblemDetailsExtensions.cs | 48 ++++++++++++++----- .../ProblemDetailsExtensions.cs | 48 ++++++++++++++----- .../ProblemDetailsExtensions.cs | 48 ++++++++++++++----- .../ProblemDetailsExtensions.cs | 48 ++++++++++++++----- 4 files changed, 144 insertions(+), 48 deletions(-) diff --git a/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs index 4599c61..948517f 100644 --- a/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -4,14 +4,39 @@ using BuildingBlocks.Exception; using Grpc.Core; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; public static class ProblemDetailsExtensions { public static WebApplication UseCustomProblemDetails(this WebApplication app) { + app.UseStatusCodePages(statusCodeHandlerApp => + { + statusCodeHandlerApp.Run(async context => + { + context.Response.ContentType = "application/problem+json"; + + if (context.RequestServices.GetService() is { } problemDetailsService) + { + await problemDetailsService.WriteAsync(new ProblemDetailsContext + { + HttpContext = context, + ProblemDetails = + { + Detail = ReasonPhrases.GetReasonPhrase(context.Response.StatusCode), + Status = context.Response.StatusCode + } + }); + } + }); + + }); + app.UseExceptionHandler(exceptionHandlerApp => { exceptionHandlerApp.Run(async context => @@ -20,82 +45,81 @@ public static class ProblemDetailsExtensions if (context.RequestServices.GetService() is { } problemDetailsService) { + var env = context.RequestServices.GetRequiredService(); var exceptionHandlerFeature = context.Features.Get(); var exceptionType = exceptionHandlerFeature?.Error; if (exceptionType is not null) { - (string Detail, string Type, string Title, int StatusCode) details = exceptionType switch + (string Detail, string Title, int StatusCode) details = exceptionType switch { ConflictException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), ValidationException validationException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = (int)validationException.StatusCode ), BadRequestException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), NotFoundException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.4", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status404NotFound ), AppException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), DbUpdateConcurrencyException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), RpcException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), _ => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.6.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status500InternalServerError ) }; - await problemDetailsService.WriteAsync(new ProblemDetailsContext + var problem = new ProblemDetailsContext { HttpContext = context, ProblemDetails = { Title = details.Title, Detail = details.Detail, - Type = details.Type, Status = details.StatusCode } - }); + }; + + if (env.IsDevelopment()) + { + problem.ProblemDetails.Extensions.Add("exception", exceptionHandlerFeature?.Error.ToString()); + } + + await problemDetailsService.WriteAsync(problem); } } }); diff --git a/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs index 95ef53c..1306282 100644 --- a/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -7,12 +7,37 @@ namespace Flight.Extensions.Infrastructure; using Grpc.Core; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Hosting; public static class ProblemDetailsExtensions { public static WebApplication UseCustomProblemDetails(this WebApplication app) { + app.UseStatusCodePages(statusCodeHandlerApp => + { + statusCodeHandlerApp.Run(async context => + { + context.Response.ContentType = "application/problem+json"; + + if (context.RequestServices.GetService() is { } problemDetailsService) + { + await problemDetailsService.WriteAsync(new ProblemDetailsContext + { + HttpContext = context, + ProblemDetails = + { + Detail = ReasonPhrases.GetReasonPhrase(context.Response.StatusCode), + Status = context.Response.StatusCode + } + }); + } + }); + + }); + app.UseExceptionHandler(exceptionHandlerApp => { exceptionHandlerApp.Run(async context => @@ -21,82 +46,81 @@ public static class ProblemDetailsExtensions if (context.RequestServices.GetService() is { } problemDetailsService) { + var env = context.RequestServices.GetRequiredService(); var exceptionHandlerFeature = context.Features.Get(); var exceptionType = exceptionHandlerFeature?.Error; if (exceptionType is not null) { - (string Detail, string Type, string Title, int StatusCode) details = exceptionType switch + (string Detail, string Title, int StatusCode) details = exceptionType switch { ConflictException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), ValidationException validationException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = (int)validationException.StatusCode ), BadRequestException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), NotFoundException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.4", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status404NotFound ), AppException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), DbUpdateConcurrencyException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), RpcException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), _ => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.6.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status500InternalServerError ) }; - await problemDetailsService.WriteAsync(new ProblemDetailsContext + var problem = new ProblemDetailsContext { HttpContext = context, ProblemDetails = { Title = details.Title, Detail = details.Detail, - Type = details.Type, Status = details.StatusCode } - }); + }; + + if (env.IsDevelopment()) + { + problem.ProblemDetails.Extensions.Add("exception", exceptionHandlerFeature?.Error.ToString()); + } + + await problemDetailsService.WriteAsync(problem); } } }); diff --git a/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs index 3a9cd0a..6c0da5c 100644 --- a/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -4,14 +4,39 @@ using BuildingBlocks.Exception; using Grpc.Core; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; public static class ProblemDetailsExtensions { public static WebApplication UseCustomProblemDetails(this WebApplication app) { + app.UseStatusCodePages(statusCodeHandlerApp => + { + statusCodeHandlerApp.Run(async context => + { + context.Response.ContentType = "application/problem+json"; + + if (context.RequestServices.GetService() is { } problemDetailsService) + { + await problemDetailsService.WriteAsync(new ProblemDetailsContext + { + HttpContext = context, + ProblemDetails = + { + Detail = ReasonPhrases.GetReasonPhrase(context.Response.StatusCode), + Status = context.Response.StatusCode + } + }); + } + }); + + }); + app.UseExceptionHandler(exceptionHandlerApp => { exceptionHandlerApp.Run(async context => @@ -20,82 +45,81 @@ public static class ProblemDetailsExtensions if (context.RequestServices.GetService() is { } problemDetailsService) { + var env = context.RequestServices.GetRequiredService(); var exceptionHandlerFeature = context.Features.Get(); var exceptionType = exceptionHandlerFeature?.Error; if (exceptionType is not null) { - (string Detail, string Type, string Title, int StatusCode) details = exceptionType switch + (string Detail, string Title, int StatusCode) details = exceptionType switch { ConflictException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), ValidationException validationException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = (int)validationException.StatusCode ), BadRequestException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), NotFoundException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.4", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status404NotFound ), AppException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), DbUpdateConcurrencyException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), RpcException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), _ => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.6.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status500InternalServerError ) }; - await problemDetailsService.WriteAsync(new ProblemDetailsContext + var problem = new ProblemDetailsContext { HttpContext = context, ProblemDetails = { Title = details.Title, Detail = details.Detail, - Type = details.Type, Status = details.StatusCode } - }); + }; + + if (env.IsDevelopment()) + { + problem.ProblemDetails.Extensions.Add("exception", exceptionHandlerFeature?.Error.ToString()); + } + + await problemDetailsService.WriteAsync(problem); } } }); diff --git a/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs index 946c892..d249ca0 100644 --- a/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -4,14 +4,39 @@ using BuildingBlocks.Exception; using Grpc.Core; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; public static class ProblemDetailsExtensions { public static WebApplication UseCustomProblemDetails(this WebApplication app) { + app.UseStatusCodePages(statusCodeHandlerApp => + { + statusCodeHandlerApp.Run(async context => + { + context.Response.ContentType = "application/problem+json"; + + if (context.RequestServices.GetService() is { } problemDetailsService) + { + await problemDetailsService.WriteAsync(new ProblemDetailsContext + { + HttpContext = context, + ProblemDetails = + { + Detail = ReasonPhrases.GetReasonPhrase(context.Response.StatusCode), + Status = context.Response.StatusCode + } + }); + } + }); + + }); + app.UseExceptionHandler(exceptionHandlerApp => { exceptionHandlerApp.Run(async context => @@ -20,82 +45,81 @@ public static class ProblemDetailsExtensions if (context.RequestServices.GetService() is { } problemDetailsService) { + var env = context.RequestServices.GetRequiredService(); var exceptionHandlerFeature = context.Features.Get(); var exceptionType = exceptionHandlerFeature?.Error; if (exceptionType is not null) { - (string Detail, string Type, string Title, int StatusCode) details = exceptionType switch + (string Detail, string Title, int StatusCode) details = exceptionType switch { ConflictException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), ValidationException validationException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = (int)validationException.StatusCode ), BadRequestException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), NotFoundException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.4", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status404NotFound ), AppException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), DbUpdateConcurrencyException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status409Conflict ), RpcException => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), _ => ( exceptionType.Message, - "https://www.rfc-editor.org/rfc/rfc7231#section-6.6.1", exceptionType.GetType().Name, context.Response.StatusCode = StatusCodes.Status500InternalServerError ) }; - await problemDetailsService.WriteAsync(new ProblemDetailsContext + var problem = new ProblemDetailsContext { HttpContext = context, ProblemDetails = { Title = details.Title, Detail = details.Detail, - Type = details.Type, Status = details.StatusCode } - }); + }; + + if (env.IsDevelopment()) + { + problem.ProblemDetails.Extensions.Add("exception", exceptionHandlerFeature?.Error.ToString()); + } + + await problemDetailsService.WriteAsync(problem); } } });