@@ -3,21 +3,24 @@ mod json;
33mod mock;
44mod proxy;
55
6+ use std:: fmt;
7+
68use anyhow:: Result ;
79use hyper:: Body ;
810
911use self :: fs:: { DirHandler , FileHandler } ;
1012use self :: json:: JsonHandler ;
1113use self :: mock:: MockHandler ;
1214use self :: proxy:: ProxyHandler ;
13- use crate :: config ;
15+ use crate :: method :: MethodFilter ;
1416use crate :: path:: PathRewriter ;
17+ use crate :: { config, response} ;
1518
16- #[ derive( Debug ) ]
1719pub struct Handler {
1820 kind : HandlerKind ,
1921 path_rewriter : Option < PathRewriter > ,
2022 response_headers : http:: HeaderMap ,
23+ method_filter : Box < dyn MethodFilter > ,
2124}
2225
2326#[ derive( Debug ) ]
@@ -36,6 +39,7 @@ impl Handler {
3639 route,
3740 kind,
3841 response_headers,
42+ methods,
3943 } = route;
4044 let path_rewriter = rewrite_path. map ( |replace| {
4145 let regex = route. to_regex ( ) ;
@@ -50,17 +54,30 @@ impl Handler {
5054 config:: RouteKind :: Mock ( mock) => HandlerKind :: Mock ( MockHandler :: new ( mock) ) ,
5155 } ;
5256
57+ let method_filter = match methods {
58+ Some ( methods) => Box :: new ( methods) ,
59+ None => kind. default_method_filter ( ) ,
60+ } ;
61+
5362 Ok ( Handler {
5463 path_rewriter,
5564 kind,
5665 response_headers,
66+ method_filter,
5767 } )
5868 }
5969
6070 pub async fn handle (
6171 & self ,
6272 request : http:: Request < Body > ,
6373 ) -> Result < http:: Response < Body > , ( http:: Request < Body > , http:: Response < Body > ) > {
74+ if !self . method_filter . is_match ( request. method ( ) ) {
75+ return Err ( (
76+ request,
77+ response:: from_status ( http:: StatusCode :: METHOD_NOT_ALLOWED ) ,
78+ ) ) ;
79+ }
80+
6481 let path = match & self . path_rewriter {
6582 Some ( path_rewriter) => path_rewriter. rewrite ( request. uri ( ) . path ( ) ) ,
6683 None => request. uri ( ) . path ( ) . to_owned ( ) ,
@@ -81,3 +98,24 @@ impl Handler {
8198 result
8299 }
83100}
101+
102+ impl HandlerKind {
103+ fn default_method_filter ( & self ) -> Box < dyn MethodFilter > {
104+ match self {
105+ HandlerKind :: File ( _) | HandlerKind :: Dir ( _) => fs:: default_method_filter ( ) ,
106+ HandlerKind :: Proxy ( _) => proxy:: default_method_filter ( ) ,
107+ HandlerKind :: Json ( _) => json:: default_method_filter ( ) ,
108+ HandlerKind :: Mock ( _) => mock:: default_method_filter ( ) ,
109+ }
110+ }
111+ }
112+
113+ impl fmt:: Debug for Handler {
114+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
115+ f. debug_struct ( "Handler" )
116+ . field ( "kind" , & self . kind )
117+ . field ( "path_rewriter" , & self . path_rewriter )
118+ . field ( "response_headers" , & self . response_headers )
119+ . finish ( )
120+ }
121+ }
0 commit comments