@@ -5,6 +5,23 @@ pub type MiddlewareNext = async () -> &Responder noraise
55// 中间件类型:接受 HttpEvent 和 next 函数,返回 HttpBody
66pub type Middleware = async (MocketEvent , MiddlewareNext ) -> & Responder noraise
77
8+ ///|
9+ priv struct MiddlewareTrieEntry {
10+ order : Int
11+ middleware : Middleware
12+ }
13+
14+ ///|
15+ priv struct MiddlewareTrieNode {
16+ middlewares : Array [MiddlewareTrieEntry ]
17+ children : Map [String , MiddlewareTrieNode ]
18+ }
19+
20+ ///|
21+ fn new_middleware_trie_node() -> MiddlewareTrieNode {
22+ { middlewares: [] , children: {} }
23+ }
24+
825///|
926// 注册中间件,支持路径匹配
1027pub fn Mocket ::use_middleware(
@@ -13,8 +30,105 @@ pub fn Mocket::use_middleware(
1330 base_path? : String ,
1431) -> Unit {
1532 let base_path = base_path.unwrap_or(self.base_path)
16- // 将中间件和路径信息一起存储
33+ let order = self.middlewares.length()
1734 self.middlewares.push((base_path, middleware))
35+ self.middleware_trie.insert_middleware(base_path, order, middleware)
36+ }
37+
38+ ///|
39+ fn MiddlewareTrieNode ::insert_middleware(
40+ self : MiddlewareTrieNode ,
41+ base_path : String ,
42+ order : Int ,
43+ middleware : Middleware ,
44+ ) -> Unit {
45+ let mut node = self
46+ for segment in middleware_path_segments(base_path) {
47+ node = match node.children.get(segment) {
48+ Some (child) => child
49+ None => {
50+ let child = new_middleware_trie_node()
51+ node.children.set(segment, child)
52+ child
53+ }
54+ }
55+ }
56+ node.middlewares.push({ order, middleware })
57+ }
58+
59+ ///|
60+ fn middleware_path_segments(path : String ) -> Array [String ] {
61+ let path = strip_url_suffix(path)
62+ let segments = []
63+ if path == "" || path == "/" {
64+ return segments
65+ }
66+ for segment in path.split("/") {
67+ let segment = segment.to_owned()
68+ if segment != "" {
69+ segments.push(segment)
70+ }
71+ }
72+ segments
73+ }
74+
75+ ///|
76+ fn strip_url_suffix(path : String ) -> String {
77+ let query_index = path.find("?").unwrap_or(path.length())
78+ let hash_index = path.find("#").unwrap_or(path.length())
79+ let end_index = if query_index < hash_index {
80+ query_index
81+ } else {
82+ hash_index
83+ }
84+ path[0:end_index].to_owned()
85+ }
86+
87+ ///|
88+ fn insert_middleware_entry(
89+ entries : Array [MiddlewareTrieEntry ],
90+ entry : MiddlewareTrieEntry ,
91+ ) -> Unit {
92+ let mut index = 0
93+ while index < entries.length() && entries[index].order < entry.order {
94+ index = index + 1
95+ }
96+ entries.insert(index, entry)
97+ }
98+
99+ ///|
100+ fn append_sorted_middleware_entries(
101+ entries : Array [MiddlewareTrieEntry ],
102+ source : Array [MiddlewareTrieEntry ],
103+ ) -> Unit {
104+ source.each(entry => insert_middleware_entry(entries, entry))
105+ }
106+
107+ ///|
108+ fn Mocket ::match_middlewares(self : Mocket , url : String ) -> Array [Middleware ] {
109+ let entries = []
110+ let mut node = self.middleware_trie
111+ append_sorted_middleware_entries(entries, node.middlewares)
112+ for segment in middleware_path_segments(url) {
113+ match node.children.get(segment) {
114+ Some (child) => {
115+ node = child
116+ append_sorted_middleware_entries(entries, node.middlewares)
117+ }
118+ None => break
119+ }
120+ }
121+ entries.map(entry => entry.middleware)
122+ }
123+
124+ ///|
125+ async fn Mocket ::execute_middlewares(
126+ self : Mocket ,
127+ event : MocketEvent ,
128+ final_handler : HttpHandler ,
129+ ) -> & Responder noraise {
130+ let matched_middlewares = self.match_middlewares(event.req.url)
131+ execute_middleware_chain(matched_middlewares, 0, event, final_handler)
18132}
19133
20134///|
0 commit comments