diff --git a/Cargo.lock b/Cargo.lock index bf9fb6e..06dff52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1870,6 +1870,7 @@ dependencies = [ "rustls 0.23.26", "rustls-pki-types", "url", + "urlencoding", "webpki", "webpki-roots 0.26.8", ] @@ -3742,6 +3743,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "ustr" version = "1.1.0" diff --git a/crates/lune-std-net/Cargo.toml b/crates/lune-std-net/Cargo.toml index 0a70395..b3ad290 100644 --- a/crates/lune-std-net/Cargo.toml +++ b/crates/lune-std-net/Cargo.toml @@ -30,6 +30,7 @@ pin-project-lite = "0.2" rustls = "0.23" rustls-pki-types = "1.11" url = "2.5" +urlencoding = "2.1" webpki = "0.22" webpki-roots = "0.26" diff --git a/crates/lune-std-net/src/lib.rs b/crates/lune-std-net/src/lib.rs index eaeafbc..46282c3 100644 --- a/crates/lune-std-net/src/lib.rs +++ b/crates/lune-std-net/src/lib.rs @@ -37,11 +37,29 @@ pub fn module(lua: Lua) -> LuaResult { .with_async_function("request", net_request)? // .with_async_function("socket", net_socket)? // .with_async_function("serve", net_serve)? - // .with_function("urlEncode", net_url_encode)? - // .with_function("urlDecode", net_url_decode)? + .with_function("urlEncode", net_url_encode)? + .with_function("urlDecode", net_url_decode)? .build_readonly() } async fn net_request(lua: Lua, config: RequestConfig) -> LuaResult { self::client::send_request(Request::try_from(config)?, lua).await } + +fn net_url_encode( + lua: &Lua, + (lua_string, as_binary): (LuaString, Option), +) -> LuaResult { + let as_binary = as_binary.unwrap_or_default(); + let bytes = self::url::encode(lua_string, as_binary)?; + lua.create_string(bytes) +} + +fn net_url_decode( + lua: &Lua, + (lua_string, as_binary): (LuaString, Option), +) -> LuaResult { + let as_binary = as_binary.unwrap_or_default(); + let bytes = self::url::decode(lua_string, as_binary)?; + lua.create_string(bytes) +} diff --git a/crates/lune-std-net/src/url/decode.rs b/crates/lune-std-net/src/url/decode.rs new file mode 100644 index 0000000..b64523b --- /dev/null +++ b/crates/lune-std-net/src/url/decode.rs @@ -0,0 +1,12 @@ +use mlua::prelude::*; + +pub fn decode(lua_string: LuaString, as_binary: bool) -> LuaResult> { + if as_binary { + Ok(urlencoding::decode_binary(&lua_string.as_bytes()).into_owned()) + } else { + Ok(urlencoding::decode(&lua_string.to_str()?) + .map_err(|e| LuaError::RuntimeError(format!("Encountered invalid encoding - {e}")))? + .into_owned() + .into_bytes()) + } +} diff --git a/crates/lune-std-net/src/url/encode.rs b/crates/lune-std-net/src/url/encode.rs new file mode 100644 index 0000000..56e8995 --- /dev/null +++ b/crates/lune-std-net/src/url/encode.rs @@ -0,0 +1,13 @@ +use mlua::prelude::*; + +pub fn encode(lua_string: LuaString, as_binary: bool) -> LuaResult> { + if as_binary { + Ok(urlencoding::encode_binary(&lua_string.as_bytes()) + .into_owned() + .into_bytes()) + } else { + Ok(urlencoding::encode(&lua_string.to_str()?) + .into_owned() + .into_bytes()) + } +} diff --git a/crates/lune-std-net/src/url/mod.rs b/crates/lune-std-net/src/url/mod.rs index e69de29..de58cce 100644 --- a/crates/lune-std-net/src/url/mod.rs +++ b/crates/lune-std-net/src/url/mod.rs @@ -0,0 +1,5 @@ +mod decode; +mod encode; + +pub use self::decode::decode; +pub use self::encode::encode;