Skip to content

Commit

Permalink
Improved glyph url handling: accept arbitrary suffixes after {end} ma…
Browse files Browse the repository at this point in the history
  • Loading branch information
bzeiss committed Jul 28, 2024
1 parent 674a295 commit bd5938b
Showing 1 changed file with 27 additions and 4 deletions.
31 changes: 27 additions & 4 deletions martin/src/srv/fonts.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::string::ToString;
use std::str::FromStr;

use actix_web::error::{ErrorBadRequest, ErrorNotFound};
use actix_web::web::{Data, Path};
Expand All @@ -11,19 +12,41 @@ use crate::srv::server::map_internal_error;
#[derive(Deserialize, Debug)]
struct FontRequest {
fontstack: String,
start: u32,
end: u32,
start: String,
end: String,
}

impl FontRequest {
fn parse(&self) -> Result<(u32, u32), &'static str> {
let start = u32::from_str(&self.start).map_err(|_| "Invalid start value")?;
let end = FontRequest::parse_leading_digits(&self.end)?;

Ok((start, end))
}

fn parse_leading_digits(input: &str) -> Result<u32, &'static str> {
let digits: String = input.chars().take_while(|c| c.is_digit(10)).collect();
if digits.is_empty() {
Err("No leading digits found")
} else {
digits.parse::<u32>().map_err(|_| "Failed to parse number")
}
}
}

#[route(
"/font/{fontstack}/{start}-{end}",
"/font/{fontstack}/{start}-{end}*",
method = "GET",
wrap = "middleware::Compress::default()"
)]
#[allow(clippy::unused_async)]
async fn get_font(path: Path<FontRequest>, fonts: Data<FontSources>) -> ActixResult<HttpResponse> {
let (start, end) = path.parse().map_err(|e| {
ErrorBadRequest(e.to_string())
})?;

let data = fonts
.get_font_range(&path.fontstack, path.start, path.end)
.get_font_range(&path.fontstack, start, end)
.map_err(map_font_error)?;
Ok(HttpResponse::Ok()
.content_type("application/x-protobuf")
Expand Down

0 comments on commit bd5938b

Please sign in to comment.