| @@ -45,3 +45,47 @@ fn retryable_request() { | ||||
|  | ||||
|     core.run(res2.join(srv2)).expect("res2"); | ||||
| } | ||||
|  | ||||
| #[test] | ||||
| fn conn_reset_after_write() { | ||||
|     let _ = pretty_env_logger::try_init(); | ||||
|     let mut core = Core::new().unwrap(); | ||||
|  | ||||
|     let mut connector = MockConnector::new(); | ||||
|  | ||||
|     let sock1 = connector.mock("http://mock.local/a"); | ||||
|  | ||||
|     let client = Client::configure() | ||||
|         .connector(connector) | ||||
|         .build(&core.handle()); | ||||
|  | ||||
|  | ||||
|     { | ||||
|         let res1 = client.get("http://mock.local/a".parse().unwrap()); | ||||
|         let srv1 = poll_fn(|| { | ||||
|             try_ready!(sock1.read(&mut [0u8; 512])); | ||||
|             try_ready!(sock1.write(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")); | ||||
|             Ok(Async::Ready(())) | ||||
|         }); | ||||
|         core.run(res1.join(srv1)).expect("res1"); | ||||
|     } | ||||
|  | ||||
|     let res2 = client.get("http://mock.local/a".parse().unwrap()); | ||||
|     let mut sock1 = Some(sock1); | ||||
|     let srv2 = poll_fn(|| { | ||||
|         // We purposefully keep the socket open until the client | ||||
|         // has written the second request, and THEN disconnect. | ||||
|         // | ||||
|         // Not because we expect servers to be jerks, but to trigger | ||||
|         // state where we write on an assumedly good connetion, and | ||||
|         // only reset the close AFTER we wrote bytes. | ||||
|         try_ready!(sock1.as_mut().unwrap().read(&mut [0u8; 512])); | ||||
|         sock1.take(); | ||||
|         Ok(Async::Ready(())) | ||||
|     }); | ||||
|     let err = core.run(res2.join(srv2)).expect_err("res2"); | ||||
|     match err { | ||||
|         ::Error::Incomplete => (), | ||||
|         other => panic!("expected Incomplete, found {:?}", other) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user