Fixed bug where root syntax wouldn't match in the RouteMatcher. Added WithHeader extension. Added preprocess and postprocess route events so we can control routes at a global level easier.
This commit is contained in:
		| @@ -173,5 +173,19 @@ namespace MontoyaTech.Rest.Net | |||||||
|  |  | ||||||
|             return response; |             return response; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Sets a header for a given response. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="response"></param> | ||||||
|  |         /// <param name="name"></param> | ||||||
|  |         /// <param name="value"></param> | ||||||
|  |         /// <returns>This response.</returns> | ||||||
|  |         public static HttpListenerResponse WithHeader(this HttpListenerResponse response, string name, string value) | ||||||
|  |         { | ||||||
|  |             response.AddHeader(name, value); | ||||||
|  |  | ||||||
|  |             return response; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ | |||||||
|     <AssemblyName>MontoyaTech.Rest.Net</AssemblyName> |     <AssemblyName>MontoyaTech.Rest.Net</AssemblyName> | ||||||
|     <RootNamespace>MontoyaTech.Rest.Net</RootNamespace> |     <RootNamespace>MontoyaTech.Rest.Net</RootNamespace> | ||||||
|     <GenerateDocumentationFile>True</GenerateDocumentationFile> |     <GenerateDocumentationFile>True</GenerateDocumentationFile> | ||||||
|     <Version>1.0.3</Version> |     <Version>1.0.5</Version> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|    <PackageReference Include="Newtonsoft.Json"> |    <PackageReference Include="Newtonsoft.Json"> | ||||||
|   | |||||||
| @@ -29,6 +29,16 @@ namespace MontoyaTech.Rest.Net | |||||||
|         /// </summary> |         /// </summary> | ||||||
|         public ushort Port = 8081; |         public ushort Port = 8081; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// An event to preprocess routes before the route is executed. | ||||||
|  |         /// </summary> | ||||||
|  |         public event RoutePreprocess PreprocessEvent; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// An event to postprocess routes before the route response is returned. | ||||||
|  |         /// </summary> | ||||||
|  |         public event RoutePostprocess PostprocessEvent; | ||||||
|  |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Creates a new RouteListener with the default port number. |         /// Creates a new RouteListener with the default port number. | ||||||
|         /// </summary> |         /// </summary> | ||||||
| @@ -111,16 +121,34 @@ namespace MontoyaTech.Rest.Net | |||||||
|                                         handled = true; |                                         handled = true; | ||||||
|                                         close = this.Routes[i].CloseResponse; |                                         close = this.Routes[i].CloseResponse; | ||||||
|  |  | ||||||
|  |                                         var context = new RouteContext(ctx.Request, ctx.Response); | ||||||
|  |  | ||||||
|  |                                         //Preprocess the route context, if it returns false, then we have to not invoke the route. | ||||||
|  |                                         try | ||||||
|  |                                         { | ||||||
|  |                                             if (this.PreprocessEvent != null && !this.PreprocessEvent.Invoke(context)) | ||||||
|  |                                                 break; | ||||||
|  |                                         } | ||||||
|  |                                         catch { } | ||||||
|  |  | ||||||
|                                         //Make sure if the route fails we don't die here, just set the response to internal server error. |                                         //Make sure if the route fails we don't die here, just set the response to internal server error. | ||||||
|                                         try |                                         try | ||||||
|                                         { |                                         { | ||||||
|                                             this.Routes[i].Invoke(new RouteContext(ctx.Request, ctx.Response), arguments); |                                             this.Routes[i].Invoke(context, arguments); | ||||||
|                                         } |                                         } | ||||||
|                                         catch  |                                         catch  | ||||||
|                                         { |                                         { | ||||||
|                                             ctx.Response.WithStatus(HttpStatusCode.InternalServerError); |                                             ctx.Response.WithStatus(HttpStatusCode.InternalServerError); | ||||||
|                                         } |                                         } | ||||||
|  |  | ||||||
|  |                                         //Post process the route context. | ||||||
|  |                                         try | ||||||
|  |                                         { | ||||||
|  |                                             if (this.PostprocessEvent != null) | ||||||
|  |                                                 this.PostprocessEvent.Invoke(context); | ||||||
|  |                                         } | ||||||
|  |                                         catch { } | ||||||
|  |  | ||||||
|                                         break; |                                         break; | ||||||
|                                     } |                                     } | ||||||
|                                 } |                                 } | ||||||
|   | |||||||
| @@ -41,8 +41,11 @@ namespace MontoyaTech.Rest.Net | |||||||
|             var urlSegments = url.Split('/').Where(segment => segment.Length > 0).Select(segment => segment.Trim()).ToArray(); |             var urlSegments = url.Split('/').Where(segment => segment.Length > 0).Select(segment => segment.Trim()).ToArray(); | ||||||
|             var syntaxSegments = syntax.Split('/').Where(segment => segment.Length > 0).Select(segment => segment.Trim()).ToArray(); |             var syntaxSegments = syntax.Split('/').Where(segment => segment.Length > 0).Select(segment => segment.Trim()).ToArray(); | ||||||
|  |  | ||||||
|  |             //If we have no url segments, and we have no syntax segments, this is a root match which is fine. | ||||||
|  |             if (urlSegments.Length == 0 && syntaxSegments.Length == 0) | ||||||
|  |                 return true; | ||||||
|             //If we have no syntax segments this is not a match. |             //If we have no syntax segments this is not a match. | ||||||
|             if (syntaxSegments.Length == 0) |             else if (syntaxSegments.Length == 0) | ||||||
|                 return false; |                 return false; | ||||||
|  |  | ||||||
|             //If we have segments and the url does not then this may not be a match. |             //If we have segments and the url does not then this may not be a match. | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								Rest.Net/Rest.Net/RoutePostprocess.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Rest.Net/Rest.Net/RoutePostprocess.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace MontoyaTech.Rest.Net | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// A route post process delegate that can be used to process the response from routes. | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="context"></param> | ||||||
|  |     public delegate void RoutePostprocess(RouteContext context); | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								Rest.Net/Rest.Net/RoutePreprocess.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								Rest.Net/Rest.Net/RoutePreprocess.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace MontoyaTech.Rest.Net | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// A route preprocess delegate that can be used to process requests before they reach a route | ||||||
|  |     /// and reject them if needed. | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="context"></param> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public delegate bool RoutePreprocess(RouteContext context); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user