wasix-net 0.1.2

Loopback TCP sockets and a blocking HTTP/1.1 client for WASI programs in slicc's kernel
Documentation
use std::io::{ErrorKind, Read, Write};
use std::time::{Duration, Instant};
use wasix_net::{TcpListener, TcpStream};

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:0")?;
    let mut client = TcpStream::connect(listener.local_addr()?)?;
    let (mut peer, _) = listener.accept()?;
    let timeout = Duration::from_millis(600);
    client.set_read_timeout(Some(timeout))?;
    client.set_nonblocking(true)?;
    let mut byte = [0u8; 1];
    let started = Instant::now();
    assert_eq!(
        client.read(&mut byte).unwrap_err().kind(),
        ErrorKind::WouldBlock
    );
    println!(
        "nonblocking read: WouldBlock in {} ms",
        started.elapsed().as_millis()
    );
    assert_eq!(client.read_timeout()?, Some(timeout));
    let mut clone = client.try_clone()?;
    clone.set_nonblocking(true)?;
    assert_eq!(
        clone.read(&mut byte).unwrap_err().kind(),
        ErrorKind::WouldBlock
    );
    client.set_nonblocking(false)?;
    client.set_read_timeout(Some(Duration::from_millis(100)))?;
    assert_eq!(
        client.read(&mut byte).unwrap_err().kind(),
        ErrorKind::TimedOut
    );
    println!("blocking read: TimedOut");
    client.set_read_timeout(Some(timeout))?;
    client.set_write_timeout(Some(timeout))?;
    client.set_nonblocking(true)?;
    client.write_all(b"x")?;
    assert_eq!(peer.read(&mut byte)?, 1);
    assert_eq!(byte, [b'x']);
    peer.write_all(b"y")?;
    client.set_nonblocking(false)?;
    assert_eq!(client.read(&mut byte)?, 1);
    assert_eq!(byte, [b'y']);
    assert_eq!(client.read_timeout()?, Some(timeout));
    assert_eq!(client.write_timeout()?, Some(timeout));
    println!("socket options preserved");
    Ok(())
}