88// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
99// See the Mulan PSL v2 for more details.
1010
11- use crate :: { errors:: HttpServerError , request:: new_request_object , response:: new_response_object } ;
11+ use crate :: { errors:: HttpServerError , request:: RequestClass , response:: ResponseClass } ;
1212use axum:: {
1313 body:: { self , Body } ,
1414 http:: { Request , Response , StatusCode } ,
@@ -31,10 +31,14 @@ const HTTP_SERVER_CLASS_NAME: &str = "HttpServer\\HttpServer";
3131thread_local ! {
3232 // The map store the on request handlers, indexed by `HttpServer\HttpServer` object id.
3333 static ON_REQUEST_HANDLERS : RefCell <HashMap <u32 , ZVal >> = Default :: default ( ) ;
34+
35+ static CLASSES_MAP : RefCell <HashMap <u32 , ( RequestClass , ResponseClass ) >> = Default :: default ( ) ;
3436}
3537
3638/// Register the class `HttpServer\HttpServer` by `ClassEntity`.
37- pub fn make_server_class ( ) -> ClassEntity < ( ) > {
39+ pub fn make_server_class (
40+ request_class : RequestClass , response_class : ResponseClass ,
41+ ) -> ClassEntity < ( ) > {
3842 let mut class = ClassEntity :: new ( HTTP_SERVER_CLASS_NAME ) ;
3943
4044 // Register the server host field with public visibility.
@@ -46,13 +50,21 @@ pub fn make_server_class() -> ClassEntity<()> {
4650 // Register the constructor method with public visibility, accept host and port
4751 // arguments, initialize the host and port member properties.
4852 class
49- . add_method ( "__construct" , Visibility :: Public , |this, arguments| {
53+ . add_method ( "__construct" , Visibility :: Public , move |this, arguments| {
5054 let host = arguments[ 0 ] . expect_z_str ( ) ?;
5155 let port = arguments[ 1 ] . expect_long ( ) ?;
5256
5357 this. set_property ( "host" , host. to_owned ( ) ) ;
5458 this. set_property ( "port" , port) ;
5559
60+ let ( request_class, response_class) = ( request_class. clone ( ) , response_class. clone ( ) ) ;
61+
62+ CLASSES_MAP . with ( move |classes_map| {
63+ classes_map
64+ . borrow_mut ( )
65+ . insert ( this. handle ( ) , ( request_class, response_class) ) ;
66+ } ) ;
67+
5668 Ok :: < _ , phper:: Error > ( ( ) )
5769 } )
5870 . arguments ( [ Argument :: by_val ( "host" ) , Argument :: by_val ( "port" ) ] ) ;
@@ -98,40 +110,44 @@ pub fn make_server_class() -> ClassEntity<()> {
98110 . await
99111 . map_err ( HttpServerError :: new) ?;
100112
101- // Create PHP `HttpServer\HttpRequest` object.
102- let mut request = new_request_object ( ) ?;
113+ CLASSES_MAP . with ( |classes_map| {
114+ let ( request_class, response_class) = & classes_map. borrow ( ) [ & handle] ;
115+
116+ // Create PHP `HttpServer\HttpRequest` object.
117+ let mut request = request_class. new_object ( [ ] ) ?;
103118
104- // Inject headers from Rust request object to PHP request object.
105- let request_headers =
106- request. get_mut_property ( "headers" ) . expect_mut_z_arr ( ) ?;
107- for ( key, value) in parts. headers {
108- if let Some ( key) = key {
109- request_headers. insert ( key. as_str ( ) , value. as_bytes ( ) ) ;
119+ // Inject headers from Rust request object to PHP request object.
120+ let request_headers =
121+ request. get_mut_property ( "headers" ) . expect_mut_z_arr ( ) ?;
122+ for ( key, value) in parts. headers {
123+ if let Some ( key) = key {
124+ request_headers. insert ( key. as_str ( ) , value. as_bytes ( ) ) ;
125+ }
110126 }
111- }
112127
113- // Inject body content from Rust request object to PHP request object.
114- request. set_property ( "data" , & * body) ;
128+ // Inject body content from Rust request object to PHP request object.
129+ request. set_property ( "data" , & * body) ;
115130
116- let request_val = ZVal :: from ( request) ;
131+ let request_val = ZVal :: from ( request) ;
117132
118- // Create PHP `HttpServer\HttpResponse` object.
119- let mut response = new_response_object ( ) ?;
133+ // Create PHP `HttpServer\HttpResponse` object.
134+ let mut response = response_class . new_object ( [ ] ) ?;
120135
121- let response_val = ZVal :: from ( response. to_ref_owned ( ) ) ;
136+ let response_val = ZVal :: from ( response. to_ref_owned ( ) ) ;
122137
123- ON_REQUEST_HANDLERS . with ( |handlers| {
124- // Get the on request handlers by object id.
125- let mut handlers = handlers. borrow_mut ( ) ;
126- let handler = handlers. get_mut ( & handle) . unwrap ( ) ;
138+ ON_REQUEST_HANDLERS . with ( |handlers| {
139+ // Get the on request handlers by object id.
140+ let mut handlers = handlers. borrow_mut ( ) ;
141+ let handler = handlers. get_mut ( & handle) . unwrap ( ) ;
127142
128- // Call the PHP on request handler.
129- handler. call ( [ request_val, response_val] ) ?;
143+ // Call the PHP on request handler.
144+ handler. call ( [ request_val, response_val] ) ?;
130145
131- // Get the inner state.
132- let response = response. into_state ( ) . unwrap ( ) ;
146+ // Get the inner state.
147+ let response = response. into_state ( ) . unwrap ( ) ;
133148
134- Ok :: < Response < Body > , phper:: Error > ( response)
149+ Ok :: < Response < Body > , phper:: Error > ( response)
150+ } )
135151 } )
136152 } ;
137153 match fut. await {
0 commit comments