-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIServiceCollectionExtensions.cs
More file actions
68 lines (55 loc) · 2.45 KB
/
IServiceCollectionExtensions.cs
File metadata and controls
68 lines (55 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
namespace Crumpled.RobotsTxt.Core;
public static class IServiceCollectionExtensions
{
public static void AddStaticRobotsTxt(this IServiceCollection services, Func<RobotsTxtOptionsBuilder, RobotsTxtOptionsBuilder> builderFunc)
{
var builder = new RobotsTxtOptionsBuilder();
var options = builderFunc(builder).Build();
services.AddSingleton(options);
var previousRegistration = services.FirstOrDefault(s => s.ServiceType == typeof(IRobotsTxtProvider));
if (!options.Hostnames.Any())
{
if (previousRegistration?.Lifetime != ServiceLifetime.Scoped)
{
services.TryAddSingleton<IRobotsTxtProvider, StaticRobotsTxtProvider>();
}
}
else
{
if (previousRegistration?.Lifetime != ServiceLifetime.Scoped && previousRegistration != null)
{
services.Remove(previousRegistration);
}
services.TryAddScoped(CreateRobotsTxtProviderForMultipleHosts);
}
}
private static readonly RobotsTxtOptions _denyAllOptions = new RobotsTxtOptionsBuilder().DenyAll().Build();
internal static IRobotsTxtProvider CreateRobotsTxtProviderForMultipleHosts(IServiceProvider services)
{
var httpContextAccessor = services.GetRequiredService<IHttpContextAccessor>();
var httpContext = httpContextAccessor.HttpContext;
if (httpContext == null)
{
throw new InvalidOperationException("Could not get HttpContext from IHttpContextAccessor.");
}
var host = httpContext.Request.Host.Value;
var options = services.GetRequiredService<IEnumerable<RobotsTxtOptions>>().ToArray();
var robotsOptions = options
.Where(option => option.Hostnames.Any(hostname => hostname.Equals(host, StringComparison.OrdinalIgnoreCase)));
if (!robotsOptions.Any())
{
robotsOptions = options.Where(option => !option.Hostnames.Any());
if (!robotsOptions.Any())
{
robotsOptions = new[] { _denyAllOptions };
}
}
var hostEnvironment = services.GetRequiredService<IHostEnvironment>();
return new StaticRobotsTxtProvider(robotsOptions, hostEnvironment);
}
}