diff options
| -rw-r--r-- | spider/src/http_method.rs | 33 | ||||
| -rw-r--r-- | spider/src/http_server.rs | 55 |
2 files changed, 70 insertions, 18 deletions
diff --git a/spider/src/http_method.rs b/spider/src/http_method.rs index e308983..a0b2e17 100644 --- a/spider/src/http_method.rs +++ b/spider/src/http_method.rs @@ -1,29 +1,38 @@ use std::fmt; -// TODO(andrew): add rest of the methods. pub enum HttpMethod { - GET, POST + GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH } impl fmt::Display for HttpMethod { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - HttpMethod::GET => write!(f, "GET"), - HttpMethod::POST => write!(f, "POST") + HttpMethod::GET => write!(f, "GET"), + HttpMethod::HEAD => write!(f, "HEAD"), + HttpMethod::POST => write!(f, "POST"), + HttpMethod::PUT => write!(f, "PUT"), + HttpMethod::DELETE => write!(f, "DELETE"), + HttpMethod::CONNECT => write!(f, "CONNECT"), + HttpMethod::OPTIONS => write!(f, "OPTIONS"), + HttpMethod::TRACE => write!(f, "TRACE"), + HttpMethod::PATCH => write!(f, "PATCH"), } } } impl HttpMethod { pub fn parse(s: String) -> Option<HttpMethod> { - if s == "GET" { - return Some(HttpMethod::GET); - } - else if s == "POST" { - return Some(HttpMethod::POST); - } - else { - return None; + match &*s { + "GET" => Some(HttpMethod::GET), + "HEAD" => Some(HttpMethod::HEAD), + "POST" => Some(HttpMethod::POST), + "PUT" => Some(HttpMethod::PUT), + "DELETE" => Some(HttpMethod::DELETE), + "CONNECT" => Some(HttpMethod::CONNECT), + "OPTIONS" => Some(HttpMethod::OPTIONS), + "TRACE" => Some(HttpMethod::TRACE), + "PATCH" => Some(HttpMethod::PATCH), + _ => None } } } diff --git a/spider/src/http_server.rs b/spider/src/http_server.rs index fc740d6..f12c45d 100644 --- a/spider/src/http_server.rs +++ b/spider/src/http_server.rs @@ -7,9 +7,46 @@ use crate::response::Response; use crate::http_method::HttpMethod; pub trait HttpHandler { - // TODO(andrew): add default behaviour to handlers? - fn do_get(&self, request: Request) -> Response; - fn do_post(&self, request: Request) -> Response; + fn do_get(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_head(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_post(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_put(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_delete(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_connect(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_options(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_trace(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn do_patch(&self, _request: Request) -> Response { + return self.default_action(_request); + } + + fn default_action(&self, _request: Request) -> Response { + let msg = String::from("<h1>Method not allowed</h1>"); + return Response::html(msg, 405); + } } pub struct HttpServer<T: HttpHandler> { @@ -70,10 +107,16 @@ impl<T> HttpServer<T> where T: HttpHandler { None => return Err("Request parsed with errors") }; - // TODO(andrew): add more methods. let response = match request.method { - HttpMethod::GET => self.handler.do_get(request), - HttpMethod::POST => self.handler.do_post(request) + HttpMethod::GET => self.handler.do_get(request), + HttpMethod::HEAD => self.handler.do_head(request), + HttpMethod::POST => self.handler.do_post(request), + HttpMethod::PUT => self.handler.do_put(request), + HttpMethod::DELETE => self.handler.do_delete(request), + HttpMethod::CONNECT => self.handler.do_connect(request), + HttpMethod::OPTIONS => self.handler.do_options(request), + HttpMethod::TRACE => self.handler.do_trace(request), + HttpMethod::PATCH => self.handler.do_patch(request), }; let response = response.format(); match stream.write(&response) { |