From 4ff2f8be9bdecd36533d99f818d45066c3df9040 Mon Sep 17 00:00:00 2001 From: Ed L Date: Sat, 15 Nov 2025 12:29:40 -0800 Subject: [PATCH] chore: improve things --- .gitignore | 2 + Cargo.lock | 283 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 5 +- logs/.gitkeep | 0 person.hbs | 3 + runit | 5 + src/lib.rs | 81 ++++++++------- 7 files changed, 338 insertions(+), 41 deletions(-) create mode 100644 logs/.gitkeep create mode 100644 person.hbs create mode 100755 runit diff --git a/.gitignore b/.gitignore index 7f173a9..e415aa7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ #/target ngx_src +logs/ +db.sqlite3 diff --git a/Cargo.lock b/Cargo.lock index e017705..aedc3f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,15 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "cc" version = "1.2.45" @@ -94,6 +103,15 @@ dependencies = [ "libloading", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -103,6 +121,92 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -182,6 +286,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foldhash" version = "0.1.5" @@ -197,6 +307,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -214,6 +334,22 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "handlebars" +version = "6.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098" +dependencies = [ + "derive_builder", + "log", + "num-order", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "hashbrown" version = "0.15.5" @@ -322,6 +458,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.1.0" @@ -343,6 +485,12 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "lazy_static" version = "1.5.0" @@ -456,8 +604,11 @@ dependencies = [ name = "nginx-test" version = "0.1.0" dependencies = [ + "handlebars", "ngx", "rusqlite", + "serde", + "serde_json", ] [[package]] @@ -479,6 +630,21 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -507,6 +673,49 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pest" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +dependencies = [ + "pest", + "sha2", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -683,6 +892,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "serde" version = "1.0.228" @@ -713,6 +928,30 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shared_child" version = "1.1.1" @@ -778,6 +1017,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" @@ -817,6 +1062,26 @@ dependencies = [ "xattr", ] +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -827,6 +1092,18 @@ dependencies = [ "zerovec", ] +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicode-ident" version = "1.0.22" @@ -879,6 +1156,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index a2b2c7c..5ae2724 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,7 @@ crate-type = ["cdylib"] [dependencies] ngx = "0.4.1" -rusqlite = "0.37.0" \ No newline at end of file +rusqlite = "0.37.0" +handlebars = "6.3.2" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0.145" diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/person.hbs b/person.hbs new file mode 100644 index 0000000..c931f11 --- /dev/null +++ b/person.hbs @@ -0,0 +1,3 @@ +{{#each persons}} +Person: {{ id }}. {{ name }} +{{/each}} diff --git a/runit b/runit new file mode 100755 index 0000000..7ecf412 --- /dev/null +++ b/runit @@ -0,0 +1,5 @@ +/home/edwlan/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/.cache/nginx/1.23.3/linux-x86_64/sbin/nginx \ + -e /dev/stdout \ + -p "$PWD" \ + -c conf/howto.conf \ + -g 'daemon off;' diff --git a/src/lib.rs b/src/lib.rs index d7cc975..1ad7c35 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,15 +1,22 @@ -use std::fmt::{Display, Formatter}; -use std::fmt; +use handlebars::Handlebars; use ngx::core::Buffer; use ngx::ffi::{ - NGX_CONF_TAKE1, NGX_HTTP_LOC_CONF, NGX_HTTP_MODULE, NGX_RS_HTTP_LOC_CONF_OFFSET, NGX_RS_MODULE_SIGNATURE, nginx_version, ngx_array_push, ngx_buf_t, ngx_chain_t, ngx_command_t, ngx_conf_t, ngx_http_core_module, ngx_http_discard_request_body, ngx_http_handler_pt, ngx_http_module_t, ngx_http_phases_NGX_HTTP_ACCESS_PHASE, ngx_http_request_t, ngx_int_t, ngx_module_t, ngx_str_t, ngx_uint_t + NGX_CONF_TAKE1, NGX_HTTP_LOC_CONF, NGX_HTTP_MODULE, NGX_RS_HTTP_LOC_CONF_OFFSET, + NGX_RS_MODULE_SIGNATURE, nginx_version, ngx_array_push, ngx_buf_t, ngx_chain_t, ngx_command_t, + ngx_conf_t, ngx_http_core_module, ngx_http_discard_request_body, ngx_http_handler_pt, + ngx_http_module_t, ngx_http_phases_NGX_HTTP_ACCESS_PHASE, ngx_http_request_t, ngx_int_t, + ngx_module_t, ngx_str_t, ngx_uint_t, }; -use ngx::http::{HTTPModule, MergeConfigError}; +use ngx::http::{HTTPModule, HTTPStatus, MergeConfigError}; use ngx::{core, core::Status, http}; use ngx::{http_request_handler, ngx_log_debug_http, ngx_modules, ngx_null_command, ngx_string}; +use rusqlite::{Connection, Result}; +use serde; +use serde_json::json; +use std::fmt; +use std::fmt::{Display, Formatter}; use std::os::raw::{c_char, c_void}; use std::ptr::addr_of; -use rusqlite::{Connection, Result}; struct Module; @@ -147,11 +154,11 @@ extern "C" fn ngx_http_howto_commands_set_method( std::ptr::null_mut() } -#[derive(Debug)] +#[derive(Debug, serde::Serialize)] struct Person { id: u64, name: String, - address: String + address: String, } impl Display for Person { @@ -184,46 +191,30 @@ http_request_handler!(howto_access_handler, |request: &mut http::Request| { let m_persons = get_person(); let enabled = { - let co = unsafe { request.get_module_loc_conf::(&*addr_of!(ngx_http_howto_module)) }; + let co = unsafe { + request.get_module_loc_conf::(&*addr_of!(ngx_http_howto_module)) + }; let co = co.expect("module config is none"); co.enabled }; ngx_log_debug_http!(request, "howto module enabled called"); + let mut reg = Handlebars::new(); + match reg.register_template_file("person", "./person.hbs") { + Ok(_) => (), + Err(_) => return http::HTTPStatus::INTERNAL_SERVER_ERROR.into(), + } match enabled { true => { match m_persons { Ok(persons) => { - request.discard_request_body(); - request.set_status(http::HTTPStatus::OK); - // request.set_content_length_n(full_len); - let rc = request.send_header(); - if rc == core::Status::NGX_ERROR || rc > core::Status::NGX_OK || request.header_only() { - return rc; - } + let body = match reg.render("person", &json!({"persons": persons})) { + Ok(body) => body, + Err(_) => return http::HTTPStatus::INTERNAL_SERVER_ERROR.into(), + }; - for person in persons { - ngx_log_debug_http!(request, "person: {}\n", person); - - let s = fmt::format(format_args!("{}\n", person)); - let mut buf = match request.pool().create_buffer_from_str(&s) { - Some(buf) => buf, - None => return http::HTTPStatus::INTERNAL_SERVER_ERROR.into(), - }; - - buf.set_last_buf(false); - buf.set_last_in_chain(false); - - let mut out = ngx_chain_t { - buf: buf.as_ngx_buf_mut(), - next: std::ptr::null_mut() - }; - - request.output_filter(&mut out); - } - - let mut buf = match request.pool().create_buffer_from_static_str("\n") { + let mut buf = match request.pool().create_buffer_from_str(&body) { Some(buf) => buf, None => return http::HTTPStatus::INTERNAL_SERVER_ERROR.into(), }; @@ -233,20 +224,30 @@ http_request_handler!(howto_access_handler, |request: &mut http::Request| { let mut out = ngx_chain_t { buf: buf.as_ngx_buf_mut(), - next: std::ptr::null_mut() + next: std::ptr::null_mut(), }; + request.discard_request_body(); + request.set_status(http::HTTPStatus::OK); + // request.set_content_length_n(full_len); + let rc = request.send_header(); + if rc == core::Status::NGX_ERROR + || rc > core::Status::NGX_OK + || request.header_only() + { + return rc; + } + request.output_filter(&mut out); - }, + } Err(e) => { //todo!(); ngx_log_debug_http!(request, "failed to find persons: {}", e); - return http::HTTPStatus::INTERNAL_SERVER_ERROR.into() + return http::HTTPStatus::INTERNAL_SERVER_ERROR.into(); } } - // let method = request.method(); // if method.as_str() == co.method {