@@ -18,13 +18,16 @@ public static class CqrsRouteMapper
1818
1919 private static readonly List < Type > CommandTypes = new ( ) { typeof ( ICommand < > ) , typeof ( ICommand < , > ) } ;
2020
21+ private static readonly string [ ] GetAndHeadMethods = { "GET" , "HEAD" } ;
22+
2123 /// <summary>
2224 /// Map a query API, using GET method. <typeparamref name="T"/> would been constructed from route and query string.
2325 /// </summary>
2426 /// <param name="app"><see cref="IApplicationBuilder"/></param>
2527 /// <param name="route">The route template for API.</param>
2628 /// <param name="mapNullableRouteParameters">Multiple routes should be mapped when for nullable route parameters.</param>
2729 /// <param name="nullRouteParameterPattern">Replace route parameter with given string to represent null.</param>
30+ /// <param name="enableHead">Map HEAD method for the same routes.</param>
2831 /// <typeparam name="T">The type of the query.</typeparam>
2932 /// <returns></returns>
3033 /// <example>
@@ -44,13 +47,15 @@ public static IEndpointConventionBuilder MapQuery<T>(
4447 this IEndpointRouteBuilder app ,
4548 [ StringSyntax ( "Route" ) ] string route ,
4649 MapNullableRouteParameter mapNullableRouteParameters = MapNullableRouteParameter . Disable ,
47- string nullRouteParameterPattern = "-" )
50+ string nullRouteParameterPattern = "-" ,
51+ bool enableHead = false )
4852 {
4953 return app . MapQuery (
5054 route ,
5155 ( [ AsParameters ] T query ) => query ,
5256 mapNullableRouteParameters ,
53- nullRouteParameterPattern ) ;
57+ nullRouteParameterPattern ,
58+ enableHead ) ;
5459 }
5560
5661 /// <summary>
@@ -61,6 +66,7 @@ public static IEndpointConventionBuilder MapQuery<T>(
6166 /// <param name="handler">The delegate that returns a <see cref="IQuery{TView}"/> instance.</param>
6267 /// <param name="mapNullableRouteParameters">Multiple routes should be mapped when for nullable route parameters.</param>
6368 /// <param name="nullRouteParameterPattern">Replace route parameter with given string to represent null.</param>
69+ /// <param name="enableHead">Allow HEAD for the same routes.</param>
6470 /// <returns></returns>
6571 /// <example>
6672 /// The following code:
@@ -80,7 +86,8 @@ public static IEndpointConventionBuilder MapQuery(
8086 [ StringSyntax ( "Route" ) ] string route ,
8187 Delegate handler ,
8288 MapNullableRouteParameter mapNullableRouteParameters = MapNullableRouteParameter . Disable ,
83- string nullRouteParameterPattern = "-" )
89+ string nullRouteParameterPattern = "-" ,
90+ bool enableHead = false )
8491 {
8592 var isQuery = handler . Method . ReturnType . GetInterfaces ( ) . Where ( x => x . IsGenericType )
8693 . Any ( x => QueryTypes . Contains ( x . GetGenericTypeDefinition ( ) ) ) ;
@@ -92,7 +99,7 @@ public static IEndpointConventionBuilder MapQuery(
9299
93100 if ( mapNullableRouteParameters is MapNullableRouteParameter . Disable )
94101 {
95- return app . MapGet ( route , handler ) . AddEndpointFilter < QueryEndpointHandler > ( ) ;
102+ return MapRoutes ( route ) ;
96103 }
97104
98105 if ( string . IsNullOrWhiteSpace ( nullRouteParameterPattern ) )
@@ -125,10 +132,16 @@ public static IEndpointConventionBuilder MapQuery(
125132 var regex = new Regex ( "{" + x . Name + "[^}]*?}" , RegexOptions . IgnoreCase ) ;
126133 return regex . Replace ( r , nullRouteParameterPattern ) ;
127134 } ) ;
128- app . MapGet ( newRoute , handler ) . AddEndpointFilter < QueryEndpointHandler > ( ) ;
135+ MapRoutes ( newRoute ) ;
129136 }
130137
131- return app . MapGet ( route , handler ) . AddEndpointFilter < QueryEndpointHandler > ( ) ;
138+ return MapRoutes ( route ) ;
139+
140+ IEndpointConventionBuilder MapRoutes ( string r )
141+ {
142+ var endpoint = enableHead ? app . MapMethods ( r , GetAndHeadMethods , handler ) : app . MapGet ( r , handler ) ;
143+ return endpoint . AddEndpointFilter < QueryEndpointHandler > ( ) ;
144+ }
132145 }
133146
134147 /// <summary>
0 commit comments