diff --git a/VAR.WebFormsCore/Code/ExtensionMethods.cs b/VAR.WebFormsCore/Code/ExtensionMethods.cs index e1327be..8b3d1b2 100644 --- a/VAR.WebFormsCore/Code/ExtensionMethods.cs +++ b/VAR.WebFormsCore/Code/ExtensionMethods.cs @@ -41,19 +41,39 @@ namespace VAR.WebFormsCore.Code context.Response.Body.WriteAsync(byteObject); } + public static void SafeSet(this IHeaderDictionary header, string key, string value) + { + if (header.ContainsKey(key)) + { + header[key] = value; + } + else + { + header.Add(key, value); + } + } + + public static void SafeDel(this IHeaderDictionary header, string key) + { + if (header.ContainsKey(key)) + { + header.Remove(key); + } + } + public static void PrepareCacheableResponse(this HttpResponse response) { const int secondsInDay = 86400; - response.Headers.Add("Cache-Control", string.Format("public, max-age={0}", secondsInDay)); + response.Headers.SafeSet("Cache-Control", string.Format("public, max-age={0}", secondsInDay)); string ExpireDate = DateTime.UtcNow.AddSeconds(secondsInDay).ToString("ddd, dd MMM yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); - response.Headers.Add("Expires", ExpireDate + " GMT"); + response.Headers.SafeSet("Expires", ExpireDate + " GMT"); } public static void PrepareUncacheableResponse(this HttpResponse response) { - response.Headers.Add("Cache-Control", "max-age=0, no-cache, no-store"); + response.Headers.SafeSet("Cache-Control", "max-age=0, no-cache, no-store"); string ExpireDate = DateTime.UtcNow.AddSeconds(-1500).ToString("ddd, dd MMM yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); - response.Headers.Add("Expires", ExpireDate + " GMT"); + response.Headers.SafeSet("Expires", ExpireDate + " GMT"); } #endregion HttpContext diff --git a/VAR.WebFormsCore/Code/GlobalRouterMiddleware.cs b/VAR.WebFormsCore/Code/GlobalRouterMiddleware.cs index 1cb3e65..b715aa0 100644 --- a/VAR.WebFormsCore/Code/GlobalRouterMiddleware.cs +++ b/VAR.WebFormsCore/Code/GlobalRouterMiddleware.cs @@ -24,11 +24,11 @@ namespace VAR.WebFormsCore.Code public async Task Invoke(HttpContext httpContext) { - httpContext.Response.Headers.Remove("Server"); - httpContext.Response.Headers.Remove("X-Powered-By"); - httpContext.Response.Headers.Add("X-Content-Type-Options", "nosniff"); - httpContext.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN"); - httpContext.Response.Headers.Add("X-XSS-Protection", "1; mode=block"); + httpContext.Response.Headers.SafeDel("Server"); + httpContext.Response.Headers.SafeDel("X-Powered-By"); + httpContext.Response.Headers.SafeSet("X-Content-Type-Options", "nosniff"); + httpContext.Response.Headers.SafeSet("X-Frame-Options", "SAMEORIGIN"); + httpContext.Response.Headers.SafeSet("X-XSS-Protection", "1; mode=block"); try { diff --git a/VAR.WebFormsCore/Pages/Page.cs b/VAR.WebFormsCore/Pages/Page.cs index 7552101..ebed3a0 100644 --- a/VAR.WebFormsCore/Pages/Page.cs +++ b/VAR.WebFormsCore/Pages/Page.cs @@ -59,7 +59,7 @@ namespace VAR.WebFormsCore.Pages Render(stringWriter); if (context.Response.HasStarted) { return; } - context.Response.Headers.Add("Content-Type", "text/html"); + context.Response.Headers.SafeSet("Content-Type", "text/html"); byte[] byteObject = _utf8Econding.GetBytes(stringWriter.ToString()); await context.Response.Body.WriteAsync(byteObject); } diff --git a/VAR.WebFormsCore/VAR.WebFormsCore.csproj b/VAR.WebFormsCore/VAR.WebFormsCore.csproj index 9315b93..5faa959 100644 --- a/VAR.WebFormsCore/VAR.WebFormsCore.csproj +++ b/VAR.WebFormsCore/VAR.WebFormsCore.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Library