1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
//! This example demonstrates probably the most complicated part of
//! `minreq`. Useful when making loading bars, for example.
fn main() -> Result<(), minreq::Error> {
let mut buffer = Vec::new();
for byte in minreq::get("http://example.com").send_lazy()? {
// The connection could have a problem at any point during the
// download, so each byte needs to be unwrapped.
let (byte, len) = byte?;
// The `byte` is the current u8 of data we're iterating
// through.
print!("{}", byte as char);
// The `len` is the expected amount of incoming bytes
// including the current one: this will be the rest of the
// body if the server provided a Content-Length header, or
// just the size of the remaining chunk in chunked transfers.
buffer.reserve(len);
buffer.push(byte);
// Flush the printed text so each char appears on your
// terminal right away.
flush();
// Wait for 50ms so the data doesn't appear instantly fast
// internet connections, to demonstrate that the body is being
// printed char-by-char.
sleep();
}
Ok(())
}
// Helper functions
fn flush() {
use std::io::{stdout, Write};
stdout().lock().flush().ok();
}
fn sleep() {
use std::thread::sleep;
use std::time::Duration;
sleep(Duration::from_millis(2));
}
|