11use crate :: render:: { HeaderContext , PageContext , RenderContext } ;
22use crate :: webserver:: database:: { stream_query_results, DbItem } ;
3- use crate :: { AppState , Config , ParsedSqlFile , CONFIG_DIR } ;
4- use actix_web:: dev:: { ServiceFactory , ServiceRequest } ;
3+ use crate :: { AppState , Config , ParsedSqlFile } ;
4+ use actix_web:: dev:: { fn_service , ServiceFactory , ServiceRequest } ;
55use actix_web:: error:: ErrorInternalServerError ;
6- use actix_web:: http:: header:: { CacheControl , CacheDirective } ;
6+ use actix_web:: http:: header:: { CacheControl , CacheDirective , ContentType } ;
77use actix_web:: web:: Form ;
88use actix_web:: {
9- dev:: Service , dev :: ServiceResponse , middleware, middleware:: Logger , web, web:: Bytes , App ,
10- FromRequest , HttpResponse , HttpServer , Responder ,
9+ dev:: ServiceResponse , middleware, middleware:: Logger , web, web:: Bytes , App , FromRequest ,
10+ HttpResponse , HttpServer , Responder ,
1111} ;
1212
1313use crate :: utils:: log_error;
@@ -19,7 +19,7 @@ use std::collections::HashMap;
1919use std:: io:: Write ;
2020use std:: mem;
2121use std:: net:: IpAddr ;
22- use std:: path:: { Component , PathBuf } ;
22+ use std:: path:: PathBuf ;
2323use std:: pin:: Pin ;
2424use std:: sync:: Arc ;
2525use tokio:: sync:: mpsc;
@@ -348,6 +348,38 @@ async fn handle_static_js() -> impl Responder {
348348 . body ( & include_bytes ! ( "../../sqlpage/sqlpage.js" ) [ ..] )
349349}
350350
351+ async fn serve_file ( path : & str , state : & AppState ) -> actix_web:: Result < HttpResponse > {
352+ let path = path. strip_prefix ( '/' ) . unwrap_or ( path) ;
353+ state
354+ . file_system
355+ . read_file ( state, path. as_ref ( ) )
356+ . await
357+ . map_err ( actix_web:: error:: ErrorBadRequest )
358+ . map ( |b| {
359+ HttpResponse :: Ok ( )
360+ . insert_header (
361+ mime_guess:: from_path ( path)
362+ . first ( )
363+ . map ( ContentType )
364+ . unwrap_or ( ContentType :: octet_stream ( ) ) ,
365+ )
366+ . body ( b)
367+ } )
368+ }
369+
370+ async fn main_handler ( mut service_request : ServiceRequest ) -> actix_web:: Result < ServiceResponse > {
371+ let path = service_request. path ( ) ;
372+ let sql_file_path = path_to_sql_file ( path) ;
373+ if let Some ( sql_path) = sql_file_path {
374+ process_sql_request ( service_request, sql_path) . await
375+ } else {
376+ let app_state = service_request. extract :: < web:: Data < AppState > > ( ) . await ?;
377+ let path = service_request. path ( ) ;
378+ let response = serve_file ( path, & app_state) . await ?;
379+ Ok ( service_request. into_response ( response) )
380+ }
381+ }
382+
351383pub fn create_app (
352384 app_state : web:: Data < AppState > ,
353385) -> App <
@@ -360,32 +392,19 @@ pub fn create_app(
360392 > ,
361393> {
362394 App :: new ( )
363- . route ( "sqlpage.js" , web:: get ( ) . to ( handle_static_js) )
364- . wrap_fn ( |req, srv| {
365- let sql_file_path = path_to_sql_file ( req. path ( ) ) ;
366- let sql_file = if let Some ( sql_path) = sql_file_path {
367- Ok ( ( req, sql_path) )
368- } else {
369- Err ( srv. call ( req) )
370- } ;
371- async move {
372- match sql_file {
373- Ok ( ( req, sql_path) ) => process_sql_request ( req, sql_path) . await ,
374- Err ( fallback) => fallback. await
375- }
376- }
377- } )
378- . default_service (
379- actix_files:: Files :: new ( "/" , & app_state. web_root )
380- . path_filter ( |path, _|
381- !matches ! ( path. components( ) . next( ) , Some ( Component :: Normal ( x) ) if x == CONFIG_DIR ) )
382- . show_files_listing ( )
383- . use_last_modified ( true ) ,
384- )
385- . wrap ( Logger :: default ( ) )
386- . wrap ( middleware:: DefaultHeaders :: new ( )
387- . add ( ( "Server" , format ! ( "{} v{}" , env!( "CARGO_PKG_NAME" ) , env!( "CARGO_PKG_VERSION" ) ) ) )
388- . add ( ( "Content-Security-Policy" , "script-src 'self' https://cdn.jsdelivr.net" ) )
395+ . route ( "sqlpage.js" , web:: get ( ) . to ( handle_static_js) )
396+ . default_service ( fn_service ( main_handler) )
397+ . wrap ( Logger :: default ( ) )
398+ . wrap (
399+ middleware:: DefaultHeaders :: new ( )
400+ . add ( (
401+ "Server" ,
402+ format ! ( "{} v{}" , env!( "CARGO_PKG_NAME" ) , env!( "CARGO_PKG_VERSION" ) ) ,
403+ ) )
404+ . add ( (
405+ "Content-Security-Policy" ,
406+ "script-src 'self' https://cdn.jsdelivr.net" ,
407+ ) ) ,
389408 )
390409 . wrap ( middleware:: Compress :: default ( ) )
391410 . app_data ( app_state)
0 commit comments