47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
//! 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));
|
|
}
|