@@ -85,6 +85,7 @@ fn build_headers(msg: &str) -> HashMap<String, Vec<String>> {
85
85
86
86
fn make_service < H : Handler > (
87
87
handler : H ,
88
+ max_thread_count : usize ,
88
89
) -> impl Service <
89
90
hyper:: Request < hyper:: Body > ,
90
91
Response = hyper:: Response < hyper:: Body > ,
@@ -93,7 +94,7 @@ fn make_service<H: Handler>(
93
94
> {
94
95
use hyper:: service:: service_fn;
95
96
96
- let handler = std:: sync:: Arc :: new ( BlockingHandler :: new ( handler, 1 ) ) ;
97
+ let handler = std:: sync:: Arc :: new ( BlockingHandler :: new ( handler, max_thread_count ) ) ;
97
98
98
99
service_fn ( move |request : hyper:: Request < hyper:: Body > | {
99
100
let remote_addr = ( [ 0 , 0 , 0 , 0 ] , 0 ) . into ( ) ;
@@ -102,7 +103,7 @@ fn make_service<H: Handler>(
102
103
}
103
104
104
105
async fn simulate_request < H : Handler > ( handler : H ) -> hyper:: Response < hyper:: Body > {
105
- let mut service = make_service ( handler) ;
106
+ let mut service = make_service ( handler, 1 ) ;
106
107
service. call ( hyper:: Request :: default ( ) ) . await . unwrap ( )
107
108
}
108
109
@@ -141,7 +142,7 @@ async fn recover_from_panic() {
141
142
142
143
#[ tokio:: test]
143
144
async fn normalize_path ( ) {
144
- let mut service = make_service ( AssertPathNormalized ) ;
145
+ let mut service = make_service ( AssertPathNormalized , 1 ) ;
145
146
let req = hyper:: Request :: put ( "//removed/.././.././normalized" )
146
147
. body ( hyper:: Body :: default ( ) )
147
148
. unwrap ( ) ;
@@ -159,7 +160,7 @@ async fn normalize_path() {
159
160
160
161
#[ tokio:: test]
161
162
async fn limits_thread_count ( ) {
162
- let mut service = make_service ( Sleep ) ;
163
+ let mut service = make_service ( Sleep , 1 ) ;
163
164
let first = service. call ( hyper:: Request :: default ( ) ) ;
164
165
let second = service. call ( hyper:: Request :: default ( ) ) ;
165
166
@@ -173,3 +174,22 @@ async fn limits_thread_count() {
173
174
174
175
assert_eq ! ( first_completed. status( ) , 503 )
175
176
}
177
+
178
+ #[ tokio:: test]
179
+ async fn sleeping_doesnt_block_another_request ( ) {
180
+ let mut service = make_service ( Sleep , 2 ) ;
181
+
182
+ let first = service. call ( hyper:: Request :: default ( ) ) ;
183
+ let second = service. call ( hyper:: Request :: default ( ) ) ;
184
+
185
+ let start = std:: time:: Instant :: now ( ) ;
186
+
187
+ // Spawn 2 requests that each sleeps for 100ms
188
+ let ( first, second) = futures:: join!( first, second) ;
189
+
190
+ // Elapsed time should be closer to 100ms than 200ms
191
+ assert ! ( start. elapsed( ) . as_millis( ) < 150 ) ;
192
+
193
+ assert_eq ! ( first. unwrap( ) . status( ) , 200 ) ;
194
+ assert_eq ! ( second. unwrap( ) . status( ) , 200 ) ;
195
+ }
0 commit comments