summaryrefslogtreecommitdiff
path: root/src/routes/mod.rs
diff options
context:
space:
mode:
author53hornet <atc@53hor.net>2022-01-22 08:45:24 -0500
committerAdam T. Carpenter <atc@53hor.net>2022-01-22 15:18:04 -0500
commitba49aa806a48839b61fb261f7ccd007a507d8d50 (patch)
tree222855376c301972a10bb8656c94731fc40ded76 /src/routes/mod.rs
parentd7472320a00fa0bfd6b9be904e0730461f093f61 (diff)
downloadtwinh-ba49aa806a48839b61fb261f7ccd007a507d8d50.tar.xz
twinh-ba49aa806a48839b61fb261f7ccd007a507d8d50.zip
feat: experimental cgi forkcgi
Diffstat (limited to 'src/routes/mod.rs')
-rw-r--r--src/routes/mod.rs194
1 files changed, 0 insertions, 194 deletions
diff --git a/src/routes/mod.rs b/src/routes/mod.rs
deleted file mode 100644
index 1948657..0000000
--- a/src/routes/mod.rs
+++ /dev/null
@@ -1,194 +0,0 @@
-use crate::error::TwinHError;
-//use crate::repo;
-use crate::templates;
-use hyper::body::HttpBody as _;
-use hyper::Method;
-use hyper::StatusCode;
-use hyper::{Body, Request, Response};
-use serde::{Deserialize, Serialize};
-
-pub async fn router(req: Request<Body>) -> Result<Response<Body>, TwinHError> {
- match (req.method(), req.uri().path()) {
- (&Method::GET, "/favicon.ico") | (&Method::GET, "/favicon.svg") => favicon(),
- (&Method::GET, "/") => index(req).await,
- (&Method::GET, "/cars") => cars(req).await,
- (&Method::GET, "/login") => login().await,
- (&Method::GET, "/login/google") => login_google().await,
- (&Method::GET, "/login/google/code") => login_google_code(req).await,
- (&Method::GET, "/suggestions") => suggestions().await,
- _ => Ok(Response::builder()
- .status(StatusCode::NOT_FOUND)
- .body("Not found.".into())
- .unwrap()),
- }
-}
-
-async fn suggestions() -> Result<Response<Body>, TwinHError> {
- todo!()
-}
-
-async fn login() -> Result<Response<Body>, TwinHError> {
- Ok(Response::new(
- templates::REGISTRY.render("login", &"").unwrap().into(),
- ))
-}
-
-async fn login_google() -> Result<Response<Body>, TwinHError> {
- let uri = hyper::Uri::builder()
- .scheme("https")
- .authority("accounts.google.com")
- .path_and_query(format!(
- "{}?client_id={}&redirect_uri={}&response_type={}&scope={}&state={}",
- "/o/oauth2/v2/auth",
- "???",
- "http://localhost:3000/login/google/code",
- "code",
- "openid%20profile%20email",
- "BLARGH"
- ))
- .build()
- .unwrap();
- let resp = Response::builder()
- .header(hyper::header::LOCATION, uri.to_string())
- .status(StatusCode::TEMPORARY_REDIRECT)
- .body("".into())
- .unwrap();
- Ok(resp)
-}
-
-#[derive(Serialize)]
-struct AuthRequest {
- client_id: String,
- client_secret: String,
- grant_type: &'static str,
- redirect_uri: String,
- code: String,
-}
-
-impl Default for AuthRequest {
- fn default() -> Self {
- Self {
- client_id: "???".into(),
- client_secret: "???".into(),
- grant_type: "authorization_code",
- redirect_uri: String::new(),
- code: String::new(),
- }
- }
-}
-
-async fn login_google_code(req: Request<Body>) -> Result<Response<Body>, TwinHError> {
- let query = req.uri().query().unwrap_or_default();
- let query = serde_urlencoded::de::from_str::<GoogleOAuthQuery>(query).unwrap();
- if query.state != "BLARGH" {
- dbg!("tampering?");
- }
-
- // get access token
- let auth_body = AuthRequest {
- code: query.code,
- redirect_uri: "http://localhost:3000/login/google/code".to_owned(),
- ..Default::default()
- };
-
- let https = hyper_rustls::HttpsConnector::with_native_roots();
- let client: hyper::Client<_, hyper::Body> = hyper::Client::builder().build(https);
-
- let req = Request::builder()
- .method(Method::POST)
- .uri("https://oauth2.googleapis.com/token")
- .header(
- hyper::header::CONTENT_TYPE,
- "application/x-www-form-urlencoded",
- )
- .body(serde_urlencoded::ser::to_string(auth_body).unwrap().into())
- .unwrap();
- let mut resp = client.request(req).await.unwrap();
- use std::io::prelude::*;
- while let Some(chunk) = resp.body_mut().data().await {
- std::io::stdout().write_all(&chunk.unwrap()).unwrap();
- }
-
- let resp = Response::builder()
- .header(hyper::header::LOCATION, "/".to_string())
- .status(StatusCode::TEMPORARY_REDIRECT)
- .body("Successful login, redirecting...".into())
- .unwrap();
- Ok(resp)
-}
-
-pub struct AccessToken {
- access_token: String,
- expires_in: String,
- scope: String,
- token_type: String,
-}
-
-async fn cars(req: Request<Body>) -> Result<Response<Body>, TwinHError> {
- //let cars = repo::get_all_cars().unwrap();
- todo!()
-}
-
-fn favicon() -> Result<Response<Body>, TwinHError> {
- let resp = Response::builder()
- .header(hyper::header::CONTENT_TYPE, "image/svg+xml")
- .body(templates::FAVICON.into())
- .unwrap();
- Ok(resp)
-}
-
-async fn index(req: Request<Body>) -> Result<Response<Body>, TwinHError> {
- let query = req.uri().query().unwrap_or_default();
- let filter = serde_urlencoded::de::from_str::<PartsQuery>(query).unwrap();
- let mut data = PartsData::default();
- data.makes = Some(vec!["Hudson".into(), "Essex".into(), "Terraplane".into()]);
-
- if let Some(make) = filter.make {
- if make.eq("Hudson") {
- data.models = Some(vec!["Hornet".into(), "Wasp".into(), "Jet".into()]);
- } else if make.eq("Essex") {
- data.models = Some(vec!["Super Six".into()]);
- }
- data.selected_make = Some(make);
- }
-
- data.parts = Some(Vec::new());
- if let Some(model) = filter.model {
- data.parts = Some(vec!["1".into(), "2".into(), "3".into()]);
- data.selected_model = Some(model);
- }
-
- let body = templates::REGISTRY.render("index", &data).unwrap();
- let resp = Response::builder()
- .header(hyper::header::CONTENT_TYPE, "text/html; charset=utf-8")
- .body(body.into())
- .unwrap();
- Ok(resp)
-}
-
-#[derive(Debug, Deserialize)]
-struct GoogleOAuthQuery {
- code: String,
- state: String,
-}
-
-#[derive(Debug, Deserialize)]
-struct PartsQuery {
- make: Option<String>,
- year: Option<String>,
- model: Option<String>,
- engine: Option<String>,
-}
-
-#[derive(Debug, Serialize, Default)]
-struct PartsData {
- makes: Option<Vec<String>>,
- years: Option<Vec<String>>,
- models: Option<Vec<String>>,
- engines: Option<Vec<String>>,
- selected_make: Option<String>,
- selected_year: Option<String>,
- selected_model: Option<String>,
- selected_engine: Option<String>,
- parts: Option<Vec<String>>,
-}