-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRssController.cs
More file actions
108 lines (86 loc) · 3.7 KB
/
RssController.cs
File metadata and controls
108 lines (86 loc) · 3.7 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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Copyright (c) Source Tree Solutions, LLC. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Author: Joe Audette
// Created: 2016-04-01
// Last Modified: 2018-06-19
//
using cloudscribe.Syndication.Models.Rss;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace cloudscribe.Syndication.Web.Controllers
{
[ApiExplorerSettings(IgnoreApi = true)]
public class RssController : Controller
{
public RssController(
ILogger<RssController> logger,
IEnumerable<IChannelProvider> channelProviders = null,
IChannelProviderResolver channelResolver = null,
IXmlFormatter xmlFormatter = null
)
{
Log = logger;
ChannelProviders = channelProviders ?? new List<IChannelProvider>();
if (channelProviders is List<IChannelProvider>)
{
var list = channelProviders as List<IChannelProvider>;
if (list.Count == 0)
{
list.Add(new NullChannelProvider());
}
}
ChannelResolver = channelResolver ?? new DefaultChannelProviderResolver();
XmlFormatter = xmlFormatter ?? new DefaultXmlFormatter();
}
protected ILogger Log { get; private set; }
protected IChannelProviderResolver ChannelResolver { get; private set; }
protected IEnumerable<IChannelProvider> ChannelProviders { get; private set; }
protected IChannelProvider CurrentChannelProvider { get; private set; }
protected IXmlFormatter XmlFormatter { get; private set; }
[HttpGet]
[ResponseCache(CacheProfileName = "RssCacheProfile")]
[Route("api/rss")]
public virtual async Task<IActionResult> Index()
{
CurrentChannelProvider = ChannelResolver.GetCurrentChannelProvider(ChannelProviders);
if (CurrentChannelProvider == null)
{
Response.StatusCode = 404;
return new EmptyResult();
}
var currentChannel = await CurrentChannelProvider.GetChannel();
if (currentChannel == null)
{
Response.StatusCode = 404;
return new EmptyResult();
}
if (ShouldRedirect(currentChannel, HttpContext))
{
Response.Redirect(currentChannel.RemoteFeedUrl, false);
}
var xml = XmlFormatter.BuildXml(currentChannel);
var processingInstruction = new XProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"/rss-style.xsl\"");
xml.AddFirst(processingInstruction);
return new XmlResult(xml);
}
protected bool ShouldRedirect(RssChannel channel, HttpContext context)
{
if (string.IsNullOrEmpty(channel.RemoteFeedUrl)) return false;
if (string.IsNullOrEmpty(channel.RemoteFeedProcessorUseAgentFragment)) return false;
var userAgentHeaders = context.Request.Headers["User-Agent"];
if (userAgentHeaders.Count == 0) return true;
var userAgent = userAgentHeaders[0];
if (string.IsNullOrEmpty(userAgent)) return true;
if (userAgent.Contains(channel.RemoteFeedProcessorUseAgentFragment))
{
return false;
}
return true;
}
}
}