use ::core::ptr::NonNull;
use crate::ffi::{
ngx_http_conf_ctx_t, ngx_http_core_srv_conf_t, ngx_http_request_t,
ngx_http_upstream_srv_conf_t, ngx_module_t,
};
use crate::http::HttpModule;
pub trait HttpModuleConfExt {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, _module: &ngx_module_t) -> Option<NonNull<T>> {
None
}
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, _module: &ngx_module_t) -> Option<NonNull<T>> {
None
}
#[inline]
unsafe fn http_location_conf_unchecked<T>(&self, _module: &ngx_module_t) -> Option<NonNull<T>> {
None
}
}
impl HttpModuleConfExt for crate::ffi::ngx_http_conf_ctx_t {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
NonNull::new(unsafe { *self.main_conf.add(module.ctx_index) }.cast())
}
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
NonNull::new(unsafe { *self.srv_conf.add(module.ctx_index) }.cast())
}
#[inline]
unsafe fn http_location_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
NonNull::new(unsafe { *self.loc_conf.add(module.ctx_index) }.cast())
}
}
impl HttpModuleConfExt for crate::ffi::ngx_cycle_t {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
let http_conf = unsafe {
self.conf_ctx
.add(nginx_sys::ngx_http_module.index)
.as_ref()?
};
let conf_ctx = (*http_conf).cast::<ngx_http_conf_ctx_t>();
unsafe { conf_ctx.as_ref()?.http_main_conf_unchecked(module) }
}
}
impl HttpModuleConfExt for crate::ffi::ngx_conf_t {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
let conf_ctx = self.ctx.cast::<ngx_http_conf_ctx_t>();
unsafe { conf_ctx.as_ref()?.http_main_conf_unchecked(module) }
}
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
let conf_ctx = self.ctx.cast::<ngx_http_conf_ctx_t>();
unsafe { conf_ctx.as_ref()?.http_server_conf_unchecked(module) }
}
#[inline]
unsafe fn http_location_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
let conf_ctx = self.ctx.cast::<ngx_http_conf_ctx_t>();
unsafe { conf_ctx.as_ref()?.http_location_conf_unchecked(module) }
}
}
impl HttpModuleConfExt for crate::ffi::ngx_http_connection_t {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
unsafe { self.conf_ctx.as_ref()?.http_main_conf_unchecked(module) }
}
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
unsafe { self.conf_ctx.as_ref()?.http_server_conf_unchecked(module) }
}
#[inline]
unsafe fn http_location_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
unsafe { self.conf_ctx.as_ref()?.http_location_conf_unchecked(module) }
}
}
impl HttpModuleConfExt for ngx_http_core_srv_conf_t {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
unsafe { self.ctx.as_ref()?.http_main_conf_unchecked(module) }
}
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
unsafe { self.ctx.as_ref()?.http_server_conf_unchecked(module) }
}
#[inline]
unsafe fn http_location_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
unsafe { self.ctx.as_ref()?.http_location_conf_unchecked(module) }
}
}
impl HttpModuleConfExt for ngx_http_request_t {
#[inline]
unsafe fn http_main_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
NonNull::new(unsafe { *self.main_conf.add(module.ctx_index) }.cast())
}
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
NonNull::new(unsafe { *self.srv_conf.add(module.ctx_index) }.cast())
}
#[inline]
unsafe fn http_location_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
NonNull::new(unsafe { *self.loc_conf.add(module.ctx_index) }.cast())
}
}
impl HttpModuleConfExt for ngx_http_upstream_srv_conf_t {
#[inline]
unsafe fn http_server_conf_unchecked<T>(&self, module: &ngx_module_t) -> Option<NonNull<T>> {
let conf = self.srv_conf;
if conf.is_null() {
return None;
}
NonNull::new(unsafe { *conf.add(module.ctx_index) }.cast())
}
}
pub unsafe trait HttpModuleMainConf: HttpModule {
type MainConf;
fn main_conf(o: &impl HttpModuleConfExt) -> Option<&'static Self::MainConf> {
unsafe { Some(o.http_main_conf_unchecked(Self::module())?.as_ref()) }
}
fn main_conf_mut(o: &impl HttpModuleConfExt) -> Option<&'static mut Self::MainConf> {
unsafe { Some(o.http_main_conf_unchecked(Self::module())?.as_mut()) }
}
}
pub unsafe trait HttpModuleServerConf: HttpModule {
type ServerConf;
fn server_conf(o: &impl HttpModuleConfExt) -> Option<&'static Self::ServerConf> {
unsafe { Some(o.http_server_conf_unchecked(Self::module())?.as_ref()) }
}
fn server_conf_mut(o: &impl HttpModuleConfExt) -> Option<&'static mut Self::ServerConf> {
unsafe { Some(o.http_server_conf_unchecked(Self::module())?.as_mut()) }
}
}
pub unsafe trait HttpModuleLocationConf: HttpModule {
type LocationConf;
fn location_conf(o: &impl HttpModuleConfExt) -> Option<&'static Self::LocationConf> {
unsafe { Some(o.http_location_conf_unchecked(Self::module())?.as_ref()) }
}
fn location_conf_mut(o: &impl HttpModuleConfExt) -> Option<&'static mut Self::LocationConf> {
unsafe { Some(o.http_location_conf_unchecked(Self::module())?.as_mut()) }
}
}
mod core {
use crate::ffi::{
ngx_http_core_loc_conf_t, ngx_http_core_main_conf_t, ngx_http_core_module,
ngx_http_core_srv_conf_t,
};
pub struct NgxHttpCoreModule;
impl crate::http::HttpModule for NgxHttpCoreModule {
fn module() -> &'static crate::ffi::ngx_module_t {
unsafe { &*::core::ptr::addr_of!(ngx_http_core_module) }
}
}
unsafe impl crate::http::HttpModuleMainConf for NgxHttpCoreModule {
type MainConf = ngx_http_core_main_conf_t;
}
unsafe impl crate::http::HttpModuleServerConf for NgxHttpCoreModule {
type ServerConf = ngx_http_core_srv_conf_t;
}
unsafe impl crate::http::HttpModuleLocationConf for NgxHttpCoreModule {
type LocationConf = ngx_http_core_loc_conf_t;
}
}
pub use core::NgxHttpCoreModule;
#[cfg(ngx_feature = "http_ssl")]
mod ssl {
use crate::ffi::{ngx_http_ssl_module, ngx_http_ssl_srv_conf_t};
pub struct NgxHttpSslModule;
impl crate::http::HttpModule for NgxHttpSslModule {
fn module() -> &'static crate::ffi::ngx_module_t {
unsafe { &*::core::ptr::addr_of!(ngx_http_ssl_module) }
}
}
unsafe impl crate::http::HttpModuleServerConf for NgxHttpSslModule {
type ServerConf = ngx_http_ssl_srv_conf_t;
}
}
#[cfg(ngx_feature = "http_ssl")]
pub use ssl::NgxHttpSslModule;
mod upstream {
use crate::ffi::{
ngx_http_upstream_main_conf_t, ngx_http_upstream_module, ngx_http_upstream_srv_conf_t,
};
pub struct NgxHttpUpstreamModule;
impl crate::http::HttpModule for NgxHttpUpstreamModule {
fn module() -> &'static crate::ffi::ngx_module_t {
unsafe { &*::core::ptr::addr_of!(ngx_http_upstream_module) }
}
}
unsafe impl crate::http::HttpModuleMainConf for NgxHttpUpstreamModule {
type MainConf = ngx_http_upstream_main_conf_t;
}
unsafe impl crate::http::HttpModuleServerConf for NgxHttpUpstreamModule {
type ServerConf = ngx_http_upstream_srv_conf_t;
}
}
pub use upstream::NgxHttpUpstreamModule;
#[cfg(all(nginx1_25_1, ngx_feature = "http_v2"))]
mod http_v2 {
use crate::ffi::{ngx_http_v2_module, ngx_http_v2_srv_conf_t};
pub struct NgxHttpV2Module;
impl crate::http::HttpModule for NgxHttpV2Module {
fn module() -> &'static crate::ffi::ngx_module_t {
unsafe { &*::core::ptr::addr_of!(ngx_http_v2_module) }
}
}
unsafe impl crate::http::HttpModuleServerConf for NgxHttpV2Module {
type ServerConf = ngx_http_v2_srv_conf_t;
}
}
#[cfg(all(nginx1_25_1, ngx_feature = "http_v2"))]
pub use http_v2::NgxHttpV2Module;
#[cfg(ngx_feature = "http_v3")]
mod http_v3 {
use crate::ffi::{ngx_http_v3_module, ngx_http_v3_srv_conf_t};
pub struct NgxHttpV3Module;
impl crate::http::HttpModule for NgxHttpV3Module {
fn module() -> &'static crate::ffi::ngx_module_t {
unsafe { &*::core::ptr::addr_of!(ngx_http_v3_module) }
}
}
unsafe impl crate::http::HttpModuleServerConf for NgxHttpV3Module {
type ServerConf = ngx_http_v3_srv_conf_t;
}
}
#[cfg(ngx_feature = "http_v3")]
pub use http_v3::NgxHttpV3Module;