diff options
| author | Fuwn <[email protected]> | 2024-07-24 00:20:07 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-07-24 00:20:07 +0000 |
| commit | a27dd14f0845b8eced44f0e0a436ee964c52c0df (patch) | |
| tree | 5eab0ed5e54690cb602362d0383163beceb6550d | |
| parent | fix(response): handle non-trimmed redirect assumptions (diff) | |
| download | september-a27dd14f0845b8eced44f0e0a436ee964c52c0df.tar.xz september-a27dd14f0845b8eced44f0e0a436ee964c52c0df.zip | |
fix(response): remove hard path fixer
| -rw-r--r-- | src/response.rs | 118 |
1 files changed, 39 insertions, 79 deletions
diff --git a/src/response.rs b/src/response.rs index 3986b5a..0159145 100644 --- a/src/response.rs +++ b/src/response.rs @@ -57,34 +57,32 @@ For example: to proxy "gemini://fuwn.me/uptime", visit "/proxy/fuwn.me/uptime".< return Ok(HttpResponse::Ok().body(e.to_string())); } }; + let mut redirect_response_status = None; + let mut redirect_url = None; - if response.content().is_none() - && response.status() != &germ::request::Status::PermanentRedirect - && response.status() != &germ::request::Status::TemporaryRedirect + if *response.status() == germ::request::Status::PermanentRedirect + || *response.status() == germ::request::Status::TemporaryRedirect { - response = match germ::request::request(&match url_from_path( - req.path().trim_end_matches('/'), - true, - &mut is_proxy, - &mut is_raw, - &mut is_nocss, - ) { - Ok(url) => url, - Err(e) => { - return Ok( - HttpResponse::BadRequest() - .content_type("text/plain") - .body(format!("{e}")), - ); - } - }) - .await - { - Ok(response) => response, - Err(e) => { - return Ok(HttpResponse::Ok().body(e.to_string())); + redirect_response_status = Some(*response.status()); + redirect_url = Some( + url::Url::parse(&if response.meta().starts_with('/') { + format!( + "gemini://{}{}", + url.domain().unwrap_or_default(), + response.meta() + ) + } else { + response.meta().to_string() + }) + .unwrap(), + ); + response = + match germ::request::request(&redirect_url.clone().unwrap()).await { + Ok(response) => response, + Err(e) => { + return Ok(HttpResponse::Ok().body(e.to_string())); + } } - }; } let response_time_taken = timer.elapsed(); @@ -197,61 +195,23 @@ For example: to proxy "gemini://fuwn.me/uptime", visit "/proxy/fuwn.me/uptime".< match response.status() { germ::request::Status::Success => { - html_context.push_str(&gemini_html.1); - } - germ::request::Status::PermanentRedirect - | germ::request::Status::TemporaryRedirect => { - html_context.push_str(&format!( - "<blockquote>This page {} redirects to <a \ - href=\"{}\">{}</a>.</blockquote>", - if response.status() == &germ::request::Status::PermanentRedirect { - "permanently" - } else { - "temporarily" - }, - response.meta(), - response.meta().trim() - )); - - let redirect_url = match url_from_path( - &if response.meta().trim_end_matches('/').starts_with('/') { - format!( - "/proxy/{}{}", - url.domain().unwrap_or_default(), - response.meta().trim_end_matches('/') - ) - } else { - response.meta().trim_end_matches('/').to_string() - }, - false, - &mut is_proxy, - &mut is_raw, - &mut is_nocss, - ) { - Ok(url) => url, - Err(e) => { - return Ok( - HttpResponse::BadRequest() - .content_type("text/plain") - .body(format!("{e}")), - ); - } - }; - - html_context.push_str( - &crate::html::from_gemini( - &match germ::request::request(&redirect_url).await { - Ok(response) => response, - Err(e) => { - return Ok(HttpResponse::Ok().body(e.to_string())); - } + if let (Some(status), Some(url)) = + (redirect_response_status, redirect_url) + { + html_context.push_str(&format!( + "<blockquote>This page {} redirects to <a \ + href=\"{}\">{}</a>.</blockquote>", + if status == germ::request::Status::PermanentRedirect { + "permanently" + } else { + "temporarily" }, - &redirect_url, - is_proxy, - ) - .unwrap() - .1, - ); + url, + url + )); + } + + html_context.push_str(&gemini_html.1); } _ => html_context.push_str(&format!("<p>{}</p>", response.meta())), } |