336 lines
13 KiB
C#
336 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Net;
|
|
|
|
namespace MontoyaTech.Rest.Net
|
|
{
|
|
/// <summary>
|
|
/// The outline of a Http Route.
|
|
/// </summary>
|
|
public class Route
|
|
{
|
|
/// <summary>
|
|
/// The http method for this route.
|
|
/// </summary>
|
|
public string Method;
|
|
|
|
/// <summary>
|
|
/// The syntax of this route.
|
|
/// </summary>
|
|
public string Syntax;
|
|
|
|
/// <summary>
|
|
/// The target function to invoke if this route is invoked.
|
|
/// </summary>
|
|
private Func<RouteListenerContext, HttpListenerResponse> Target;
|
|
|
|
/// <summary>
|
|
/// Whether or not to close the response after the route is invoked.
|
|
/// </summary>
|
|
public bool CloseResponse = true;
|
|
|
|
internal Route() { }
|
|
|
|
/// <summary>
|
|
/// Creates a new route with a given method, syntax, target and optional close response flag.
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="method"></param>
|
|
/// <param name="syntax"></param>
|
|
/// <param name="target"></param>
|
|
/// <param name="closeResponse"></param>
|
|
public Route(string method, string syntax, Func<RouteListenerContext, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new route with a given method, syntax, target and optional close response flag.
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="method"></param>
|
|
/// <param name="syntax"></param>
|
|
/// <param name="target"></param>
|
|
/// <param name="closeResponse"></param>
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
/// <summary>
|
|
/// Returns a list of the argument names for this route.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<string> GetArguments()
|
|
{
|
|
var segments = this.Syntax.Split('/').Where(segment => segment.Length > 0).Select(segment => segment.Trim()).ToList();
|
|
|
|
var results = new List<string>();
|
|
|
|
foreach (var segment in segments)
|
|
if (segment.StartsWith("{"))
|
|
results.Add(segment.Substring(1, segment.Length - 2));
|
|
|
|
return results;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the url for this route including arguments.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public string GetUrl()
|
|
{
|
|
var segments = this.Syntax.Split('/').Where(segment => segment.Length > 0).Select(segment => segment.Trim()).ToList();
|
|
|
|
var builder = new StringBuilder();
|
|
|
|
foreach (var segment in segments)
|
|
{
|
|
builder.Append('/');
|
|
|
|
if (segment.StartsWith("{"))
|
|
builder.Append(segment);
|
|
else if (segment == "*")
|
|
builder.Append("*");
|
|
else if (segment == "**")
|
|
break;
|
|
else
|
|
builder.Append(segment);
|
|
}
|
|
|
|
return builder.ToString();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invokes this route with a context and a given set of string arguments.
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
/// <param name="arguments"></param>
|
|
public virtual void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.Invoke(context);
|
|
}
|
|
}
|
|
|
|
public class Route<T1> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(context, RouteArgumentConverter.Convert<T1>(arguments[0]));
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1])
|
|
);
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2, T3> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, T3, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, T3, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, T3, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1]),
|
|
RouteArgumentConverter.Convert<T3>(arguments[2])
|
|
);
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2, T3, T4> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, T3, T4, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1]),
|
|
RouteArgumentConverter.Convert<T3>(arguments[2]),
|
|
RouteArgumentConverter.Convert<T4>(arguments[3])
|
|
);
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2, T3, T4, T5> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, T3, T4, T5, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1]),
|
|
RouteArgumentConverter.Convert<T3>(arguments[2]),
|
|
RouteArgumentConverter.Convert<T4>(arguments[3]),
|
|
RouteArgumentConverter.Convert<T5>(arguments[4])
|
|
);
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2, T3, T4, T5, T6> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1]),
|
|
RouteArgumentConverter.Convert<T3>(arguments[2]),
|
|
RouteArgumentConverter.Convert<T4>(arguments[3]),
|
|
RouteArgumentConverter.Convert<T5>(arguments[4]),
|
|
RouteArgumentConverter.Convert<T6>(arguments[5])
|
|
);
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2, T3, T4, T5, T6, T7> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, T7, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, T7, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, T7, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1]),
|
|
RouteArgumentConverter.Convert<T3>(arguments[2]),
|
|
RouteArgumentConverter.Convert<T4>(arguments[3]),
|
|
RouteArgumentConverter.Convert<T5>(arguments[4]),
|
|
RouteArgumentConverter.Convert<T6>(arguments[5]),
|
|
RouteArgumentConverter.Convert<T7>(arguments[6])
|
|
);
|
|
}
|
|
}
|
|
|
|
public class Route<T1, T2, T3, T4, T5, T6, T7, T8> : Route
|
|
{
|
|
private Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, T7, T8, HttpListenerResponse> Target;
|
|
|
|
public Route(string method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, T7, T8, HttpListenerResponse> target, bool closeResponse = true)
|
|
{
|
|
this.Method = method;
|
|
this.Syntax = syntax;
|
|
this.Target = target;
|
|
this.CloseResponse = closeResponse;
|
|
}
|
|
|
|
public Route(HttpRequestMethod method, string syntax, Func<RouteListenerContext, T1, T2, T3, T4, T5, T6, T7, T8, HttpListenerResponse> target, bool closeResponse = true)
|
|
: this(method.ToString(), syntax, target, closeResponse) { }
|
|
|
|
public override void Invoke(RouteListenerContext context, params string[] arguments)
|
|
{
|
|
this.Target.DynamicInvoke(
|
|
context,
|
|
RouteArgumentConverter.Convert<T1>(arguments[0]),
|
|
RouteArgumentConverter.Convert<T2>(arguments[1]),
|
|
RouteArgumentConverter.Convert<T3>(arguments[2]),
|
|
RouteArgumentConverter.Convert<T4>(arguments[3]),
|
|
RouteArgumentConverter.Convert<T5>(arguments[4]),
|
|
RouteArgumentConverter.Convert<T6>(arguments[5]),
|
|
RouteArgumentConverter.Convert<T7>(arguments[6]),
|
|
RouteArgumentConverter.Convert<T8>(arguments[7])
|
|
);
|
|
}
|
|
}
|
|
}
|