From 2d603e4fc646d57ae42c1b7aef47fbf09fea8f71 Mon Sep 17 00:00:00 2001 From: Bangara Raju Kottedi Date: Mon, 16 Feb 2026 11:18:46 +0530 Subject: [PATCH] Improve URL config parsing and mail exception handling Refactor Program.cs to robustly parse and validate URLs from config, logging a warning if none are valid. Enhance MailService exception handling to log full exceptions and avoid interrupting OTP generation by swallowing mail send errors. --- PortBlog.API/Program.cs | 20 ++++++++++++++++---- PortBlog.API/Services/MailService.cs | 12 +++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/PortBlog.API/Program.cs b/PortBlog.API/Program.cs index b31ba14..5c67595 100644 --- a/PortBlog.API/Program.cs +++ b/PortBlog.API/Program.cs @@ -33,13 +33,25 @@ Log.Logger = loggerConfiguration .WriteTo.File("logs/portblog.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); -var urls = builder.Configuration.GetSection("Urls"); +var urlsSection = builder.Configuration.GetSection("Urls"); +var urlsValue = urlsSection.Value; -if (!string.IsNullOrEmpty(urls.Value)) +if (!string.IsNullOrWhiteSpace(urlsValue)) { - var allowedUrlsToUse = urls.Value.Split(','); + var allowedUrlsToUse = urlsValue + .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + .Where(u => Uri.IsWellFormedUriString(u, UriKind.Absolute)) + .ToArray(); - builder.WebHost.UseUrls(allowedUrlsToUse); + if (allowedUrlsToUse.Length > 0) + { + builder.WebHost.UseUrls(allowedUrlsToUse); + } + else + { + // optionally log or throw depending on desired behavior + Log.Warning("Configured 'Urls' section was present but no valid URLs were found."); + } } var allowedCorsOrigins = builder.Configuration.GetSection("AllowedCorsOrigins"); diff --git a/PortBlog.API/Services/MailService.cs b/PortBlog.API/Services/MailService.cs index 3cf85db..63aca96 100644 --- a/PortBlog.API/Services/MailService.cs +++ b/PortBlog.API/Services/MailService.cs @@ -67,16 +67,14 @@ namespace PortBlog.API.Services } catch (Exception ex) { - logger.LogCritical( - "Exception while sending mail from {FromEmail} ({Name}): {Exception}", - messageSendDto.FromEmail, - messageSendDto.Name, - ex.Message - ); + // Log full exception and persist failed message. Do not rethrow to avoid causing a 500 from OTP generation + logger.LogCritical(ex, "Exception while sending mail from {FromEmail} ({Name}).", messageSendDto.FromEmail, messageSendDto.Name); messageSendDto.SentStatus = (int)MailConstants.MailStatus.Failed; mailRepository.AddMessage(messageEntity); await mailRepository.SaveChangesAsync(); - throw new Exception(); + + // swallow the exception so OTP generation continues; caller can inspect delivery status via message logs + return; } } }