aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-08-24 07:07:03 +0100
committerAkshay <[email protected]>2020-08-24 07:07:03 +0100
commit0a0952e6edb2f4a8c7883b661ef6d4bb4eb14405 (patch)
treee7bddf107823494ab73de40fba34aaa8abecc9c3
parent28194780aa62b8f02432eb29d857adbd26d88569 (diff)
parse host header and return full url
-rw-r--r--src/db.rs2
-rw-r--r--src/service.rs26
2 files changed, 19 insertions, 9 deletions
diff --git a/src/db.rs b/src/db.rs
index 299e07c..c67e39e 100644
--- a/src/db.rs
+++ b/src/db.rs
@@ -11,7 +11,7 @@ pub fn open_connection<P>(p: P) -> Result<Connection>
11where 11where
12 P: AsRef<Path> + fmt::Display, 12 P: AsRef<Path> + fmt::Display,
13{ 13{
14 info!("Opened connection to databse"); 14 info!("Opened connection to database");
15 Ok(Connection::open_with_flags( 15 Ok(Connection::open_with_flags(
16 &p, 16 &p,
17 OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, 17 OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE,
diff --git a/src/service.rs b/src/service.rs
index 4477ee8..35471ea 100644
--- a/src/service.rs
+++ b/src/service.rs
@@ -1,6 +1,6 @@
1// extern 1// extern
2use anyhow::{Context, Result}; 2use anyhow::{Context, Result};
3use hyper::header::CONTENT_TYPE; 3use hyper::header::{HeaderValue, CONTENT_TYPE};
4use hyper::{Body, Method, Request, Response, StatusCode}; 4use hyper::{Body, Method, Request, Response, StatusCode};
5use log::{error, info, trace}; 5use log::{error, info, trace};
6use multer::Multipart; 6use multer::Multipart;
@@ -11,12 +11,18 @@ use url::form_urlencoded;
11// std 11// std
12use std::collections::HashMap; 12use std::collections::HashMap;
13 13
14fn respond_with_shortlink<S: AsRef<str>>(shortlink: S) -> Response<Body> { 14fn get_host(req: &Request<Body>) -> Option<HeaderValue> {
15 let host = req.headers().get("host").map(|h| h.clone())?;
16 return Some(host);
17}
18
19fn respond_with_shortlink<S: AsRef<[u8]>>(shortlink: S, host: &[u8]) -> Response<Body> {
20 let url = [host, b"/", shortlink.as_ref()].concat();
15 info!("Successfully generated shortlink"); 21 info!("Successfully generated shortlink");
16 Response::builder() 22 Response::builder()
17 .status(StatusCode::OK) 23 .status(StatusCode::OK)
18 .header("content-type", "text/html") 24 .header("content-type", "text/html")
19 .body(Body::from(shortlink.as_ref().to_string())) 25 .body(Body::from(url))
20 .unwrap() 26 .unwrap()
21} 27}
22 28
@@ -51,11 +57,13 @@ fn get_link<S: AsRef<str>>(url: S, conn: &Connection) -> Result<Option<String>>
51} 57}
52 58
53async fn process_multipart( 59async fn process_multipart(
54 body: Body, 60 req: Request<Body>,
55 boundary: String, 61 boundary: String,
56 conn: &mut Connection, 62 conn: &mut Connection,
57) -> Result<Response<Body>> { 63) -> Result<Response<Body>> {
58 let mut m = Multipart::new(body, boundary); 64 let _h = get_host(&req);
65 let host = _h.as_ref().map(|h| h.as_bytes()).unwrap_or(b"");
66 let mut m = Multipart::new(req.into_body(), boundary);
59 if let Some(field) = m.next_field().await? { 67 if let Some(field) = m.next_field().await? {
60 if field.name() == Some("shorten") { 68 if field.name() == Some("shorten") {
61 trace!("Recieved valid multipart request"); 69 trace!("Recieved valid multipart request");
@@ -65,7 +73,7 @@ async fn process_multipart(
65 .with_context(|| format!("Expected field name"))?; 73 .with_context(|| format!("Expected field name"))?;
66 74
67 let shortlink = shorten(content, conn)?; 75 let shortlink = shorten(content, conn)?;
68 return Ok(respond_with_shortlink(shortlink)); 76 return Ok(respond_with_shortlink(shortlink, host));
69 } 77 }
70 } 78 }
71 trace!("Unprocessable multipart request!"); 79 trace!("Unprocessable multipart request!");
@@ -73,6 +81,8 @@ async fn process_multipart(
73} 81}
74 82
75async fn process_form(req: Request<Body>, conn: &mut Connection) -> Result<Response<Body>> { 83async fn process_form(req: Request<Body>, conn: &mut Connection) -> Result<Response<Body>> {
84 let _h = get_host(&req);
85 let host = _h.as_ref().map(|h| h.as_bytes()).unwrap_or(b"");
76 let b = hyper::body::to_bytes(req) 86 let b = hyper::body::to_bytes(req)
77 .await 87 .await
78 .with_context(|| format!("Failed to stream request body!"))?; 88 .with_context(|| format!("Failed to stream request body!"))?;
@@ -84,7 +94,7 @@ async fn process_form(req: Request<Body>, conn: &mut Connection) -> Result<Respo
84 if let Some(n) = params.get("shorten") { 94 if let Some(n) = params.get("shorten") {
85 trace!("POST: {}", &n); 95 trace!("POST: {}", &n);
86 let s = shorten(n, conn)?; 96 let s = shorten(n, conn)?;
87 return Ok(respond_with_shortlink(s)); 97 return Ok(respond_with_shortlink(s, host));
88 } else { 98 } else {
89 error!("Invalid form"); 99 error!("Invalid form");
90 return Ok(respond_with_status(StatusCode::UNPROCESSABLE_ENTITY)); 100 return Ok(respond_with_status(StatusCode::UNPROCESSABLE_ENTITY));
@@ -105,7 +115,7 @@ pub async fn shortner_service(req: Request<Body>, mut conn: Connection) -> Resul
105 } 115 }
106 116
107 trace!("Attempting to parse multipart request"); 117 trace!("Attempting to parse multipart request");
108 return process_multipart(req.into_body(), boundary.unwrap(), &mut conn).await; 118 return process_multipart(req, boundary.unwrap(), &mut conn).await;
109 } 119 }
110 &Method::GET => { 120 &Method::GET => {
111 trace!("GET: {}", req.uri()); 121 trace!("GET: {}", req.uri());