From db390d1e1d9de353001bdb2b52408a112331ee62 Mon Sep 17 00:00:00 2001 From: dvkt Date: Thu, 26 Dec 2019 21:25:14 -0800 Subject: [PATCH] simple dir listings --- src/server.rs | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/server.rs b/src/server.rs index 31ffe66..de08d95 100644 --- a/src/server.rs +++ b/src/server.rs @@ -5,24 +5,22 @@ use async_std::{ prelude::*, task, }; +use std::path::PathBuf; type Result = std::result::Result>; pub fn start(addr: &str, root: &str) -> Result<()> { - let fut = listen(addr, root); - task::block_on(fut) -} - -async fn listen(addr: &str, root: &str) -> Result<()> { - let listener = TcpListener::bind(addr).await?; - let mut incoming = listener.incoming(); - while let Some(stream) = incoming.next().await { - let stream = stream?; - println!("-> Connection from: {}", stream.peer_addr()?); - let root = root.to_string(); - task::spawn(client_loop(stream, root)); - } - Ok(()) + task::block_on(async { + let listener = TcpListener::bind(addr).await?; + let mut incoming = listener.incoming(); + while let Some(stream) = incoming.next().await { + let stream = stream?; + println!("-> Connection from: {}", stream.peer_addr()?); + let root = root.to_string(); + task::spawn(client_loop(stream, root)); + } + Ok(()) + }) } async fn client_loop(mut stream: TcpStream, root: String) -> Result<()> { @@ -37,14 +35,21 @@ async fn client_loop(mut stream: TcpStream, root: String) -> Result<()> { } async fn respond(stream: &mut TcpStream, selector: &str, root: &str) -> Result<()> { - let mut response = format!("iYou sent: {}\r\n", selector); - - let mut dir = fs::read_dir(root).await?; + let mut path = PathBuf::from(root); + path.push(selector.replace("..", ".")); + let mut response = format!("iPath: {}\r\n", path.to_string_lossy()); + let mut dir = fs::read_dir(path.clone()).await?; + + let mut path = path.to_string_lossy().to_string(); + if !path.ends_with('/') { + path.push('/'); + } while let Some(Ok(entry)) = dir.next().await { response.push_str(&format!( - "1{}\t/{}\tlocalhost\t7070\r\n", + "1{}\t{}{}\tlocalhost\t7070\r\n", entry.file_name().into_string().unwrap(), + path, entry.file_name().into_string().unwrap(), )); }