mirror of
https://github.com/DefectingCat/candy
synced 2025-07-15 16:51:34 +00:00
feat: add mlua
This commit is contained in:
185
Cargo.lock
generated
185
Cargo.lock
generated
@ -316,7 +316,7 @@ dependencies = [
|
||||
"bitflags",
|
||||
"cexpr",
|
||||
"clang-sys",
|
||||
"itertools",
|
||||
"itertools 0.12.1",
|
||||
"lazy_static",
|
||||
"lazycell",
|
||||
"log",
|
||||
@ -324,10 +324,10 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"rustc-hash",
|
||||
"rustc-hash 1.1.0",
|
||||
"shlex",
|
||||
"syn",
|
||||
"which",
|
||||
"which 4.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -366,6 +366,16 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.17.0"
|
||||
@ -405,6 +415,7 @@ dependencies = [
|
||||
"md5",
|
||||
"mimalloc",
|
||||
"mime_guess",
|
||||
"mlua",
|
||||
"reqwest",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@ -654,12 +665,28 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "env_home"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe"
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
|
||||
[[package]]
|
||||
name = "erased-serde"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"typeid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.11"
|
||||
@ -1221,6 +1248,15 @@ dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.14"
|
||||
@ -1318,6 +1354,25 @@ version = "0.4.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
|
||||
|
||||
[[package]]
|
||||
name = "lua-src"
|
||||
version = "547.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1edaf29e3517b49b8b746701e5648ccb5785cde1c119062cbabbc5d5cd115e42"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "luajit-src"
|
||||
version = "210.5.12+a4f56a4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3a8e7962a5368d5f264d045a5a255e90f9aa3fc1941ae15a8d2940d42cac671"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"which 7.0.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matchers"
|
||||
version = "0.1.0"
|
||||
@ -1335,9 +1390,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
|
||||
|
||||
[[package]]
|
||||
name = "md5"
|
||||
version = "0.7.0"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
|
||||
checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
@ -1396,6 +1451,55 @@ dependencies = [
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mlua"
|
||||
version = "0.10.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1f5f8fbebc7db5f671671134b9321c4b9aa9adeafccfd9a8c020ae45c6a35d0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bstr",
|
||||
"either",
|
||||
"erased-serde",
|
||||
"futures-util",
|
||||
"mlua-sys",
|
||||
"mlua_derive",
|
||||
"num-traits",
|
||||
"parking_lot",
|
||||
"rustc-hash 2.1.1",
|
||||
"rustversion",
|
||||
"serde",
|
||||
"serde-value",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mlua-sys"
|
||||
version = "0.6.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "380c1f7e2099cafcf40e51d3a9f20a346977587aa4d012eae1f043149a728a93"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"lua-src",
|
||||
"luajit-src",
|
||||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mlua_derive"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "870d71c172fcf491c6b5fb4c04160619a2ee3e5a42a1402269c66bcbf1dd4deb"
|
||||
dependencies = [
|
||||
"itertools 0.13.0",
|
||||
"once_cell",
|
||||
"proc-macro-error2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "native-tls"
|
||||
version = "0.2.14"
|
||||
@ -1511,6 +1615,15 @@ dependencies = [
|
||||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ordered-float"
|
||||
version = "2.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "overload"
|
||||
version = "0.1.1"
|
||||
@ -1583,6 +1696,28 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error-attr2"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error2"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
|
||||
dependencies = [
|
||||
"proc-macro-error-attr2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.93"
|
||||
@ -1730,6 +1865,12 @@ version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "2.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.44"
|
||||
@ -1857,6 +1998,16 @@ dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde-value"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
|
||||
dependencies = [
|
||||
"ordered-float",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.219"
|
||||
@ -2339,6 +2490,12 @@ version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||
|
||||
[[package]]
|
||||
name = "typeid"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.18.0"
|
||||
@ -2549,6 +2706,18 @@ dependencies = [
|
||||
"rustix 0.38.44",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "which"
|
||||
version = "7.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d643ce3fd3e5b54854602a080f34fb10ab75e0b813ee32d00ca2b44fa74762"
|
||||
dependencies = [
|
||||
"either",
|
||||
"env_home",
|
||||
"rustix 1.0.5",
|
||||
"winsafe",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
@ -2732,6 +2901,12 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winsafe"
|
||||
version = "0.0.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rt"
|
||||
version = "0.39.0"
|
||||
|
12
Cargo.toml
12
Cargo.toml
@ -32,6 +32,16 @@ reqwest = { version = "0.12.20", features = [
|
||||
'deflate',
|
||||
"stream",
|
||||
] }
|
||||
# lua
|
||||
mlua = { version = "0.10.5", features = [
|
||||
"lua54",
|
||||
"vendored",
|
||||
"send",
|
||||
"async",
|
||||
"macros",
|
||||
"serialize",
|
||||
"anyhow",
|
||||
] }
|
||||
# tools
|
||||
thiserror = "2.0.12"
|
||||
anyhow = "1.0.98"
|
||||
@ -39,7 +49,7 @@ serde = { version = "1.0.219", features = ["derive"] }
|
||||
toml = "0.8.23"
|
||||
bytes = "1.10.1"
|
||||
const_format = "0.2.34"
|
||||
md5 = "0.7.0"
|
||||
md5 = "0.8.0"
|
||||
dashmap = { version = "6.1.0", features = ["serde"] }
|
||||
# logging
|
||||
tracing = "0.1.41"
|
||||
|
@ -42,6 +42,9 @@ pub struct SettingRoute {
|
||||
pub proxy_timeout: u16,
|
||||
/// Request max body size (bytes)
|
||||
pub max_body_size: Option<u64>,
|
||||
|
||||
/// Lua script
|
||||
pub lua_script: Option<String>,
|
||||
}
|
||||
|
||||
/// Host routes
|
||||
|
122
src/http/mod.rs
122
src/http/mod.rs
@ -40,6 +40,11 @@ pub async fn make_server(host: SettingHost) -> anyhow::Result<()> {
|
||||
// convert to axum routes
|
||||
// register routes
|
||||
for host_route in &host.route {
|
||||
// lua script
|
||||
if let Some(lua_path) = &host_route.lua_script {
|
||||
continue;
|
||||
}
|
||||
|
||||
// reverse proxy
|
||||
if host_route.proxy_pass.is_some() {
|
||||
router = router.route(host_route.location.as_ref(), get(reverse_proxy::serve));
|
||||
@ -50,73 +55,70 @@ pub async fn make_server(host: SettingHost) -> anyhow::Result<()> {
|
||||
if let Some(max_body_size) = host_route.max_body_size {
|
||||
router = router.layer(DefaultBodyLimit::max(max_body_size as usize));
|
||||
}
|
||||
// if host_route.root.is_some() {
|
||||
// router = router.layer(DefaultBodyLimit::max())
|
||||
// }
|
||||
// save route path to map
|
||||
{
|
||||
host_to_save
|
||||
.route_map
|
||||
.insert(host_route.location.clone(), host_route.clone());
|
||||
}
|
||||
} else {
|
||||
// static file
|
||||
if host_route.root.is_none() {
|
||||
warn!("root field not found for route: {:?}", host_route.location);
|
||||
continue;
|
||||
}
|
||||
// Set request max body size
|
||||
if let Some(max_body_size) = host_route.max_body_size {
|
||||
router = router.layer(DefaultBodyLimit::max(max_body_size as usize));
|
||||
}
|
||||
// resister with location
|
||||
// location = "/doc"
|
||||
// route: GET /doc/*
|
||||
// resister with file path
|
||||
// index = ["index.html", "index.txt"]
|
||||
// route: GET /doc/index.html
|
||||
// route: GET /doc/index.txt
|
||||
// register parent path /doc
|
||||
let path_morethan_one = host_route.location.len() > 1;
|
||||
let route_path = if path_morethan_one && host_route.location.ends_with('/') {
|
||||
// first register path with slash /doc
|
||||
router = router.route(&host_route.location, get(serve::serve));
|
||||
debug!("registed route {}", host_route.location);
|
||||
let len = host_route.location.len();
|
||||
let path_without_slash = host_route.location.chars().collect::<Vec<_>>()
|
||||
[0..len - 1]
|
||||
.iter()
|
||||
.collect::<String>();
|
||||
// then register path without slash /doc/
|
||||
router = router.route(&path_without_slash, get(serve::serve));
|
||||
debug!("registed route {}", path_without_slash);
|
||||
host_route.location.clone()
|
||||
} else if path_morethan_one {
|
||||
// first register path without slash /doc
|
||||
router = router.route(&host_route.location, get(serve::serve));
|
||||
debug!("registed route {}", host_route.location);
|
||||
// then register path with slash /doc/
|
||||
let path = format!("{}/", host_route.location);
|
||||
router = router.route(&path, get(serve::serve));
|
||||
debug!("registed route {}", path);
|
||||
path
|
||||
} else {
|
||||
// register path /doc/
|
||||
router = router.route(&host_route.location, get(serve::serve));
|
||||
debug!("registed route {}", host_route.location);
|
||||
host_route.location.clone()
|
||||
};
|
||||
// save route path to map
|
||||
{
|
||||
host_to_save
|
||||
.route_map
|
||||
.insert(route_path.clone(), host_route.clone());
|
||||
}
|
||||
let route_path = format!("{route_path}{{*path}}");
|
||||
// register wildcard path /doc/*
|
||||
router = router.route(route_path.as_ref(), get(serve::serve));
|
||||
debug!("registed route: {}", route_path);
|
||||
continue;
|
||||
}
|
||||
|
||||
// static file
|
||||
if host_route.root.is_none() {
|
||||
warn!("root field not found for route: {:?}", host_route.location);
|
||||
continue;
|
||||
}
|
||||
// Set request max body size
|
||||
if let Some(max_body_size) = host_route.max_body_size {
|
||||
router = router.layer(DefaultBodyLimit::max(max_body_size as usize));
|
||||
}
|
||||
// resister with location
|
||||
// location = "/doc"
|
||||
// route: GET /doc/*
|
||||
// resister with file path
|
||||
// index = ["index.html", "index.txt"]
|
||||
// route: GET /doc/index.html
|
||||
// route: GET /doc/index.txt
|
||||
// register parent path /doc
|
||||
let path_morethan_one = host_route.location.len() > 1;
|
||||
let route_path = if path_morethan_one && host_route.location.ends_with('/') {
|
||||
// first register path with slash /doc
|
||||
router = router.route(&host_route.location, get(serve::serve));
|
||||
debug!("registed route {}", host_route.location);
|
||||
let len = host_route.location.len();
|
||||
let path_without_slash = host_route.location.chars().collect::<Vec<_>>()[0..len - 1]
|
||||
.iter()
|
||||
.collect::<String>();
|
||||
// then register path without slash /doc/
|
||||
router = router.route(&path_without_slash, get(serve::serve));
|
||||
debug!("registed route {}", path_without_slash);
|
||||
host_route.location.clone()
|
||||
} else if path_morethan_one {
|
||||
// first register path without slash /doc
|
||||
router = router.route(&host_route.location, get(serve::serve));
|
||||
debug!("registed route {}", host_route.location);
|
||||
// then register path with slash /doc/
|
||||
let path = format!("{}/", host_route.location);
|
||||
router = router.route(&path, get(serve::serve));
|
||||
debug!("registed route {}", path);
|
||||
path
|
||||
} else {
|
||||
// register path /doc/
|
||||
router = router.route(&host_route.location, get(serve::serve));
|
||||
debug!("registed route {}", host_route.location);
|
||||
host_route.location.clone()
|
||||
};
|
||||
// save route path to map
|
||||
{
|
||||
host_to_save
|
||||
.route_map
|
||||
.insert(route_path.clone(), host_route.clone());
|
||||
}
|
||||
let route_path = format!("{route_path}{{*path}}");
|
||||
// register wildcard path /doc/*
|
||||
router = router.route(route_path.as_ref(), get(serve::serve));
|
||||
debug!("registed route: {}", route_path);
|
||||
}
|
||||
|
||||
// save host to map
|
||||
|
Reference in New Issue
Block a user