Finish asset handler

This commit is contained in:
Jonathan Kelley committed 2024-01-05 18:08:04 -08:00
1 parent 8323e45970
commit 347351d1ee
2 files changed
+39 -14

No files matched your search

+29 -2
View File
@@ -1,7 +1,7 @@
use crate::{assets::*, edits::EditQueue};
use std::path::{Path, PathBuf};
use wry::{
http::{status::StatusCode, Request, Response},
http::{status::StatusCode, Request, Response, Uri},
RequestAsyncResponder, Result,
};
@@ -59,7 +59,7 @@ pub(super) fn index_request(
/// - If that doesn't match, tries a user provided asset handler
/// - If that doesn't match, tries to serve a file from the filesystem
pub(super) fn desktop_handler(
request: Request<Vec<u8>>,
mut request: Request<Vec<u8>>,
asset_handlers: AssetHandlerRegistry,
edit_queue: &EditQueue,
responder: RequestAsyncResponder,
@@ -83,6 +83,13 @@ pub(super) fn desktop_handler(
if let Some(name) = name.to_str() {
if asset_handlers.has_handler(name) {
// Trim the leading path from the URI
//
// I hope this is reliable!
//
// so a request for /assets/logos/logo.png?query=123 will become /logos/logo.png?query=123
strip_uri_prefix(&mut request, name);
return asset_handlers.handle_request(name, request, responder);
}
}
@@ -114,6 +121,26 @@ fn serve_from_fs(path: PathBuf) -> Result<Response<Vec<u8>>> {
.body(std::fs::read(asset)?)?)
}
fn strip_uri_prefix(request: &mut Request<Vec<u8>>, name: &str) {
// trim the leading path
if let Some(path) = request.uri().path_and_query() {
let new_path = path
.path()
.trim_start_matches('/')
.strip_prefix(name)
.expect("expected path to have prefix");
let new_uri = Uri::builder()
.scheme(request.uri().scheme_str().unwrap_or("http"))
.path_and_query(format!("{}{}", new_path, path.query().unwrap_or("")))
.authority("index.html")
.build()
.expect("failed to build new URI");
*request.uri_mut() = new_uri;
}
}
/// Construct the inline script that boots up the page and bridges the webview with rust code.
///
/// The arguments here: