use lib.rs

pull/1/head
dvkt 4 years ago
parent 960e32bb17
commit 5683be0cbe

@ -0,0 +1,53 @@
use async_std::{
fs,
io::BufReader,
net::{TcpListener, TcpStream, ToSocketAddrs},
prelude::*,
task,
};
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
pub fn start_server(addr: impl ToSocketAddrs) -> Result<()> {
let fut = listen(addr);
task::block_on(fut)
}
async fn listen(addr: impl ToSocketAddrs) -> 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()?);
task::spawn(client_loop(stream));
}
Ok(())
}
async fn client_loop(mut stream: TcpStream) -> Result<()> {
let reader = BufReader::new(&stream);
let mut lines = reader.lines();
if let Some(Ok(line)) = lines.next().await {
println!("-> client sent: {:?}", line);
respond(&mut stream, &line).await?;
}
Ok(())
}
async fn respond(stream: &mut TcpStream, selector: &str) -> Result<()> {
let mut response = format!("iYou sent: {}\r\n", selector);
let mut dir = fs::read_dir(".").await?;
while let Some(Ok(entry)) = dir.next().await {
response.push_str(&format!(
"1{}\t/{}\tlocalhost\t7070\r\n",
entry.file_name().into_string().unwrap(),
entry.file_name().into_string().unwrap(),
));
}
stream.write_all(response.as_bytes()).await?;
Ok(())
}

@ -1,60 +1,8 @@
#![allow(unused_must_use)]
extern crate async_std;
use async_std::{
fs,
io::BufReader,
net::{TcpListener, TcpStream, ToSocketAddrs},
prelude::*,
task,
};
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
use phd;
fn main() {
println!("-> Listening on localhost:7070");
let fut = listen("localhost:7070");
if let Err(e) = task::block_on(fut) {
if let Err(e) = phd::start_server("localhost:7070") {
eprintln!("{}", e);
}
}
async fn listen(addr: impl ToSocketAddrs) -> 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()?);
task::spawn(client_loop(stream));
}
Ok(())
}
async fn client_loop(mut stream: TcpStream) -> Result<()> {
let reader = BufReader::new(&stream);
let mut lines = reader.lines();
if let Some(Ok(line)) = lines.next().await {
println!("-> client sent: {:?}", line);
respond(&mut stream, &line).await?;
}
Ok(())
}
async fn respond(stream: &mut TcpStream, selector: &str) -> Result<()> {
let mut response = format!("iYou sent: {}\r\n", selector);
let mut dir = fs::read_dir(".").await?;
while let Some(Ok(entry)) = dir.next().await {
response.push_str(&format!(
"1{}\t/{}\tlocalhost\t7070\r\n",
entry.file_name().into_string().unwrap(),
entry.file_name().into_string().unwrap(),
));
}
stream.write_all(response.as_bytes()).await?;
Ok(())
}

Loading…
Cancel
Save