@@ -23,7 +23,7 @@ use tokio::task::JoinHandle;
2323use crossbeam_channel;
2424
2525use hyper:: service:: service_fn;
26- use hyper:: { Error , Request as HyperRequest , Response as HyperResponse , StatusCode , Method , header :: HeaderMap } ;
26+ use hyper:: { Error , Request as HyperRequest , Response as HyperResponse , StatusCode } ;
2727use hyper:: body:: Incoming ;
2828use hyper_util:: rt:: TokioIo ;
2929use hyper_util:: server:: conn:: auto;
@@ -35,6 +35,9 @@ use log::{debug, info, warn};
3535
3636use env_logger;
3737use crate :: response:: BodyWithTrailers ;
38+ use std:: sync:: Once ;
39+
40+ static LOGGER_INIT : Once = Once :: new ( ) ;
3841
3942#[ global_allocator]
4043static GLOBAL : Jemalloc = Jemalloc ;
@@ -43,13 +46,15 @@ static GLOBAL: Jemalloc = Jemalloc;
4346struct ServerConfig {
4447 bind_address : String ,
4548 tokio_threads : Option < usize > ,
49+ debug : bool ,
4650}
4751
4852impl ServerConfig {
4953 fn new ( ) -> Self {
5054 Self {
5155 bind_address : String :: from ( "127.0.0.1:3000" ) ,
5256 tokio_threads : None ,
57+ debug : false ,
5358 }
5459 }
5560}
@@ -92,6 +97,19 @@ impl Server {
9297 server_config. tokio_threads = Some ( usize:: try_convert ( tokio_threads) ?) ;
9398 }
9499
100+ if let Some ( debug) = config. get ( magnus:: Symbol :: new ( "debug" ) ) {
101+ server_config. debug = bool:: try_convert ( debug) ?;
102+ }
103+
104+ // Initialize logging if debug is enabled, but only do it once
105+ if server_config. debug {
106+ LOGGER_INIT . call_once ( || {
107+ env_logger:: Builder :: from_env ( env_logger:: Env :: default ( ) . default_filter_or ( "hyper=debug,h2=debug" ) )
108+ . write_style ( env_logger:: WriteStyle :: Always )
109+ . init ( ) ;
110+ } ) ;
111+ }
112+
95113 Ok ( ( ) )
96114 }
97115
@@ -116,26 +134,26 @@ impl Server {
116134 Ok ( work_request) => {
117135 let hyper_request = work_request. request ;
118136
119- println ! ( "\n Processing request:" ) ;
120- println ! ( " Method: {}" , hyper_request. method( ) ) ;
121- println ! ( " Path: {}" , hyper_request. uri( ) . path( ) ) ;
122- println ! ( " Headers: {:?}" , hyper_request. headers( ) ) ;
137+ debug ! ( "Processing request:" ) ;
138+ debug ! ( " Method: {}" , hyper_request. method( ) ) ;
139+ debug ! ( " Path: {}" , hyper_request. uri( ) . path( ) ) ;
140+ debug ! ( " Headers: {:?}" , hyper_request. headers( ) ) ;
123141
124142 // Convert to appropriate request type
125143 let value = if grpc:: is_grpc_request ( & hyper_request) {
126- println ! ( "Request identified as gRPC" ) ;
144+ debug ! ( "Request identified as gRPC" ) ;
127145 if let Some ( grpc_request) = GrpcRequest :: new ( hyper_request) {
128146 grpc_request. into_value ( )
129147 } else {
130- println ! ( "Failed to create GrpcRequest" ) ;
148+ warn ! ( "Failed to create GrpcRequest" ) ;
131149 // Invalid gRPC request path
132150 let response = GrpcResponse :: error ( 3_u32 . into_value ( ) , RString :: new ( "Invalid gRPC request path" ) ) . unwrap ( )
133151 . into_hyper_response ( ) ;
134- work_request. response_tx . send ( response) . unwrap_or_else ( |e| println ! ( "Failed to send response: {:?}" , e) ) ;
152+ work_request. response_tx . send ( response) . unwrap_or_else ( |e| warn ! ( "Failed to send response: {:?}" , e) ) ;
135153 continue ;
136154 }
137155 } else {
138- println ! ( "Request identified as HTTP" ) ;
156+ debug ! ( "Request identified as HTTP" ) ;
139157 Request :: new ( hyper_request) . into_value ( )
140158 } ;
141159
@@ -147,19 +165,19 @@ impl Server {
147165 } else if let Ok ( http_response) = Obj :: < Response > :: try_convert ( result) {
148166 ( * http_response) . clone ( ) . into_hyper_response ( )
149167 } else {
150- println ! ( "Block returned invalid response type" ) ;
168+ warn ! ( "Block returned invalid response type" ) ;
151169 create_error_response ( "Internal server error" )
152170 }
153171 } ,
154172 Err ( e) => {
155- println ! ( "Block call failed: {:?}" , e) ;
173+ warn ! ( "Block call failed: {:?}" , e) ;
156174 create_error_response ( "Internal server error" )
157175 }
158176 } ;
159177
160178 match work_request. response_tx . send ( hyper_response) {
161179 Ok ( _) => ( ) ,
162- Err ( e) => println ! ( "Failed to send response: {:?}" , e) ,
180+ Err ( e) => warn ! ( "Failed to send response: {:?}" , e) ,
163181 }
164182 }
165183 Err ( _) => {
@@ -253,7 +271,7 @@ impl Server {
253271 if bind_address. starts_with ( "unix:" ) {
254272 let path = bind_address. trim_start_matches ( "unix:" ) ;
255273 std:: fs:: remove_file ( path) . unwrap_or_else ( |e| {
256- println ! ( "Failed to remove socket file: {:?}" , e) ;
274+ warn ! ( "Failed to remove socket file: {:?}" , e) ;
257275 } ) ;
258276 }
259277
@@ -349,20 +367,13 @@ fn create_error_response(error_message: &str) -> HyperResponse<BodyWithTrailers>
349367 let builder = HyperResponse :: builder ( )
350368 . status ( StatusCode :: INTERNAL_SERVER_ERROR )
351369 . header ( "content-type" , "text/plain" ) ;
352-
353- let trailers = HeaderMap :: new ( ) ;
354370
355- builder. body ( BodyWithTrailers :: new ( Bytes :: from ( error_message. to_string ( ) ) , trailers ) )
371+ builder. body ( BodyWithTrailers :: new ( Bytes :: from ( error_message. to_string ( ) ) , None ) )
356372 . unwrap ( )
357373}
358374
359375#[ magnus:: init]
360376fn init ( ruby : & Ruby ) -> Result < ( ) , MagnusError > {
361- // Initialize logging
362- env_logger:: Builder :: from_env ( env_logger:: Env :: default ( ) . default_filter_or ( "hyper=debug,h2=debug" ) )
363- . write_style ( env_logger:: WriteStyle :: Always )
364- . init ( ) ;
365-
366377 let module = ruby. define_module ( "HyperRuby" ) ?;
367378
368379 let server_class = module. define_class ( "Server" , ruby. class_object ( ) ) ?;
0 commit comments