1- use std:: collections:: HashMap ;
2- use std:: sync:: Arc ;
3- use tokio:: sync:: Mutex ;
4-
51use base:: {
6- runner:: ServerContext ,
7- runner:: ServerRunner ,
8- traits:: { LoadConfig , Server as ServerTrait } ,
2+ extract_flow_setting_field,
3+ runner:: { ServerContext , ServerRunner } ,
4+ store:: FlowIdenfiyResult ,
5+ traits:: { IdentifiableFlow , LoadConfig , Server as ServerTrait } ,
96} ;
107use http:: { request:: HttpRequest , response:: HttpResponse , server:: Server } ;
8+ use std:: collections:: HashMap ;
9+ use std:: sync:: Arc ;
1110use tonic:: async_trait;
11+ use tucana:: shared:: ValidationFlow ;
1212
1313#[ tokio:: main]
1414async fn main ( ) {
@@ -27,6 +27,31 @@ struct HttpServer {
2727 http_server : Option < Server > ,
2828}
2929
30+ struct RequestRoute {
31+ url : String ,
32+ }
33+
34+ impl IdentifiableFlow for RequestRoute {
35+ fn identify ( & self , flow : & ValidationFlow ) -> bool {
36+ let url = extract_flow_setting_field ( & flow. settings , "HTTP_URL" , "url" ) ;
37+
38+ let regex_str = match url. as_deref ( ) {
39+ Some ( s) => s,
40+ None => return false ,
41+ } ;
42+
43+ let regex = match regex:: Regex :: new ( regex_str) {
44+ Ok ( regex) => regex,
45+ Err ( err) => {
46+ log:: error!( "Failed to compile regex: {}" , err) ;
47+ return false ;
48+ }
49+ } ;
50+
51+ regex. is_match ( & self . url )
52+ }
53+ }
54+
3055#[ async_trait]
3156impl ServerTrait < HttpServerConfig > for HttpServer {
3257 async fn init ( & mut self , ctx : & ServerContext < HttpServerConfig > ) -> anyhow:: Result < ( ) > {
@@ -35,28 +60,63 @@ impl ServerTrait<HttpServerConfig> for HttpServer {
3560 }
3661
3762 /// The "serve forever" loop.
38- async fn run ( & mut self , _ctx : & ServerContext < HttpServerConfig > ) -> anyhow:: Result < ( ) > {
63+ async fn run ( & mut self , ctx : & ServerContext < HttpServerConfig > ) -> anyhow:: Result < ( ) > {
3964 if let Some ( server) = & mut self . http_server {
40- let counter = Arc :: new ( Mutex :: new ( 0 ) ) ;
65+ println ! ( "Registering async closure handler..." ) ;
4166
4267 server. register_async_closure ( {
43- let counter = Arc :: clone ( & counter ) ;
68+ let store = Arc :: clone ( & ctx . adapter_store ) ;
4469 move |request : HttpRequest | {
45- let counter = Arc :: clone ( & counter ) ;
70+ let store = Arc :: clone ( & store ) ;
4671 async move {
47- let mut number = counter. lock ( ) . await ;
48- * number += 1 ;
72+ println ! ( "Handler called with request: {:?}" , & request) ;
4973
50- println ! ( "Received request: {:?}" , request) ;
74+ let pattern =
75+ format ! ( "*::*::{}::{}" , request. host, request. method. to_string( ) ) ;
76+ println ! ( "Pattern created: {}" , pattern) ;
5177
52- let headers = HashMap :: new ( ) ;
53- Some ( HttpResponse :: ok (
54- format ! ( "Hello from REST server! {}" , number) . into_bytes ( ) ,
55- headers,
56- ) )
78+ let route = RequestRoute {
79+ url : request. path . clone ( ) ,
80+ } ;
81+
82+ println ! ( "About to call get_possible_flow_match..." ) ;
83+ let identification_result =
84+ store. get_possible_flow_match ( pattern, route) . await ;
85+ println ! ( "Flow identification completed" ) ;
86+
87+ match identification_result {
88+ FlowIdenfiyResult :: Single ( _flow) => {
89+ println ! ( "Single flow found, returning success response" ) ;
90+ //TODO: Implement flow execution logic
91+ //let execution_result = ctx
92+ // .adapter_store
93+ // .validate_and_execute_flow(flow, None)
94+ // .await;
95+
96+ let headers = HashMap :: new ( ) ;
97+ let response = Some ( HttpResponse :: ok (
98+ String :: from ( "Flow executed successfully!" ) . into_bytes ( ) ,
99+ headers,
100+ ) ) ;
101+ println ! ( "Returning response: {:?}" , response. is_some( ) ) ;
102+ return response;
103+ }
104+ _ => {
105+ println ! ( "No single flow found, returning default response" ) ;
106+ let headers = HashMap :: new ( ) ;
107+ let response = Some ( HttpResponse :: internal_server_error (
108+ format ! ( "No Flow found for path: {}" , request. path) ,
109+ headers,
110+ ) ) ;
111+ println ! ( "Returning response: {:?}" , response. is_some( ) ) ;
112+ return response;
113+ }
114+ }
57115 }
58116 }
59117 } ) ;
118+
119+ println ! ( "Starting HTTP server..." ) ;
60120 server. start ( ) . await ;
61121 } ;
62122
@@ -65,7 +125,10 @@ impl ServerTrait<HttpServerConfig> for HttpServer {
65125
66126 /// Called on shutdown signal.
67127 async fn shutdown ( & mut self , _ctx : & ServerContext < HttpServerConfig > ) -> anyhow:: Result < ( ) > {
68- todo ! ( "shutdown http server" ) ;
128+ if let Some ( server) = & self . http_server {
129+ server. shutdown ( ) ;
130+ }
131+ Ok ( ( ) )
69132 }
70133}
71134
@@ -76,6 +139,6 @@ struct HttpServerConfig {
76139
77140impl LoadConfig for HttpServerConfig {
78141 fn load ( ) -> Self {
79- HttpServerConfig { port : 8080 }
142+ HttpServerConfig { port : 8081 }
80143 }
81144}
0 commit comments