Basic file serving and rendering
This commit is contained in:
commit
7c81a93403
|
@ -0,0 +1,4 @@
|
|||
/debug
|
||||
/target
|
||||
/blog/*
|
||||
Cargo.lock
|
|
@ -0,0 +1,12 @@
|
|||
[package]
|
||||
name = "blogit"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
hyper = { version = "0.14", features = ["full"] }
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
futures = "0.3"
|
||||
pulldown-cmark = "0.9.2"
|
|
@ -0,0 +1,63 @@
|
|||
use std::convert::Infallible;
|
||||
|
||||
use hyper::service::{make_service_fn, service_fn};
|
||||
use hyper::{Body, Method, Request, Response, Server, StatusCode};
|
||||
use pulldown_cmark::{html, Options, Parser};
|
||||
|
||||
async fn hello_world(req: Request<Body>) -> Result<Response<Body>, Infallible> {
|
||||
println!("New request to '{}'", req.uri());
|
||||
|
||||
let path = &req
|
||||
.uri()
|
||||
.path()[1..] // Remove the first "/". We don't need it
|
||||
.replace("..", "") // Don't allow to go up in the hierarchy
|
||||
;
|
||||
|
||||
// Get the first part so we can route it
|
||||
let until = path.find('/').unwrap_or(path.len());
|
||||
|
||||
let mut response = Response::new(Body::empty());
|
||||
|
||||
match (req.method(), &path[..until]) {
|
||||
(&Method::GET, "") => {
|
||||
*response.body_mut() = Body::from("You shouldn't be reading this.");
|
||||
}
|
||||
(&Method::GET, "blog") => {
|
||||
*response.body_mut() = Body::from(file_to_md(path));
|
||||
}
|
||||
(_, path) => {
|
||||
*response.body_mut() = Body::from(format!("Path {path} not found."));
|
||||
*response.status_mut() = StatusCode::NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(response)
|
||||
}
|
||||
|
||||
fn file_to_md(path: &str) -> String {
|
||||
let file = std::fs::read_to_string(path).unwrap_or("File not found.".to_string());
|
||||
|
||||
//let mut options = Options::empty();
|
||||
//options.insert(Options::ENABLE_STRIKETHROUGH);
|
||||
let parser = Parser::new_ext(file.as_str(), Options::ENABLE_STRIKETHROUGH);
|
||||
|
||||
// Write to String buffer.
|
||||
let mut html_output: String = String::with_capacity(file.len() * 3 / 2);
|
||||
html::push_html(&mut html_output, parser);
|
||||
|
||||
html_output
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let addr = ([127, 0, 0, 1], 3000).into();
|
||||
|
||||
let make_svc = make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(hello_world)) });
|
||||
|
||||
let server = Server::bind(&addr).serve(make_svc);
|
||||
|
||||
println!("Server listening on: http://{}", addr);
|
||||
if let Err(e) = server.await {
|
||||
eprintln!("server error: {}", e);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue