summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--spider/src/http_method.rs33
-rw-r--r--spider/src/http_server.rs55
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) {