add output

This commit is contained in:
Joel Wurtz 2023-10-30 16:58:00 +01:00
parent 51042e5310
commit 4f74bfcd8a
No known key found for this signature in database
GPG Key ID: ED264D1967A51B0D
2 changed files with 40 additions and 3 deletions

View File

@ -1,7 +1,7 @@
use crate::ffi::sapi_header_struct; use crate::ffi::sapi_header_struct;
use crate::{embed::SapiModule, error::Result}; use crate::{embed::SapiModule, error::Result};
use std::ffi::c_void; use std::ffi::{c_char, c_void};
use std::{ffi::CString, ptr}; use std::{ffi::CString, ptr};
pub struct SapiBuilder { pub struct SapiBuilder {
@ -56,6 +56,11 @@ impl SapiBuilder {
} }
} }
pub fn ub_write_function(mut self, func: SapiUbWriteFunc) -> Self {
self.module.ub_write = Some(func);
self
}
/// Sets the send header function for this SAPI /// Sets the send header function for this SAPI
/// ///
/// # Arguments /// # Arguments
@ -81,8 +86,11 @@ impl SapiBuilder {
} }
} }
/// A function to be called when the extension is starting up or shutting down. /// A function to be called when PHP send a header
pub type SapiSendHeaderFunc = pub type SapiSendHeaderFunc =
extern "C" fn(header: *mut sapi_header_struct, server_context: *mut c_void); extern "C" fn(header: *mut sapi_header_struct, server_context: *mut c_void);
/// A function to be called when PHP write to the output buffer
pub type SapiUbWriteFunc = extern "C" fn(str: *const c_char, str_length: usize) -> usize;
extern "C" fn dummy_send_header(_header: *mut sapi_header_struct, _server_context: *mut c_void) {} extern "C" fn dummy_send_header(_header: *mut sapi_header_struct, _server_context: *mut c_void) {}

View File

@ -1,6 +1,8 @@
#![cfg_attr(windows, feature(abi_vectorcall))] #![cfg_attr(windows, feature(abi_vectorcall))]
extern crate ext_php_rs; extern crate ext_php_rs;
#[cfg(feature = "embed")]
use std::ffi::c_char;
#[cfg(feature = "embed")] #[cfg(feature = "embed")]
use ext_php_rs::builders::SapiBuilder; use ext_php_rs::builders::SapiBuilder;
#[cfg(feature = "embed")] #[cfg(feature = "embed")]
@ -14,10 +16,29 @@ use ext_php_rs::prelude::*;
#[cfg(feature = "embed")] #[cfg(feature = "embed")]
use ext_php_rs::zend::try_catch; use ext_php_rs::zend::try_catch;
#[cfg(feature = "embed")]
static mut LAST_OUTPUT: String = String::new();
#[cfg(feature = "embed")]
extern "C" fn output_tester(str: *const c_char, str_length: usize) -> usize {
let char = unsafe { std::slice::from_raw_parts(str as *const u8, str_length) };
let string = String::from_utf8_lossy(char);
println!("{}", string);
unsafe {
LAST_OUTPUT = string.to_string();
};
str_length
}
#[test] #[test]
#[cfg(feature = "embed")] #[cfg(feature = "embed")]
fn test_sapi() { fn test_sapi() {
let builder = SapiBuilder::new("test", "Test"); let mut builder = SapiBuilder::new("test", "Test");
builder = builder.ub_write_function(output_tester);
let sapi = builder.build().unwrap().into_raw(); let sapi = builder.build().unwrap().into_raw();
let module = get_module(); let module = get_module();
@ -50,6 +71,10 @@ fn test_sapi() {
let string = zval.string().unwrap(); let string = zval.string().unwrap();
assert_eq!(string.to_string(), "Hello, foo!"); assert_eq!(string.to_string(), "Hello, foo!");
let result = Embed::eval("var_dump($foo);");
assert!(result.is_ok());
}, },
true, true,
); );
@ -58,6 +83,10 @@ fn test_sapi() {
php_request_shutdown(std::ptr::null_mut()); php_request_shutdown(std::ptr::null_mut());
} }
unsafe {
assert_eq!(LAST_OUTPUT, "string(11) \"Hello, foo!\"\n");
}
unsafe { unsafe {
php_module_shutdown(); php_module_shutdown();
} }