Improving our base example 181 . unwrap(); } let mut buff = vec![0u8; 4096]; loop { match self. stream. as_mut(). unwrap(). read(&mut buff) { Ok(0) => { let s = String::from_utf8_lossy(&self. buffer); break Poll State::Ready(s. to_string()); } Ok(n) => { self. buffer. extend(&buff[0..n]); continue; } Err(e) if e. kind() == Error Kind::Would Block => { break Poll State::Not Ready; } Err(e) => panic!("{e:?}"), } } } } On the first poll, after we've written the request, we register interest in READABLE events on this Tcp Stream. We also removed the line: return Poll State::Not Ready; By removing his line, we'll poll Tcp Stream immediately, which makes sense since we don't really want to return control to our scheduler if we get the response immediately. Y ou wouldn't go wrong either way here since we registered our Tcp Stream as an event source with our reactor and would get a wakeup in any case. These changes were the last piece we needed to get our example back up and running. If you remember the version from Chapter 7, we got the following output: Program starting FIRST POLL-START OPERATION Schedule other tasks Schedule other tasks Schedule other tasks Schedule other tasks Schedule other tasks Schedule other tasks