diff --git a/Cargo.lock b/Cargo.lock index 4159387..9e89bef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -436,7 +436,7 @@ dependencies = [ [[package]] name = "multihook" -version = "0.1.2" +version = "0.1.3" dependencies = [ "chrono", "colored", diff --git a/Cargo.toml b/Cargo.toml index 3f34968..eea9b0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ description = "A webhook server" authors = ["trivernis "] license = "GPL-3.0" readme = "README.md" -version = "0.1.2" +version = "0.1.3" edition = "2018" repository = "https://github.com/Trivernis/multihook.git" diff --git a/src/server/http.rs b/src/server/http.rs index 6f05f87..8bba12e 100644 --- a/src/server/http.rs +++ b/src/server/http.rs @@ -1,6 +1,6 @@ use crate::utils::error::MultihookResult; use hyper::service::{make_service_fn, service_fn}; -use hyper::{Body, Request, Response, Server}; +use hyper::{Body, Method, Request, Response, Server, StatusCode}; use std::collections::HashMap; use std::convert::Infallible; use std::future::Future; @@ -9,6 +9,7 @@ use std::pin::Pin; use std::sync::Arc; pub struct HTTPCallback { + methods: Vec, inner: Arc< dyn Fn( Request, @@ -32,10 +33,27 @@ impl HTTPCallback { { Self { inner: Arc::new(cb), + methods: Vec::new(), } } + pub fn allow_method(mut self, method: Method) -> Self { + self.methods.push(method); + + self + } + + pub fn validate_method(&self, method: &Method) -> bool { + self.methods.contains(method) + } + pub async fn execute(&self, req: Request) -> MultihookResult> { + if !self.validate_method(req.method()) { + return Ok(Response::builder() + .status(StatusCode::METHOD_NOT_ALLOWED) + .body(Body::from("Method not allowed")) + .unwrap()); + } self.inner.as_ref()(req).await } } @@ -51,7 +69,7 @@ impl HTTPServer { } async fn execute_callback(&self, req: Request) -> Result, Infallible> { - let path = req.uri().path(); + let path = &req.uri().path()[1..]; let response = if let Some(cb) = self.routes.get(path) { match cb.as_ref().execute(req).await { Ok(res) => res, @@ -62,8 +80,8 @@ impl HTTPServer { } } else { Response::builder() - .status(404) - .body(Body::from("Unknown endpoint")) + .status(StatusCode::NOT_FOUND) + .body(Body::from("404 - Not Found")) .unwrap() }; diff --git a/src/server/mod.rs b/src/server/mod.rs index 5c1e75e..809cb9c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -4,7 +4,7 @@ use action::HookAction; use crate::server::http::{HTTPCallback, HTTPServer}; use crate::utils::error::MultihookResult; -use hyper::{Body, Response}; +use hyper::{Body, Method, Response}; pub mod action; pub mod command_template; @@ -39,7 +39,8 @@ impl HookServer { )))) }) } - }); + }) + .allow_method(Method::POST); self.server.add_callback(point, cb); }