From ad020f2256fb03914a2e62dd78f448bd06718e9c Mon Sep 17 00:00:00 2001 From: Taylor Vann Date: Sun, 6 Jul 2025 13:59:43 -0700 Subject: [PATCH 1/4] flatten compose range response logic --- response/src/range_response.rs | 40 +++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/response/src/range_response.rs b/response/src/range_response.rs index 330c2b1..4ab9c46 100644 --- a/response/src/range_response.rs +++ b/response/src/range_response.rs @@ -63,26 +63,29 @@ async fn compose_range_response( available_encodings: &AvailableEncodings, range_header: String, ) -> Option> { - if let Some(filepath) = get_path_from_request_url(req, directory).await { - if let Some(ranges) = get_ranges(&range_header) { - let encodings = get_encodings(req, available_encodings); - - if 1 == ranges.len() { - if let Some(res) = build_single_range_response(&filepath, encodings, ranges).await { - return Some(res); - } - } - }; + let filepath = match get_path_from_request_url(req, directory).await { + Some(fp) => fp, + _ => { + return Some(build_last_resort_response( + StatusCode::NOT_FOUND, + NOT_FOUND_404, + )) + } + }; + + if let Some(ranges) = get_ranges(&range_header) { + let encodings = get_encodings(req, available_encodings); - return Some(build_last_resort_response( - StatusCode::RANGE_NOT_SATISFIABLE, - RANGE_NOT_SATISFIABLE_416, - )); + if 1 == ranges.len() { + if let Some(res) = build_single_range_response(&filepath, encodings, ranges).await { + return Some(res); + } + } }; Some(build_last_resort_response( - StatusCode::NOT_FOUND, - NOT_FOUND_404, + StatusCode::RANGE_NOT_SATISFIABLE, + RANGE_NOT_SATISFIABLE_416, )) } @@ -172,7 +175,8 @@ async fn build_single_range_response( ) -> Option> { let content_type = get_content_type(&filepath); - if let Some(res) = compose_encoded_response(&filepath, content_type, &encodings, &ranges).await + if let Some(res) = + compose_encoded_single_range_response(&filepath, content_type, &encodings, &ranges).await { return Some(res); }; @@ -181,7 +185,7 @@ async fn build_single_range_response( compose_single_range_response(&filepath, content_type, None, &ranges).await } -async fn compose_encoded_response( +async fn compose_encoded_single_range_response( filepath: &PathBuf, content_type: &str, encodings: &Option>, From 3408f8053a42e4b672c3997093d4e0696171f059 Mon Sep 17 00:00:00 2001 From: Taylor Vann Date: Sun, 6 Jul 2025 18:13:37 -0700 Subject: [PATCH 2/4] remove duplicate function --- response/src/range_response.rs | 61 ++++++++++++---------------------- 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/response/src/range_response.rs b/response/src/range_response.rs index 4ab9c46..5343d62 100644 --- a/response/src/range_response.rs +++ b/response/src/range_response.rs @@ -10,7 +10,6 @@ use tokio::fs::File; use tokio::io::AsyncSeekExt; use tokio_util::io::ReaderStream; -use crate::available_encodings::AvailableEncodings; use crate::content_type::get_content_type; use crate::last_resort_response::{build_last_resort_response, NOT_FOUND_404}; use crate::response_paths::{add_extension, get_encodings, get_path_from_request_url}; @@ -36,13 +35,25 @@ pub async fn build_range_response( _ => return None, }; - compose_range_response( - req, - &res_params.directory, - &res_params.available_encodings, - range_header, - ) - .await + if let Some(filepath) = get_path_from_request_url(req, &res_params.directory).await { + if let Some(ranges) = get_ranges(&range_header) { + let encodings = get_encodings(req, &res_params.available_encodings); + + if let Some(res) = build_single_range_response(&filepath, encodings, ranges).await { + return Some(res); + } + }; + + return Some(build_last_resort_response( + StatusCode::RANGE_NOT_SATISFIABLE, + RANGE_NOT_SATISFIABLE_416, + )) + } + + Some(build_last_resort_response( + StatusCode::NOT_FOUND, + NOT_FOUND_404, + )) } fn get_range_header(req: &Request) -> Option { @@ -57,38 +68,6 @@ fn get_range_header(req: &Request) -> Option { } } -async fn compose_range_response( - req: &Request, - directory: &PathBuf, - available_encodings: &AvailableEncodings, - range_header: String, -) -> Option> { - let filepath = match get_path_from_request_url(req, directory).await { - Some(fp) => fp, - _ => { - return Some(build_last_resort_response( - StatusCode::NOT_FOUND, - NOT_FOUND_404, - )) - } - }; - - if let Some(ranges) = get_ranges(&range_header) { - let encodings = get_encodings(req, available_encodings); - - if 1 == ranges.len() { - if let Some(res) = build_single_range_response(&filepath, encodings, ranges).await { - return Some(res); - } - } - }; - - Some(build_last_resort_response( - StatusCode::RANGE_NOT_SATISFIABLE, - RANGE_NOT_SATISFIABLE_416, - )) -} - // on any fail return nothing fn get_ranges(range_header_value: &str) -> Option, Option)>> { let ranges_str = match range_header_value.trim().strip_prefix("bytes=") { @@ -173,6 +152,8 @@ async fn build_single_range_response( encodings: Option>, ranges: Vec<(Option, Option)>, ) -> Option> { + if 1 != ranges.len() { return None; } + let content_type = get_content_type(&filepath); if let Some(res) = From f5d46ed015a74e2a9b5c06da0393cf690d577e2f Mon Sep 17 00:00:00 2001 From: Taylor Vann Date: Sun, 6 Jul 2025 18:39:39 -0700 Subject: [PATCH 3/4] assignment nit --- response/src/range_response.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/response/src/range_response.rs b/response/src/range_response.rs index 5343d62..56f1a78 100644 --- a/response/src/range_response.rs +++ b/response/src/range_response.rs @@ -47,7 +47,7 @@ pub async fn build_range_response( return Some(build_last_resort_response( StatusCode::RANGE_NOT_SATISFIABLE, RANGE_NOT_SATISFIABLE_416, - )) + )); } Some(build_last_resort_response( @@ -152,7 +152,9 @@ async fn build_single_range_response( encodings: Option>, ranges: Vec<(Option, Option)>, ) -> Option> { - if 1 != ranges.len() { return None; } + if 1 != ranges.len() { + return None; + }; let content_type = get_content_type(&filepath); @@ -201,7 +203,7 @@ async fn compose_single_range_response( _ => return None, }; - let size: usize = match file.metadata().await { + let size = match file.metadata().await { Ok(md) => md.len() as usize, _ => return None, }; From 58e19da6ffb68c8117a48528f88f7ce967e10e0c Mon Sep 17 00:00:00 2001 From: Taylor Vann Date: Sun, 6 Jul 2025 18:54:50 -0700 Subject: [PATCH 4/4] add constants to flyweight --- response/src/get_response.rs | 4 ++-- response/src/head_response.rs | 4 ++-- response/src/last_resort_response.rs | 2 -- response/src/range_response.rs | 5 ++--- response/src/type_flyweight.rs | 3 +++ 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/response/src/get_response.rs b/response/src/get_response.rs index aa847cb..ea03ea7 100644 --- a/response/src/get_response.rs +++ b/response/src/get_response.rs @@ -9,12 +9,12 @@ use tokio::fs; use tokio_util::io::ReaderStream; use crate::content_type::get_content_type; -use crate::last_resort_response::{build_last_resort_response, NOT_FOUND_404}; +use crate::last_resort_response::build_last_resort_response; use crate::range_response::build_range_response; use crate::response_paths::{ add_extension, get_encodings, get_filepath, get_path_from_request_url, }; -use crate::type_flyweight::{BoxedResponse, ResponseParams}; +use crate::type_flyweight::{BoxedResponse, ResponseParams, NOT_FOUND_404}; pub async fn build_get_response( req: Request, diff --git a/response/src/head_response.rs b/response/src/head_response.rs index 2099042..9abdcb9 100644 --- a/response/src/head_response.rs +++ b/response/src/head_response.rs @@ -7,9 +7,9 @@ use std::path::PathBuf; use tokio::fs; use crate::content_type::get_content_type; -use crate::last_resort_response::{build_last_resort_response, NOT_FOUND_404}; +use crate::last_resort_response::build_last_resort_response; use crate::response_paths::{add_extension, get_encodings, get_path_from_request_url}; -use crate::type_flyweight::{BoxedResponse, ResponseParams}; +use crate::type_flyweight::{BoxedResponse, ResponseParams, NOT_FOUND_404}; pub async fn build_head_response( req: Request, diff --git a/response/src/last_resort_response.rs b/response/src/last_resort_response.rs index 908bcbb..e576b38 100644 --- a/response/src/last_resort_response.rs +++ b/response/src/last_resort_response.rs @@ -7,8 +7,6 @@ use hyper::StatusCode; use crate::content_type::HTML; use crate::type_flyweight::BoxedResponse; -pub const NOT_FOUND_404: &str = "404 not found"; - pub fn build_last_resort_response( status_code: StatusCode, body: &'static str, diff --git a/response/src/range_response.rs b/response/src/range_response.rs index 56f1a78..f0dfcbc 100644 --- a/response/src/range_response.rs +++ b/response/src/range_response.rs @@ -11,9 +11,9 @@ use tokio::io::AsyncSeekExt; use tokio_util::io::ReaderStream; use crate::content_type::get_content_type; -use crate::last_resort_response::{build_last_resort_response, NOT_FOUND_404}; +use crate::last_resort_response::build_last_resort_response; use crate::response_paths::{add_extension, get_encodings, get_path_from_request_url}; -use crate::type_flyweight::{BoxedResponse, ResponseParams}; +use crate::type_flyweight::{BoxedResponse, ResponseParams, BAD_REQUEST_400, NOT_FOUND_404}; // Range: =- // Range: =- @@ -22,7 +22,6 @@ use crate::type_flyweight::{BoxedResponse, ResponseParams}; // multi range requests require an entirely different strategy // Range: =-, …, - -pub const BAD_REQUEST_400: &str = "400 bad request"; pub const RANGE_NOT_SATISFIABLE_416: &str = "416 range not satisfiable"; pub async fn build_range_response( diff --git a/response/src/type_flyweight.rs b/response/src/type_flyweight.rs index 72122d1..5456639 100644 --- a/response/src/type_flyweight.rs +++ b/response/src/type_flyweight.rs @@ -8,6 +8,9 @@ use crate::available_encodings::AvailableEncodings; pub type BoxedResponse = Response>; +pub const NOT_FOUND_404: &str = "404 not found"; +pub const BAD_REQUEST_400: &str = "400 bad request"; + #[derive(Clone, Debug)] pub struct ResponseParams { pub directory: PathBuf,