2021-06-26 07:30:48 +02:00
using Microsoft.AspNetCore.Hosting ;
using Microsoft.AspNetCore.Http ;
2019-01-25 08:47:19 +01:00
using Microsoft.AspNetCore.Mvc ;
2018-06-15 02:57:03 +02:00
using Microsoft.AspNetCore.Mvc.Routing ;
using System ;
2015-12-22 08:54:22 +01:00
using System.Linq ;
2015-12-23 21:14:34 +01:00
using System.Text.RegularExpressions ;
2015-12-22 08:54:22 +01:00
using System.Web ;
2021-06-26 07:30:48 +02:00
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.Hosting ;
using Microsoft.AspNetCore.Routing ;
2021-06-29 06:34:01 +02:00
using Newtonsoft.Json.Linq ;
2015-12-22 08:54:22 +01:00
2021-06-26 07:30:48 +02:00
namespace Teknik.Utilities.Routing
2015-12-22 08:54:22 +01:00
{
public static class UrlExtensions
{
2018-06-15 02:57:03 +02:00
public static string SubRouteUrl ( this IUrlHelper url , string sub , string routeName )
2015-12-23 21:14:34 +01:00
{
2017-01-18 09:12:22 +01:00
return url . SubRouteUrl ( sub , routeName , null , string . Empty ) ;
2016-10-08 07:21:28 +02:00
}
2018-06-15 02:57:03 +02:00
public static string SubRouteUrl ( this IUrlHelper url , string sub , string routeName , string hostOverride )
2016-10-08 07:21:28 +02:00
{
2017-01-18 09:12:22 +01:00
return url . SubRouteUrl ( sub , routeName , null , hostOverride ) ;
2016-10-08 07:21:28 +02:00
}
2018-06-15 02:57:03 +02:00
public static string SubRouteUrl ( this IUrlHelper url , string sub , string routeName , object routeValues )
2016-10-08 07:21:28 +02:00
{
2017-01-18 09:12:22 +01:00
return url . SubRouteUrl ( sub , routeName , routeValues , string . Empty ) ;
2015-12-23 21:14:34 +01:00
}
2015-12-22 08:54:22 +01:00
/// <summary>
2015-12-23 21:14:34 +01:00
/// Generates a full URL given the specified sub domain and route name
2015-12-22 08:54:22 +01:00
/// </summary>
/// <param name="url"></param>
/// <param name="sub"></param>
2015-12-23 21:14:34 +01:00
/// <param name="routeName"></param>
2015-12-22 08:54:22 +01:00
/// <param name="routeValues"></param>
/// <returns></returns>
2018-06-15 02:57:03 +02:00
public static string SubRouteUrl ( this IUrlHelper url , string sub , string routeName , object routeValues , string hostOverride )
2015-12-22 08:54:22 +01:00
{
2021-06-26 07:30:48 +02:00
var linkGen = url . ActionContext . HttpContext . RequestServices . GetService < LinkGenerator > ( ) ;
var env = url . ActionContext . HttpContext . RequestServices . GetService < IWebHostEnvironment > ( ) ;
2015-12-22 08:54:22 +01:00
2021-06-26 07:30:48 +02:00
string host = url . ActionContext . HttpContext . Request . Host . Value ;
string domain = host ;
2015-12-22 08:54:22 +01:00
2021-06-26 07:30:48 +02:00
// Generate a new domain if we aren't in development
if ( ! env . IsEnvironment ( Environments . Development ) & &
! string . IsNullOrEmpty ( sub ) )
2015-12-23 21:14:34 +01:00
{
2021-06-26 07:30:48 +02:00
domain = sub + "." + domain . GetDomain ( ) ;
2015-12-23 21:14:34 +01:00
}
2018-06-15 02:57:03 +02:00
string fullHost = string . Format ( "{0}://{1}" , url . ActionContext . HttpContext . Request . Scheme , domain ) ;
2016-10-08 07:21:28 +02:00
2021-06-26 07:30:48 +02:00
var routeValueDict = new RouteValueDictionary ( routeValues ) ;
2015-12-23 08:29:02 +01:00
2021-06-26 07:30:48 +02:00
// Get the endpoint mapping
var mapping = EndpointHelper . GetEndpointMapping ( routeName ) ;
2021-06-29 06:34:01 +02:00
if ( mapping ! = null )
2015-12-23 08:29:02 +01:00
{
2021-06-26 07:30:48 +02:00
routeValueDict . TryAdd ( "area" , mapping . Area ) ;
2021-06-29 06:34:01 +02:00
if ( mapping . Defaults ! = null )
{
var defaults = mapping . Defaults as JObject ;
foreach ( var defaultVal in defaults )
{
routeValueDict . TryAdd ( defaultVal . Key , defaultVal . Value . ToObject < object > ( ) ) ;
}
}
2015-12-23 08:29:02 +01:00
}
2021-06-26 07:30:48 +02:00
var path = linkGen . GetPathByAddress ( url . ActionContext . HttpContext , routeName , routeValueDict ) ;
2015-12-22 08:54:22 +01:00
2021-06-26 07:30:48 +02:00
return $"{fullHost}{path}" ;
2015-12-22 08:54:22 +01:00
}
2016-10-08 07:21:28 +02:00
2015-12-23 08:29:02 +01:00
public static string GetUrlParameters ( this string url )
{
Uri uri = new Uri ( url ) ;
var queryParts = HttpUtility . ParseQueryString ( uri . Query ) ;
return queryParts . ToString ( ) ;
}
public static string SetUrlParameter ( this string url , string paramName , string value )
{
return new Uri ( url ) . SetParameter ( paramName , value ) . ToString ( ) ;
}
public static Uri SetParameter ( this Uri url , string paramName , string value )
{
var queryParts = HttpUtility . ParseQueryString ( url . Query ) ;
queryParts [ paramName ] = value ;
return new Uri ( url . AbsoluteUriExcludingQuery ( ) + '?' + queryParts . ToString ( ) ) ;
}
public static string AbsoluteUriExcludingQuery ( this Uri url )
{
return url . AbsoluteUri . Split ( '?' ) . FirstOrDefault ( ) ? ? String . Empty ;
}
2017-01-18 09:12:22 +01:00
2015-12-23 21:14:34 +01:00
public static string GetSubdomain ( this string host )
{
if ( host . IndexOf ( ":" ) > = 0 )
host = host . Substring ( 0 , host . IndexOf ( ":" ) ) ;
Regex tldRegex = new Regex ( @"\.[a-z]{2,3}\.[a-z]{2}$" ) ;
host = tldRegex . Replace ( host , "" ) ;
tldRegex = new Regex ( @"\.[a-z]{2,4}$" ) ;
host = tldRegex . Replace ( host , "" ) ;
if ( host . Split ( '.' ) . Length > 1 )
return host . Substring ( 0 , host . IndexOf ( "." ) ) ;
else
return string . Empty ;
}
2016-01-26 08:24:17 +01:00
2018-06-15 02:57:03 +02:00
public static string GetSubdomain ( this IUrlHelper url )
2016-01-26 08:24:17 +01:00
{
2018-06-15 02:57:03 +02:00
string host = url . ActionContext . HttpContext . Request . Host . Value ;
2016-01-26 08:24:17 +01:00
// Grab the sub from parameters if it exists
2018-06-15 02:57:03 +02:00
string subParam = url . ActionContext . HttpContext . Request . Query [ "sub" ] ; // A subdomain specified as a query parameter takes precedence over the hostname unless on dev
2016-01-26 08:24:17 +01:00
if ( string . IsNullOrEmpty ( subParam ) )
{
// If we are on dev and no subparam, we need to set the subparam to the specified sub
subParam = host . GetSubdomain ( ) ;
}
return subParam ;
}
2016-02-06 01:48:00 +01:00
public static string GetDomain ( this string host )
{
string domain = host ;
var split = host . Split ( '.' ) ; // split the host by '.'
if ( split . Count ( ) > 2 )
{
int index = host . IndexOf ( '.' ) + 1 ;
if ( index > = 0 & & index < host . Length )
domain = host . Substring ( index , ( host . Length - index ) ) ;
}
return domain ;
}
public static string GetDomain ( this Uri uri )
{
string domain = uri . Host ;
var split = uri . Host . Split ( '.' ) ; // split the host by '.'
if ( split . Count ( ) > 2 )
{
int index = uri . Host . IndexOf ( '.' ) + 1 ;
if ( index > = 0 & & index < uri . Host . Length )
domain = uri . Host . Substring ( index , ( uri . Host . Length - index ) ) ;
}
return domain ;
}
2018-06-15 02:57:03 +02:00
public static string GetActive ( this IUrlHelper url , params string [ ] subs )
2016-01-26 08:24:17 +01:00
{
2019-01-25 08:47:19 +01:00
return url . GetActive ( null , null , subs ) ;
}
public static string GetActive ( this IUrlHelper url , string controller )
{
return url . GetActive ( controller , null ) ;
}
public static string GetActive ( this IUrlHelper url , string controller , string action , params string [ ] subs )
{
var curSub = url . GetSubdomain ( ) ;
var curController = url . ActionContext . RouteData . Values [ "Controller" ] ? . ToString ( ) ;
var curAction = url . ActionContext . RouteData . Values [ "Action" ] ? . ToString ( ) ;
2016-01-26 08:24:17 +01:00
foreach ( string sub in subs )
{
if ( curSub = = sub )
{
2019-01-25 08:47:19 +01:00
if ( ( string . IsNullOrEmpty ( controller ) | | curController = = controller ) & &
( string . IsNullOrEmpty ( action ) | | curAction = = action ) )
return "active" ;
2016-01-26 08:24:17 +01:00
}
}
2019-01-25 08:47:19 +01:00
if ( ! subs . Any ( ) & &
( string . IsNullOrEmpty ( controller ) | | curController = = controller ) & &
( string . IsNullOrEmpty ( action ) | | curAction = = action ) )
{
return "active" ;
}
2016-01-26 08:24:17 +01:00
return string . Empty ;
}
2016-02-24 20:58:56 +01:00
public static bool IsValidUrl ( this string url )
{
Uri uriResult ;
2016-02-24 22:08:34 +01:00
bool result = Uri . TryCreate ( url , UriKind . Absolute , out uriResult ) ;
2016-02-24 20:58:56 +01:00
if ( result )
{
result = uriResult . IsWellFormedOriginalString ( ) ;
}
return result ;
}
2018-06-15 02:57:03 +02:00
public static string FullURL ( this IUrlHelper helper , string virtualPath )
{
var url = string . Format ( "{0}://{1}{2}" , helper . ActionContext . HttpContext . Request . Scheme , helper . ActionContext . HttpContext . Request . Host . ToUriComponent ( ) , helper . Content ( virtualPath ) ) ;
return url ;
}
2015-12-22 08:54:22 +01:00
}
}