@@ -918,6 +918,26 @@ fn response(status: &str, headers: &[(&str, &str)], body: &str) -> String {
918918 response
919919}
920920
921+ fn accept_connection ( listener : & TcpListener ) -> TcpStream {
922+ const ACCEPT_TIMEOUT : Duration = Duration :: from_secs ( 5 ) ;
923+
924+ listener. set_nonblocking ( true ) . unwrap ( ) ;
925+ let deadline = Instant :: now ( ) + ACCEPT_TIMEOUT ;
926+ loop {
927+ match listener. accept ( ) {
928+ Ok ( ( stream, _) ) => {
929+ stream. set_nonblocking ( false ) . unwrap ( ) ;
930+ return stream;
931+ }
932+ Err ( error) if error. kind ( ) == std:: io:: ErrorKind :: WouldBlock => {
933+ assert ! ( Instant :: now( ) < deadline, "timed out waiting for local HTTP request" ) ;
934+ thread:: sleep ( Duration :: from_millis ( 5 ) ) ;
935+ }
936+ Err ( error) => panic ! ( "failed to accept local HTTP request: {error}" ) ,
937+ }
938+ }
939+ }
940+
921941fn serve_once ( listener : TcpListener , reply : String , delay : Duration ) -> Receiver < ( ) > {
922942 let ( sender, receiver) = mpsc:: channel ( ) ;
923943 thread:: spawn ( move || {
@@ -964,7 +984,7 @@ fn fetch_security_rejects_existing_source_map_destination() {
964984 let server = listener. try_clone ( ) . unwrap ( ) ;
965985 let received = thread:: spawn ( move || {
966986 for body in [ "console.log(1);\n //# sourceMappingURL=bundle.js.map" , source_map_json ( ) ] {
967- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
987+ let mut stream = accept_connection ( & server ) ;
968988 let _ = read_request ( & mut stream) ;
969989 stream. write_all ( response ( "200 OK" , & [ ] , body) . as_bytes ( ) ) . unwrap ( ) ;
970990 }
@@ -1017,7 +1037,7 @@ fn fetch_security_rejects_symlink_source_map_destination() {
10171037 let server = listener. try_clone ( ) . unwrap ( ) ;
10181038 let received = thread:: spawn ( move || {
10191039 for body in [ "console.log(1);\n //# sourceMappingURL=bundle.js.map" , source_map_json ( ) ] {
1020- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1040+ let mut stream = accept_connection ( & server ) ;
10211041 let _ = read_request ( & mut stream) ;
10221042 stream. write_all ( response ( "200 OK" , & [ ] , body) . as_bytes ( ) ) . unwrap ( ) ;
10231043 }
@@ -1047,7 +1067,7 @@ fn fetch_security_rejects_bundle_and_map_filename_collisions() {
10471067 let expected_bundle = bundle. clone ( ) ;
10481068 let received = thread:: spawn ( move || {
10491069 for body in [ bundle. as_str ( ) , source_map_json ( ) ] {
1050- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1070+ let mut stream = accept_connection ( & server ) ;
10511071 let _ = read_request ( & mut stream) ;
10521072 stream. write_all ( response ( "200 OK" , & [ ] , body) . as_bytes ( ) ) . unwrap ( ) ;
10531073 }
@@ -1074,7 +1094,7 @@ fn fetch_conventional_source_map_ignores_not_found() {
10741094 for reply in
10751095 [ response ( "200 OK" , & [ ] , "console.log(1)" ) , response ( "404 Not Found" , & [ ] , "missing" ) ]
10761096 {
1077- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1097+ let mut stream = accept_connection ( & server ) ;
10781098 let _ = read_request ( & mut stream) ;
10791099 stream. write_all ( reply. as_bytes ( ) ) . unwrap ( ) ;
10801100 }
@@ -1102,7 +1122,7 @@ fn fetch_conventional_source_map_propagates_server_error() {
11021122 response ( "200 OK" , & [ ] , "console.log(1)" ) ,
11031123 response ( "500 Internal Server Error" , & [ ] , "failed" ) ,
11041124 ] {
1105- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1125+ let mut stream = accept_connection ( & server ) ;
11061126 let _ = read_request ( & mut stream) ;
11071127 stream. write_all ( reply. as_bytes ( ) ) . unwrap ( ) ;
11081128 }
@@ -1125,11 +1145,11 @@ fn fetch_conventional_source_map_propagates_timeout() {
11251145 let listener = TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
11261146 let server = listener. try_clone ( ) . unwrap ( ) ;
11271147 let received = thread:: spawn ( move || {
1128- let ( mut bundle_stream, _ ) = server . accept ( ) . unwrap ( ) ;
1148+ let mut bundle_stream = accept_connection ( & server ) ;
11291149 let _ = read_request ( & mut bundle_stream) ;
11301150 bundle_stream. write_all ( response ( "200 OK" , & [ ] , "console.log(1)" ) . as_bytes ( ) ) . unwrap ( ) ;
11311151
1132- let ( mut map_stream, _ ) = server . accept ( ) . unwrap ( ) ;
1152+ let mut map_stream = accept_connection ( & server ) ;
11331153 let _ = read_request ( & mut map_stream) ;
11341154 thread:: sleep ( Duration :: from_millis ( 150 ) ) ;
11351155 let _ = map_stream. write_all ( response ( "200 OK" , & [ ] , source_map_json ( ) ) . as_bytes ( ) ) ;
@@ -1159,7 +1179,7 @@ fn fetch_conventional_source_map_propagates_cross_origin_redirect() {
11591179 response ( "200 OK" , & [ ] , "console.log(1)" ) ,
11601180 response ( "302 Found" , & [ ( "Location" , & target_url) ] , "" ) ,
11611181 ] {
1162- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1182+ let mut stream = accept_connection ( & server ) ;
11631183 let _ = read_request ( & mut stream) ;
11641184 stream. write_all ( reply. as_bytes ( ) ) . unwrap ( ) ;
11651185 }
@@ -1185,11 +1205,11 @@ fn fetch_conventional_source_map_propagates_body_read_error() {
11851205 let listener = TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
11861206 let server = listener. try_clone ( ) . unwrap ( ) ;
11871207 let received = thread:: spawn ( move || {
1188- let ( mut bundle_stream, _ ) = server . accept ( ) . unwrap ( ) ;
1208+ let mut bundle_stream = accept_connection ( & server ) ;
11891209 let _ = read_request ( & mut bundle_stream) ;
11901210 bundle_stream. write_all ( response ( "200 OK" , & [ ] , "console.log(1)" ) . as_bytes ( ) ) . unwrap ( ) ;
11911211
1192- let ( mut map_stream, _ ) = server . accept ( ) . unwrap ( ) ;
1212+ let mut map_stream = accept_connection ( & server ) ;
11931213 let _ = read_request ( & mut map_stream) ;
11941214 map_stream
11951215 . write_all ( b"HTTP/1.1 200 OK\r \n Content-Length: 100\r \n Connection: close\r \n \r \n {" )
@@ -1308,7 +1328,7 @@ fn fetch_security_allows_same_origin_relative_source_map() {
13081328 let server = listener. try_clone ( ) . unwrap ( ) ;
13091329 let received = thread:: spawn ( move || {
13101330 for body in [ "console.log(1);\n //# sourceMappingURL=bundle.js.map" , source_map_json ( ) ] {
1311- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1331+ let mut stream = accept_connection ( & server ) ;
13121332 let _ = read_request ( & mut stream) ;
13131333 stream. write_all ( response ( "200 OK" , & [ ] , body) . as_bytes ( ) ) . unwrap ( ) ;
13141334 }
@@ -1339,7 +1359,7 @@ fn fetch_security_uses_final_redirect_url_for_relative_map_and_filename() {
13391359 let expected_paths = [ "/old/bundle.js" , "/assets/final.js" , "/assets/final.js.map" ] ;
13401360
13411361 for ( reply, expected_path) in replies. iter ( ) . zip ( expected_paths) {
1342- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1362+ let mut stream = accept_connection ( & server ) ;
13431363 assert_eq ! ( read_request( & mut stream) , expected_path) ;
13441364 stream. write_all ( reply. as_bytes ( ) ) . unwrap ( ) ;
13451365 }
@@ -1367,7 +1387,7 @@ fn fetch_security_bounds_redirects() {
13671387 let server = listener. try_clone ( ) . unwrap ( ) ;
13681388 let received = thread:: spawn ( move || {
13691389 for _ in 0 ..EXPECTED_REQUESTS {
1370- let ( mut stream, _ ) = server . accept ( ) . unwrap ( ) ;
1390+ let mut stream = accept_connection ( & server ) ;
13711391 let _ = read_request ( & mut stream) ;
13721392 let reply = response ( "302 Found" , & [ ( "Location" , "/loop" ) ] , "" ) ;
13731393 stream. write_all ( reply. as_bytes ( ) ) . unwrap ( ) ;
0 commit comments