1
- fn main ( ) {
2
- println ! ( "Hello, world!" ) ;
1
+ //! Run with
2
+ //!
3
+ //! ```not_rust
4
+ //! cargo run -p rust-example
5
+ //! ```
6
+
7
+ use std:: net:: SocketAddr ;
8
+
9
+ use axum:: {
10
+ extract:: { connect_info:: ConnectInfo , ws:: WebSocketUpgrade } ,
11
+ response:: { Html , IntoResponse } ,
12
+ routing:: get,
13
+ Router
14
+ } ;
15
+ use axum_extra:: TypedHeader ;
16
+ use headers:: UserAgent ;
17
+ use tower_http:: trace:: TraceLayer ;
18
+ use tracing_subscriber:: { layer:: SubscriberExt , util:: SubscriberInitExt } ;
19
+
20
+ mod api;
21
+
22
+ #[ tokio:: main]
23
+ async fn main ( ) {
24
+ tracing_subscriber:: registry ( )
25
+ . with (
26
+ tracing_subscriber:: EnvFilter :: try_from_default_env ( )
27
+ . unwrap_or_else ( |_| format ! ( "{}=debug,tower_http=debug,axum::rejection=trace" , env!( "CARGO_CRATE_NAME" ) ) . into ( ) ) ,
28
+ )
29
+ . with ( tracing_subscriber:: fmt:: layer ( ) )
30
+ . init ( ) ;
31
+
32
+ tracing:: info!( "Starting server..." ) ;
33
+
34
+ // build our application with a route
35
+ let app = Router :: new ( )
36
+ . route ( "/" , get ( handler) )
37
+ . route ( "/ws" , get ( ws_handler) )
38
+ . layer ( TraceLayer :: new_for_http ( ) ) ;
39
+
40
+ // run it
41
+ let listener = tokio:: net:: TcpListener :: bind ( "0.0.0.0:3000" )
42
+ . await
43
+ . unwrap ( ) ;
44
+
45
+ tracing:: info!( "listening on {} - http://localhost:{}/" , listener. local_addr( ) . unwrap( ) , listener. local_addr( ) . unwrap( ) . port( ) ) ;
46
+ axum:: serve (
47
+ listener,
48
+ app. into_make_service_with_connect_info :: < SocketAddr > ( )
49
+ ) . await . unwrap ( ) ;
3
50
}
51
+
52
+ async fn ws_handler (
53
+ ws : WebSocketUpgrade ,
54
+ user_agent : Option < TypedHeader < UserAgent > > ,
55
+ ConnectInfo ( addr) : ConnectInfo < SocketAddr >
56
+ ) -> impl IntoResponse {
57
+ let user_agent = if let Some ( TypedHeader ( user_agent) ) = user_agent {
58
+ user_agent. to_string ( )
59
+ } else {
60
+ "unknown" . to_string ( )
61
+ } ;
62
+
63
+ tracing:: debug!( "WebSocket connection from {} with user agent: {}" , addr, user_agent) ;
64
+
65
+ ws. on_upgrade ( move |socket| async move {
66
+ tracing:: debug!( "WebSocket connection established, from: {}" , addr) ;
67
+ // handle the WebSocket connection
68
+
69
+ // Wait a second.
70
+ tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) . await ;
71
+
72
+ // Close the socket, we don't need it!
73
+ socket. close ( ) . await . unwrap ( ) ;
74
+ } )
75
+ }
76
+
77
+ async fn handler ( ) -> Html < & ' static str > {
78
+ Html ( "<h1>Hello, World!</h1>" )
79
+ }
0 commit comments