@@ -563,6 +563,22 @@ fn main() {
563563 . unwrap_or_else ( || std:: path:: PathBuf :: from ( "./cache/webview" ) ) ;
564564 let _ = std:: fs:: create_dir_all ( & webview_data_dir) ;
565565
566+ fn resp ( status : u16 , headers : & [ ( & str , & str ) ] , body : Vec < u8 > ) -> http:: Response < std:: borrow:: Cow < ' static , [ u8 ] > > {
567+ let mut b = http:: Response :: builder ( ) . status ( status) ;
568+ b = b. header ( "Access-Control-Allow-Origin" , "*" ) ;
569+ for ( k, v) in headers {
570+ b = b. header ( * k, * v) ;
571+ }
572+ b. body ( std:: borrow:: Cow :: from ( body) )
573+ . unwrap_or_else ( |_| {
574+ http:: Response :: builder ( )
575+ . status ( 500 )
576+ . header ( "Access-Control-Allow-Origin" , "*" )
577+ . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
578+ . expect ( "static fallback response" )
579+ } )
580+ }
581+
566582 let config = dioxus:: desktop:: Config :: new ( )
567583 . with_custom_head (
568584 "<style>html,body{background:#000;margin:0;padding:0}body{opacity:0}</style>"
@@ -597,12 +613,11 @@ fn main() {
597613 let high_quality = query. split ( '&' ) . any ( |kv| kv == "hq=1" ) ;
598614
599615 if file_path. is_empty ( ) {
600- responder. respond (
601- http:: Response :: builder ( )
602- . status ( 400 )
603- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
604- . unwrap ( ) ,
605- ) ;
616+ responder. respond ( resp (
617+ 400 ,
618+ & [ ] ,
619+ Vec :: new ( ) ,
620+ ) ) ;
606621 return ;
607622 }
608623
@@ -625,16 +640,13 @@ fn main() {
625640 if hq_path. exists ( )
626641 && let Ok ( b) = tokio:: fs:: read ( & hq_path) . await
627642 {
628- responder. respond (
629- http:: Response :: builder ( )
630- . header ( "Content-Type" , "image/jpeg" )
631- . header ( "Access-Control-Allow-Origin" , "*" )
632- . header ( "Cache-Control" , "public, max-age=31536000" )
633- . body ( std:: borrow:: Cow :: from ( b) )
634- . unwrap ( ) ,
635- ) ;
636- return ;
637- }
643+ responder. respond ( resp (
644+ 200 ,
645+ & [ ( "Content-Type" , "image/jpeg" ) , ( "Cache-Control" , "public, max-age=31536000" ) ] ,
646+ b,
647+ ) ) ;
648+ return ;
649+ }
638650 match tokio:: fs:: read ( & file_path) . await {
639651 Ok ( raw) => {
640652 let file_path_clone = file_path. clone ( ) ;
@@ -653,31 +665,23 @@ fn main() {
653665 } )
654666 . await ;
655667 match result {
656- Ok ( ( bytes, mime) ) => responder. respond (
657- http:: Response :: builder ( )
658- . header ( "Content-Type" , mime)
659- . header ( "Access-Control-Allow-Origin" , "*" )
660- . header (
661- "Cache-Control" ,
662- "public, max-age=31536000" ,
663- )
664- . body ( std:: borrow:: Cow :: from ( bytes) )
665- . unwrap ( ) ,
666- ) ,
667- Err ( _) => responder. respond (
668- http:: Response :: builder ( )
669- . status ( 500 )
670- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
671- . unwrap ( ) ,
672- ) ,
668+ Ok ( ( bytes, mime) ) => responder. respond ( resp (
669+ 200 ,
670+ & [ ( "Content-Type" , mime) , ( "Cache-Control" , "public, max-age=31536000" ) ] ,
671+ bytes,
672+ ) ) ,
673+ Err ( _) => responder. respond ( resp (
674+ 500 ,
675+ & [ ] ,
676+ Vec :: new ( ) ,
677+ ) ) ,
673678 }
674679 }
675- Err ( _) => responder. respond (
676- http:: Response :: builder ( )
677- . status ( 404 )
678- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
679- . unwrap ( ) ,
680- ) ,
680+ Err ( _) => responder. respond ( resp (
681+ 404 ,
682+ & [ ] ,
683+ Vec :: new ( ) ,
684+ ) ) ,
681685 }
682686 return ;
683687 }
@@ -699,12 +703,11 @@ fn main() {
699703 } ,
700704 ) ,
701705 Err ( _) => {
702- responder. respond (
703- http:: Response :: builder ( )
704- . status ( 404 )
705- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
706- . unwrap ( ) ,
707- ) ;
706+ responder. respond ( resp (
707+ 404 ,
708+ & [ ] ,
709+ Vec :: new ( ) ,
710+ ) ) ;
708711 return ;
709712 }
710713 }
@@ -732,37 +735,32 @@ fn main() {
732735 } ,
733736 ) ,
734737 Err ( _) => {
735- responder. respond (
736- http:: Response :: builder ( )
737- . status ( 500 )
738- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
739- . unwrap ( ) ,
740- ) ;
738+ responder. respond ( resp (
739+ 500 ,
740+ & [ ] ,
741+ Vec :: new ( ) ,
742+ ) ) ;
741743 return ;
742744 }
743745 }
744746 }
745747 Err ( e) => {
746748 tracing:: warn!( "[artwork] not found {}: {}" , file_path, e) ;
747- responder. respond (
748- http:: Response :: builder ( )
749- . status ( 404 )
750- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
751- . unwrap ( ) ,
752- ) ;
749+ responder. respond ( resp (
750+ 404 ,
751+ & [ ] ,
752+ Vec :: new ( ) ,
753+ ) ) ;
753754 return ;
754755 }
755756 }
756757 } ;
757758
758- responder. respond (
759- http:: Response :: builder ( )
760- . header ( "Content-Type" , mime)
761- . header ( "Access-Control-Allow-Origin" , "*" )
762- . header ( "Cache-Control" , "public, max-age=31536000" )
763- . body ( std:: borrow:: Cow :: from ( bytes) )
764- . unwrap ( ) ,
765- ) ;
759+ responder. respond ( resp (
760+ 200 ,
761+ & [ ( "Content-Type" , mime) , ( "Cache-Control" , "public, max-age=31536000" ) ] ,
762+ bytes,
763+ ) ) ;
766764 }
767765 . instrument ( tracing:: info_span!( "artwork.serve" ) ) ,
768766 ) ;
@@ -829,23 +827,33 @@ fn main() {
829827 }
830828 } ) ;
831829
830+ fn err_resp ( status : u16 ) -> http:: Response < std:: borrow:: Cow < ' static , [ u8 ] > > {
831+ http:: Response :: builder ( )
832+ . status ( status)
833+ . header ( "Access-Control-Allow-Origin" , "*" )
834+ . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
835+ . unwrap_or_else ( |_| {
836+ http:: Response :: builder ( )
837+ . status ( 500 )
838+ . header ( "Access-Control-Allow-Origin" , "*" )
839+ . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
840+ . expect ( "static fallback response" )
841+ } )
842+ }
843+
832844 match read_result {
833845 Ok ( bytes) => http:: Response :: builder ( )
834846 . header ( "Content-Type" , mime)
835847 . header ( "Access-Control-Allow-Origin" , "*" )
836848 . body ( std:: borrow:: Cow :: from ( bytes) )
837- . unwrap ( ) ,
849+ . unwrap_or_else ( |_| err_resp ( 500 ) ) ,
838850 Err ( e) => {
839851 let status = if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
840852 404
841853 } else {
842854 500
843855 } ;
844- http:: Response :: builder ( )
845- . status ( status)
846- . header ( "Access-Control-Allow-Origin" , "*" )
847- . body ( std:: borrow:: Cow :: from ( Vec :: new ( ) ) )
848- . unwrap ( )
856+ err_resp ( status)
849857 }
850858 }
851859 } ) ;
0 commit comments