diff --git a/src/args.rs b/src/args.rs index ecb8c7d..81b8e47 100644 --- a/src/args.rs +++ b/src/args.rs @@ -1,3 +1,4 @@ +use crate::http_server; use crate::receiver; use crate::sender; use clap::{Parser, Subcommand}; @@ -79,7 +80,9 @@ impl Args { let transfer_name = name.as_deref().unwrap_or("None"); receiver::download_info(transfer_name).await? } - Some(Commands::Serve { port }) => {} + Some(Commands::Serve { port }) => { + http_server::start_server().await; + } Some(Commands::Config { path, show, diff --git a/src/http_server.rs b/src/http_server.rs index e69de29..e8af0ac 100644 --- a/src/http_server.rs +++ b/src/http_server.rs @@ -0,0 +1,35 @@ +use std::convert::Infallible; +use std::net::SocketAddr; + +use http_body_util::Full; +use hyper::body::Bytes; +use hyper::server::conn::http1; +use hyper::service::service_fn; +use hyper::{Request, Response}; +use hyper_util::rt::TokioIo; +use tokio::net::TcpListener; + +pub async fn hello(_: Request) -> Result>, Infallible> { + Ok(Response::new(Full::new(Bytes::from("Hello, World!")))) +} + +pub async fn start_server() -> Result<(), Box> { + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + + let listener = TcpListener::bind(addr).await?; + + loop { + let (stream, _) = listener.accept().await?; + + let io = TokioIo::new(stream); + + tokio::task::spawn(async move { + if let Err(err) = http1::Builder::new() + .serve_connection(io, service_fn(hello)) + .await + { + eprintln!("Error serving connection: {:?}", err); + } + }); + } +}