mirror of
https://github.com/tuono-labs/tuono
synced 2026-07-25 12:52:47 -07:00
63 lines
1.7 KiB
Rust
63 lines
1.7 KiB
Rust
use crate::config::GLOBAL_CONFIG;
|
|
use axum::body::Body;
|
|
use axum::extract::{Path, Query};
|
|
use std::collections::HashMap;
|
|
|
|
use axum::http::{HeaderName, HeaderValue};
|
|
use axum::response::{IntoResponse, Response};
|
|
use reqwest::Client;
|
|
|
|
pub async fn vite_reverse_proxy(
|
|
Path(path): Path<String>,
|
|
query: Query<HashMap<String, String>>,
|
|
) -> impl IntoResponse {
|
|
let client = Client::new();
|
|
|
|
let config = GLOBAL_CONFIG
|
|
.get()
|
|
.expect("Failed to get the internal config");
|
|
|
|
let vite_url = format!(
|
|
"http://{}:{}/vite-server",
|
|
config.server.host,
|
|
config.server.port + 1
|
|
);
|
|
|
|
let query_string = query
|
|
.0
|
|
.iter()
|
|
.map(|(k, v)| format!("{}={}", k, v))
|
|
.collect::<Vec<_>>()
|
|
.join("&");
|
|
|
|
let query_string = if query_string.is_empty() {
|
|
String::new()
|
|
} else {
|
|
format!("?{}", query_string)
|
|
};
|
|
|
|
match client
|
|
.get(format!("{vite_url}/{path}{query_string}"))
|
|
.send()
|
|
.await
|
|
{
|
|
Ok(res) => {
|
|
let mut response_builder = Response::builder().status(res.status().as_u16());
|
|
|
|
{
|
|
let headers = response_builder.headers_mut().unwrap();
|
|
res.headers().into_iter().for_each(|(name, value)| {
|
|
let name = HeaderName::from_bytes(name.as_ref()).unwrap();
|
|
let value = HeaderValue::from_bytes(value.as_ref()).unwrap();
|
|
headers.insert(name, value);
|
|
});
|
|
}
|
|
|
|
response_builder
|
|
.body(Body::from_stream(res.bytes_stream()))
|
|
.unwrap()
|
|
}
|
|
Err(_) => todo!(),
|
|
}
|
|
}
|