mirror of
https://github.com/YGGverse/agate.git
synced 2026-04-09 04:55:27 +00:00
File serving
This commit is contained in:
parent
7eeba3959e
commit
b5ce738240
1 changed files with 21 additions and 14 deletions
35
src/main.rs
35
src/main.rs
|
|
@ -8,7 +8,7 @@ use {
|
||||||
rustls::internal::pemfile::{certs, rsa_private_keys},
|
rustls::internal::pemfile::{certs, rsa_private_keys},
|
||||||
std::{
|
std::{
|
||||||
error::Error,
|
error::Error,
|
||||||
fs::File,
|
fs::{File, read},
|
||||||
io::BufReader,
|
io::BufReader,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
|
|
@ -16,7 +16,7 @@ use {
|
||||||
url::Url,
|
url::Url,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub type Result<T=()> = std::result::Result<T, Box<dyn Error>>;
|
pub type Result<T=()> = std::result::Result<T, Box<dyn Error + Send + Sync>>;
|
||||||
|
|
||||||
fn main() -> Result {
|
fn main() -> Result {
|
||||||
let certs = certs(&mut BufReader::new(File::open("tests/cert.pem")?))
|
let certs = certs(&mut BufReader::new(File::open("tests/cert.pem")?))
|
||||||
|
|
@ -57,18 +57,25 @@ async fn connection(acceptor: TlsAcceptor, stream: TcpStream) -> Result {
|
||||||
let url = Url::parse(request.trim())?;
|
let url = Url::parse(request.trim())?;
|
||||||
eprintln!("Got request: {:?}", url);
|
eprintln!("Got request: {:?}", url);
|
||||||
|
|
||||||
let path: PathBuf = url.path_segments().unwrap().collect();
|
|
||||||
eprintln!("Path: {:?}", path);
|
|
||||||
let path = Path::new(".").join(path).canonicalize()?;
|
|
||||||
eprintln!("Path: {:?}", path);
|
|
||||||
|
|
||||||
// TODO: Return a not found error
|
|
||||||
assert!(path.starts_with(std::env::current_dir()?));
|
|
||||||
|
|
||||||
let mut stream = stream.into_inner();
|
let mut stream = stream.into_inner();
|
||||||
stream.write_all(b"20 text/gemini\r\n").await?;
|
match get(&url) {
|
||||||
stream.write_all(b"=> ").await?;
|
Ok(response) => {
|
||||||
stream.write_all(url.as_str().as_bytes()).await?;
|
stream.write_all(b"20 text/gemini\r\n").await?;
|
||||||
stream.write_all(b" Reload\r\n").await?;
|
stream.write_all(&response).await?;
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
stream.write_all(b"40 Not found, sorry.\r\n").await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get(url: &Url) -> Result<Vec<u8>> {
|
||||||
|
let path: PathBuf = url.path_segments().unwrap().collect();
|
||||||
|
let path = Path::new(".").join(path).canonicalize()?;
|
||||||
|
if !path.starts_with(std::env::current_dir()?) {
|
||||||
|
Err("invalid path")?
|
||||||
|
}
|
||||||
|
let response = read(path)?;
|
||||||
|
Ok(response)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue