File: RedirectToHttpsRule.cs
Web Access
Project: src\src\Middleware\Rewrite\src\Microsoft.AspNetCore.Rewrite.csproj (Microsoft.AspNetCore.Rewrite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Rewrite.Logging;
 
namespace Microsoft.AspNetCore.Rewrite;
 
internal sealed class RedirectToHttpsRule : IRule
{
    public int? SSLPort { get; set; }
    public int StatusCode { get; set; }
 
    public void ApplyRule(RewriteContext context)
    {
        if (!context.HttpContext.Request.IsHttps)
        {
            var host = context.HttpContext.Request.Host;
            int port;
            if (SSLPort.HasValue && (port = SSLPort.GetValueOrDefault()) > 0)
            {
                // a specific SSL port is specified
                host = new HostString(host.Host, port);
            }
            else
            {
                // clear the port
                host = new HostString(host.Host);
            }
 
            var req = context.HttpContext.Request;
            var newUrl = UriHelper.BuildAbsolute("https", host, req.PathBase, req.Path, req.QueryString, default);
            var response = context.HttpContext.Response;
            response.StatusCode = StatusCode;
            response.Headers.Location = newUrl;
            context.Result = RuleResult.EndResponse;
            context.Logger.RedirectedToHttps();
        }
    }
}