1- use crate :: errors:: HttpServerError ;
1+ use crate :: {
2+ errors:: HttpServerError , request:: HTTP_REQUEST_CLASS_NAME , response:: HTTP_RESPONSE_CLASS_NAME ,
3+ utils:: replace_and_get,
4+ } ;
25use hyper:: {
36 server:: { conn:: AddrIncoming , Builder } ,
47 service:: { make_service_fn, service_fn} ,
58 Body , Request , Response , Server ,
69} ;
710use phper:: {
8- classes:: { DynamicClass , Visibility } ,
11+ classes:: { ClassEntry , DynamicClass , StatelessClassEntry , Visibility } ,
912 functions:: Argument ,
1013 values:: Val ,
1114} ;
12- use std:: { convert:: Infallible , mem:: replace, net:: SocketAddr } ;
13- use tokio:: runtime:: Handle ;
15+ use std:: { convert:: Infallible , mem:: replace, net:: SocketAddr , sync :: Arc } ;
16+ use tokio:: { runtime:: Handle , sync :: Mutex } ;
1417
1518const HTTP_SERVER_CLASS_NAME : & ' static str = "HttpServer\\ HttpServer" ;
1619
@@ -52,9 +55,45 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
5255 Visibility :: Public ,
5356 |this, _| {
5457 let builder = replace ( this. as_mut_state ( ) , None ) . unwrap ( ) ;
58+ let handle = this
59+ . duplicate_property ( "onRequestHandle" )
60+ . map_err ( phper:: Error :: NotRefCountedType ) ?;
61+ let handle = Arc :: new ( Mutex :: new ( handle) ) ;
62+
63+ let make_svc = make_service_fn ( move |_conn| {
64+ let handle = handle. clone ( ) ;
65+
66+ async move {
67+ Ok :: < _ , Infallible > ( service_fn ( move |_: Request < Body > | {
68+ let handle = handle. clone ( ) ;
69+ async move {
70+ let handle = handle. lock ( ) . await ;
5571
56- let make_svc =
57- make_service_fn ( |_conn| async { Ok :: < _ , Infallible > ( service_fn ( handle) ) } ) ;
72+ let request =
73+ StatelessClassEntry :: from_globals ( HTTP_REQUEST_CLASS_NAME )
74+ . unwrap ( )
75+ . new_object ( [ ] )
76+ . unwrap ( ) ;
77+ let request = Val :: new ( request) ;
78+ let mut response = ClassEntry :: < Response < Body > > :: from_globals (
79+ HTTP_RESPONSE_CLASS_NAME ,
80+ )
81+ . unwrap ( )
82+ . new_object ( [ ] )
83+ . unwrap ( ) ;
84+ let response_val = response. duplicate ( ) ;
85+ let response_val = Val :: new ( response_val) ;
86+ handle
87+ . call ( [ request, response_val] )
88+ . map_err ( phper:: Error :: CallFunction )
89+ . unwrap ( ) ;
90+
91+ let response = replace_and_get ( response. as_mut_state ( ) ) ;
92+ Ok :: < Response < Body > , Infallible > ( response)
93+ }
94+ } ) )
95+ }
96+ } ) ;
5897
5998 let server = builder. serve ( make_svc) ;
6099 Handle :: current ( ) . block_on ( server) ?;
@@ -66,7 +105,3 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
66105
67106 class
68107}
69-
70- async fn handle ( _: Request < Body > ) -> Result < Response < Body > , Infallible > {
71- Ok ( Response :: new ( "Hello, World!" . into ( ) ) )
72- }
0 commit comments