mirror of https://github.com/http-rs/async-h1
38 lines
1.2 KiB
Rust
38 lines
1.2 KiB
Rust
use async_std::net::{TcpListener, TcpStream};
|
|
use async_std::prelude::*;
|
|
use async_std::task;
|
|
use http_types::{Response, StatusCode};
|
|
|
|
#[async_std::main]
|
|
async fn main() -> http_types::Result<()> {
|
|
// Open up a TCP connection and create a URL.
|
|
let listener = TcpListener::bind(("127.0.0.1", 8080)).await?;
|
|
let addr = format!("http://{}", listener.local_addr()?);
|
|
println!("listening on {}", addr);
|
|
|
|
// For each incoming TCP connection, spawn a task and call `accept`.
|
|
let mut incoming = listener.incoming();
|
|
while let Some(stream) = incoming.next().await {
|
|
let stream = stream?;
|
|
task::spawn(async {
|
|
if let Err(err) = accept(stream).await {
|
|
eprintln!("{}", err);
|
|
}
|
|
});
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
// Take a TCP stream, and convert it into sequential HTTP request / response pairs.
|
|
async fn accept(stream: TcpStream) -> http_types::Result<()> {
|
|
println!("starting new connection from {}", stream.peer_addr()?);
|
|
async_h1::accept(stream.clone(), |_req| async move {
|
|
let mut res = Response::new(StatusCode::Ok);
|
|
res.insert_header("Content-Type", "text/plain");
|
|
res.set_body("Hello world");
|
|
Ok(res)
|
|
})
|
|
.await?;
|
|
Ok(())
|
|
}
|