use std::{io, net::{TcpListener, ToSocketAddrs}};
use client::Client;
pub struct MicroHTTP {
listener: TcpListener,
}
impl MicroHTTP {
pub fn new(interface: impl ToSocketAddrs) -> Result<MicroHTTP,io::Error> {
let listener = TcpListener::bind(interface)?;
Ok(MicroHTTP {
listener : listener
})
}
pub fn set_nonblocking(&mut self, state: bool) -> Result<(), io::Error> {
self.listener.set_nonblocking(state)
}
pub fn next_client(&self) -> Result<Option<Client>,io::Error> {
match self.listener.accept() {
Ok( (socket, addr) ) => Ok(Some(Client::new(socket, addr)?)),
Err(err) => match err.kind() {
io::ErrorKind::WouldBlock => Ok(None), _ => Err(err) }
}
}
}
#[cfg(test)]
mod tests {
use super::MicroHTTP;
use std::{io::{Read,Write},net::TcpStream};
#[test]
fn echo() {
let server = MicroHTTP::new("127.0.0.1:65534").expect("Could not create server");
println!("Waiting for a client @ 127.0.0.1:65534...");
let mut connection = TcpStream::connect("127.0.0.1:65534").expect("Could not reach server");
println!("Connected!");
connection.write("GET /\r\n\r\n".as_bytes()).unwrap();
{
let opt = server.next_client().unwrap();
assert_eq!(true, opt.is_some());
let mut client = opt.unwrap();
println!("Got a client!");
assert_eq!(true, client.request().is_some());
assert_eq!("/", client.request().as_ref().unwrap());
client.respond_ok("TEST".as_bytes()).unwrap();
}
let mut buf = String::new();
connection.read_to_string(&mut buf).unwrap();
assert_eq!("HTTP/1.0 200 OK\r\nContent-Length: 4\r\n\r\nTEST", buf);
}
}