You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
4.3 KiB
129 lines
4.3 KiB
6 years ago
|
using System;
|
||
4 years ago
|
using System.Linq;
|
||
|
using System.Net;
|
||
11 years ago
|
using Nancy;
|
||
4 years ago
|
using NzbDrone.Common.Extensions;
|
||
11 years ago
|
|
||
4 years ago
|
namespace Prowlarr.Http.Extensions
|
||
11 years ago
|
{
|
||
|
public static class RequestExtensions
|
||
|
{
|
||
|
public static bool IsApiRequest(this Request request)
|
||
|
{
|
||
11 years ago
|
return request.Path.StartsWith("/api/", StringComparison.InvariantCultureIgnoreCase);
|
||
11 years ago
|
}
|
||
|
|
||
11 years ago
|
public static bool IsFeedRequest(this Request request)
|
||
|
{
|
||
|
return request.Path.StartsWith("/feed/", StringComparison.InvariantCultureIgnoreCase);
|
||
|
}
|
||
|
|
||
11 years ago
|
public static bool IsSignalRRequest(this Request request)
|
||
|
{
|
||
|
return request.Path.StartsWith("/signalr/", StringComparison.InvariantCultureIgnoreCase);
|
||
|
}
|
||
|
|
||
|
public static bool IsLocalRequest(this Request request)
|
||
|
{
|
||
5 years ago
|
return request.UserHostAddress.Equals("localhost") ||
|
||
11 years ago
|
request.UserHostAddress.Equals("127.0.0.1") ||
|
||
5 years ago
|
request.UserHostAddress.Equals("::1");
|
||
11 years ago
|
}
|
||
10 years ago
|
|
||
|
public static bool IsLoginRequest(this Request request)
|
||
|
{
|
||
|
return request.Path.Equals("/login", StringComparison.InvariantCultureIgnoreCase);
|
||
|
}
|
||
|
|
||
|
public static bool IsContentRequest(this Request request)
|
||
|
{
|
||
|
return request.Path.StartsWith("/Content/", StringComparison.InvariantCultureIgnoreCase);
|
||
|
}
|
||
7 years ago
|
|
||
|
public static bool IsSharedContentRequest(this Request request)
|
||
|
{
|
||
|
return request.Path.StartsWith("/MediaCover/", StringComparison.InvariantCultureIgnoreCase) ||
|
||
|
request.Path.StartsWith("/Content/Images/", StringComparison.InvariantCultureIgnoreCase);
|
||
|
}
|
||
6 years ago
|
|
||
|
public static bool GetBooleanQueryParameter(this Request request, string parameter, bool defaultValue = false)
|
||
|
{
|
||
|
var parameterValue = request.Query[parameter];
|
||
|
|
||
|
if (parameterValue.HasValue)
|
||
|
{
|
||
|
return bool.Parse(parameterValue.Value);
|
||
|
}
|
||
|
|
||
|
return defaultValue;
|
||
|
}
|
||
5 years ago
|
|
||
|
public static int GetIntegerQueryParameter(this Request request, string parameter, int defaultValue = 0)
|
||
|
{
|
||
|
var parameterValue = request.Query[parameter];
|
||
|
|
||
|
if (parameterValue.HasValue)
|
||
|
{
|
||
|
return int.Parse(parameterValue.Value);
|
||
|
}
|
||
|
|
||
|
return defaultValue;
|
||
|
}
|
||
5 years ago
|
|
||
|
public static int? GetNullableIntegerQueryParameter(this Request request, string parameter, int? defaultValue = null)
|
||
|
{
|
||
|
var parameterValue = request.Query[parameter];
|
||
|
|
||
|
if (parameterValue.HasValue)
|
||
|
{
|
||
|
return int.Parse(parameterValue.Value);
|
||
|
}
|
||
|
|
||
|
return defaultValue;
|
||
|
}
|
||
4 years ago
|
|
||
|
public static string GetRemoteIP(this NancyContext context)
|
||
|
{
|
||
|
if (context == null || context.Request == null)
|
||
|
{
|
||
|
return "Unknown";
|
||
|
}
|
||
|
|
||
|
var remoteAddress = context.Request.UserHostAddress;
|
||
|
IPAddress remoteIP;
|
||
|
|
||
|
// Only check if forwarded by a local network reverse proxy
|
||
|
if (IPAddress.TryParse(remoteAddress, out remoteIP) && remoteIP.IsLocalAddress())
|
||
|
{
|
||
|
var realIPHeader = context.Request.Headers["X-Real-IP"];
|
||
|
if (realIPHeader.Any())
|
||
|
{
|
||
|
return realIPHeader.First().ToString();
|
||
|
}
|
||
|
|
||
|
var forwardedForHeader = context.Request.Headers["X-Forwarded-For"];
|
||
|
if (forwardedForHeader.Any())
|
||
|
{
|
||
|
// Get the first address that was forwarded by a local IP to prevent remote clients faking another proxy
|
||
|
foreach (var forwardedForAddress in forwardedForHeader.SelectMany(v => v.Split(',')).Select(v => v.Trim()).Reverse())
|
||
|
{
|
||
|
if (!IPAddress.TryParse(forwardedForAddress, out remoteIP))
|
||
|
{
|
||
|
return remoteAddress;
|
||
|
}
|
||
|
|
||
|
if (!remoteIP.IsLocalAddress())
|
||
|
{
|
||
|
return forwardedForAddress;
|
||
|
}
|
||
|
|
||
|
remoteAddress = forwardedForAddress;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return remoteAddress;
|
||
|
}
|
||
11 years ago
|
}
|
||
|
}
|