aspnetcore/src/Microsoft.AspNetCore.Rewrite/Internal/UrlActions/ChangeCookieAction.cs

76 lines
2.2 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
{
public class ChangeCookieAction : UrlAction
{
private readonly Func<DateTimeOffset> _timeSource;
private CookieOptions _cachedOptions;
public ChangeCookieAction(string name)
: this(name, () => DateTimeOffset.UtcNow)
{
}
// for testing
internal ChangeCookieAction(string name, Func<DateTimeOffset> timeSource)
{
_timeSource = timeSource;
if (string.IsNullOrEmpty(name))
{
throw new ArgumentException(nameof(name));
}
Name = name;
}
public string Name { get; }
public string Value { get; set; }
public string Domain { get; set; }
public TimeSpan Lifetime { get; set; }
public string Path { get; set; }
public bool Secure { get; set; }
public bool HttpOnly { get; set; }
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
{
var options = GetOrCreateOptions();
context.HttpContext.Response.Cookies.Append(Name, Value ?? string.Empty, options);
}
private CookieOptions GetOrCreateOptions()
{
if (Lifetime > TimeSpan.Zero)
{
var now = _timeSource();
return new CookieOptions()
{
Domain = Domain,
HttpOnly = HttpOnly,
Secure = Secure,
Path = Path,
Expires = now.Add(Lifetime)
};
}
if (_cachedOptions == null)
{
_cachedOptions = new CookieOptions()
{
Domain = Domain,
HttpOnly = HttpOnly,
Secure = Secure,
Path = Path
};
}
return _cachedOptions;
}
}
}