feature: handle requests with axum
This commit is contained in:
@ -14,6 +14,9 @@ tauri-build = { version = "1", features = [] }
|
||||
tauri = { version = "1", features = ["shell-open"] }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
axum = { version = "0.7.5", features = ["tokio", "http2"] }
|
||||
futures = "0.3.30"
|
||||
tower = "0.4.13"
|
||||
|
||||
[features]
|
||||
# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!!
|
||||
|
@ -1,7 +1,21 @@
|
||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
use futures::executor::block_on;
|
||||
|
||||
use axum::{
|
||||
Router as AxumRouter,
|
||||
routing::get as AxumGetter,
|
||||
http::Request as AxumRequest,
|
||||
http::Response as AxumResponse,
|
||||
body::{ Body as AxumBody, to_bytes },
|
||||
http::{StatusCode, Uri},
|
||||
// extract::Path as AxumPath,
|
||||
// body::Bytes as AxumBytes,
|
||||
// response::IntoResponse,
|
||||
};
|
||||
use tauri::http::ResponseBuilder;
|
||||
use tower::{Service, ServiceExt};
|
||||
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[tauri::command]
|
||||
@ -9,18 +23,76 @@ fn greet(name: &str) -> String {
|
||||
format!("Hello, {}! You've been greeted from Rust!", name)
|
||||
}
|
||||
|
||||
|
||||
async fn test() -> &'static str {
|
||||
println!("test method called");
|
||||
"Path: /test"
|
||||
}
|
||||
|
||||
async fn root() -> &'static str {
|
||||
println!("root method called");
|
||||
"Path: /"
|
||||
}
|
||||
|
||||
async fn fallback(uri: Uri) -> (StatusCode, String) {
|
||||
println!("fallback method called on uri: {}", uri);
|
||||
(StatusCode::NOT_FOUND, format!("No route for {uri}"))
|
||||
}
|
||||
|
||||
async fn build_response(router: &mut AxumRouter<()>, path: &str) -> AxumResponse<AxumBody> {
|
||||
let path = path.replace("clego://", "http://0.0.0.0/");
|
||||
println!("build_response: path = {:?}", path);
|
||||
|
||||
let request = AxumRequest::builder()
|
||||
.method("GET")
|
||||
.uri(path)
|
||||
.body(AxumBody::empty())
|
||||
.unwrap();
|
||||
|
||||
println!("build_response: request = {:#?}", request);
|
||||
|
||||
let response = router
|
||||
.as_service()
|
||||
.ready()
|
||||
.await
|
||||
.unwrap()
|
||||
.call(request)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
println!("build_response: response = {:?}", response);
|
||||
|
||||
response
|
||||
}
|
||||
|
||||
fn main() {
|
||||
tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![greet])
|
||||
.register_uri_scheme_protocol("clego", |_app, request| {
|
||||
.register_uri_scheme_protocol("clego", move |_app, request| {
|
||||
println!("------ register_uri_scheme_protocol ------");
|
||||
|
||||
let mut router: AxumRouter<_> = AxumRouter::new()
|
||||
.route("/test/", AxumGetter(test))
|
||||
.route("/", AxumGetter(root))
|
||||
.fallback(fallback);
|
||||
|
||||
let path = request.uri();
|
||||
let body = format!("<html><body>Hello from Rust! Path: {}</body></html>", path);
|
||||
println!("register_uri_scheme_protocol: path = {:?}", path);
|
||||
let future = build_response(&mut router, path);
|
||||
let response: AxumResponse<AxumBody> = block_on(future);
|
||||
// extract body and headers from response
|
||||
let (parts, body) = response.into_parts();
|
||||
|
||||
println!("body: {}", body);
|
||||
println!("register_uri_scheme_protocol: body = {:?} ; parts {:?}", body, parts);
|
||||
|
||||
// Convert body into a Vec<u8>
|
||||
let body_bytes = block_on(to_bytes(body, usize::MAX))?;
|
||||
|
||||
let body_bytes: Vec<u8> = body.into_bytes();
|
||||
// Build a tauri response from the axum response
|
||||
ResponseBuilder::new()
|
||||
.body(body_bytes)
|
||||
.status(parts.status.as_u16())
|
||||
.mimetype("text/html")
|
||||
.body(body_bytes.to_vec())
|
||||
})
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
|
Reference in New Issue
Block a user