1- //! Basic example of using ajj with CORS.
1+ //! Basic example of using ajj with CORS via axum .
22//!
33//! This example demonstrates how to set up a simple HTTP server using `axum`
44//! and `tower_http` for CORS support.
1414
1515use axum:: http:: { HeaderValue , Method } ;
1616use eyre:: { ensure, Context } ;
17- use std:: { future :: IntoFuture , net:: SocketAddr } ;
17+ use std:: net:: SocketAddr ;
1818use tower_http:: cors:: { AllowOrigin , Any , CorsLayer } ;
1919
20+ #[ tokio:: main]
21+ async fn main ( ) -> eyre:: Result < ( ) > {
22+ let cors = std:: env:: args ( ) . nth ( 1 ) . unwrap_or ( "*" . to_string ( ) ) ;
23+
24+ let router = make_router ( )
25+ // Convert to an axum router
26+ . into_axum ( "/" )
27+ // And then layer on your CORS settings
28+ . layer ( make_cors ( & cors) ?) ;
29+
30+ // Now we can serve the router on a TCP listener
31+ let addr = SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) ;
32+ let listener = tokio:: net:: TcpListener :: bind ( addr) . await ?;
33+
34+ println ! ( "Listening on {}" , listener. local_addr( ) ?) ;
35+ println ! ( "CORS allowed for: {}" , cors) ;
36+ if cors == "*" {
37+ println ! ( "(specify cors domains as a comma-separated list to restrict origins)" ) ;
38+ }
39+ println ! ( "use Ctrl-C to stop" ) ;
40+ axum:: serve ( listener, router) . await . map_err ( Into :: into)
41+ }
42+
2043fn get_allowed ( cors : & str ) -> eyre:: Result < AllowOrigin > {
2144 // Wildcard `*` means any origin is allowed.
2245 if cors == "*" {
@@ -53,12 +76,10 @@ fn make_cors(cors: &str) -> eyre::Result<CorsLayer> {
5376 . allow_headers ( Any ) )
5477}
5578
56- #[ tokio:: main]
57- async fn main ( ) -> eyre:: Result < ( ) > {
58- let cors = std:: env:: args ( ) . nth ( 1 ) . unwrap_or ( "*" . to_string ( ) ) ;
59-
79+ // Setting up an AJJ router is easy and fun!
80+ fn make_router ( ) -> ajj:: Router < ( ) > {
6081 // Setting up an AJJ router is easy and fun!
61- let router = ajj:: Router :: < ( ) > :: new ( )
82+ ajj:: Router :: < ( ) > :: new ( )
6283 . route ( "helloWorld" , || async {
6384 tracing:: info!( "serving hello world" ) ;
6485 Ok :: < _ , ( ) > ( "Hello, world!" )
@@ -67,15 +88,4 @@ async fn main() -> eyre::Result<()> {
6788 tracing:: info!( "serving addNumbers" ) ;
6889 Ok :: < _ , ( ) > ( a + b)
6990 } )
70- // Convert to an axum router
71- . into_axum ( "/" )
72- // And then layer on your CORS settings
73- . layer ( make_cors ( & cors) ?) ;
74-
75- // Now we can serve the router on a TCP listener
76- let addr = SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) ;
77- let listener = tokio:: net:: TcpListener :: bind ( addr) . await ?;
78-
79- axum:: serve ( listener, router) . into_future ( ) . await ?;
80- Ok ( ( ) )
8191}
0 commit comments