@@ -102,12 +102,12 @@ where
102
102
}
103
103
104
104
fn call ( & mut self , mut req : Request < ReqBody > ) -> Self :: Future {
105
- remove_trailing_slash ( req. uri_mut ( ) ) ;
105
+ normalize_trailing_slash ( req. uri_mut ( ) ) ;
106
106
self . inner . call ( req)
107
107
}
108
108
}
109
109
110
- fn remove_trailing_slash ( uri : & mut Uri ) {
110
+ fn normalize_trailing_slash ( uri : & mut Uri ) {
111
111
if !uri. path ( ) . ends_with ( '/' ) {
112
112
return ;
113
113
}
@@ -117,6 +117,12 @@ fn remove_trailing_slash(uri: &mut Uri) {
117
117
let mut parts = uri. clone ( ) . into_parts ( ) ;
118
118
119
119
let new_path_and_query = if let Some ( path_and_query) = & parts. path_and_query {
120
+ let new_path = if new_path. is_empty ( ) {
121
+ "/"
122
+ } else {
123
+ new_path. into ( )
124
+ } ;
125
+
120
126
let new_path_and_query = if let Some ( query) = path_and_query. query ( ) {
121
127
Cow :: Owned ( format ! ( "{}?{}" , new_path, query) )
122
128
} else {
@@ -167,28 +173,49 @@ mod tests {
167
173
#[ test]
168
174
fn is_noop_if_no_trailing_slash ( ) {
169
175
let mut uri = "/foo" . parse :: < Uri > ( ) . unwrap ( ) ;
170
- remove_trailing_slash ( & mut uri) ;
176
+ normalize_trailing_slash ( & mut uri) ;
171
177
assert_eq ! ( uri, "/foo" ) ;
172
178
}
173
179
174
180
#[ test]
175
181
fn maintains_query ( ) {
176
182
let mut uri = "/foo/?a=a" . parse :: < Uri > ( ) . unwrap ( ) ;
177
- remove_trailing_slash ( & mut uri) ;
183
+ normalize_trailing_slash ( & mut uri) ;
178
184
assert_eq ! ( uri, "/foo?a=a" ) ;
179
185
}
180
186
181
187
#[ test]
182
188
fn removes_multiple_trailing_slashes ( ) {
183
189
let mut uri = "/foo////" . parse :: < Uri > ( ) . unwrap ( ) ;
184
- remove_trailing_slash ( & mut uri) ;
190
+ normalize_trailing_slash ( & mut uri) ;
185
191
assert_eq ! ( uri, "/foo" ) ;
186
192
}
187
193
188
194
#[ test]
189
195
fn removes_multiple_trailing_slashes_even_with_query ( ) {
190
196
let mut uri = "/foo////?a=a" . parse :: < Uri > ( ) . unwrap ( ) ;
191
- remove_trailing_slash ( & mut uri) ;
197
+ normalize_trailing_slash ( & mut uri) ;
192
198
assert_eq ! ( uri, "/foo?a=a" ) ;
193
199
}
200
+
201
+ #[ test]
202
+ fn is_noop_on_index ( ) {
203
+ let mut uri = "/" . parse :: < Uri > ( ) . unwrap ( ) ;
204
+ normalize_trailing_slash ( & mut uri) ;
205
+ assert_eq ! ( uri, "/" ) ;
206
+ }
207
+
208
+ #[ test]
209
+ fn removes_multiple_trailing_slashes_on_index ( ) {
210
+ let mut uri = "////" . parse :: < Uri > ( ) . unwrap ( ) ;
211
+ normalize_trailing_slash ( & mut uri) ;
212
+ assert_eq ! ( uri, "/" ) ;
213
+ }
214
+
215
+ #[ test]
216
+ fn removes_multiple_trailing_slashes_on_index_even_with_query ( ) {
217
+ let mut uri = "////?a=a" . parse :: < Uri > ( ) . unwrap ( ) ;
218
+ normalize_trailing_slash ( & mut uri) ;
219
+ assert_eq ! ( uri, "/?a=a" ) ;
220
+ }
194
221
}
0 commit comments