@@ -749,8 +749,8 @@ fn build_asset_proxy_target_url(
749749 Ok ( target_url)
750750}
751751
752- fn asset_path_skips_image_optimizer ( target_url : & url :: Url ) -> bool {
753- let lower_path = target_url . path ( ) . to_ascii_lowercase ( ) ;
752+ fn asset_path_skips_image_optimizer ( path : & str ) -> bool {
753+ let lower_path = path. to_ascii_lowercase ( ) ;
754754 lower_path. ends_with ( ".svg" ) || lower_path. ends_with ( ".svgz" )
755755}
756756
@@ -1028,12 +1028,15 @@ pub async fn handle_asset_proxy_request(
10281028 req : Request < EdgeBody > ,
10291029 route : & ProxyAssetRoute ,
10301030) -> Result < AssetProxyResponse , Report < TrustedServerError > > {
1031+ let incoming_path = req. uri ( ) . path ( ) ;
10311032 let incoming_query = req. uri ( ) . query ( ) . unwrap_or ( "" ) ;
1032- let mut target_url = build_asset_proxy_target_url ( route, req. uri ( ) . path ( ) , incoming_query) ?;
1033- let skip_image_optimizer = asset_path_skips_image_optimizer ( & target_url) ;
1033+ let mut target_url = build_asset_proxy_target_url ( route, incoming_path, incoming_query) ?;
1034+ let skip_image_optimizer = asset_path_skips_image_optimizer ( incoming_path)
1035+ || asset_path_skips_image_optimizer ( target_url. path ( ) ) ;
10341036 let image_optimizer = if skip_image_optimizer {
10351037 log:: debug!(
1036- "Skipping Image Optimizer for unsupported SVG asset path: {}" ,
1038+ "Skipping Image Optimizer for unsupported SVG asset path: incoming={}, target={}" ,
1039+ incoming_path,
10371040 target_url. path( )
10381041 ) ;
10391042 None
@@ -1058,6 +1061,7 @@ pub async fn handle_asset_proxy_request(
10581061 scheme : scheme. to_string ( ) ,
10591062 host : host. to_string ( ) ,
10601063 port : target_url. port ( ) ,
1064+ host_header_override : None ,
10611065 certificate_check : settings. proxy . certificate_check ,
10621066 first_byte_timeout : DEFAULT_FIRST_BYTE_TIMEOUT ,
10631067 } )
@@ -1241,6 +1245,7 @@ async fn proxy_with_redirects(
12411245 scheme : scheme. clone ( ) ,
12421246 host : host. to_string ( ) ,
12431247 port : parsed_url. port ( ) ,
1248+ host_header_override : None ,
12441249 certificate_check : settings. proxy . certificate_check ,
12451250 first_byte_timeout : DEFAULT_FIRST_BYTE_TIMEOUT ,
12461251 } )
@@ -3094,7 +3099,7 @@ mod tests {
30943099 ] {
30953100 let target_url = url:: Url :: parse ( url) . expect ( "should parse target URL" ) ;
30963101 assert ! (
3097- asset_path_skips_image_optimizer( & target_url) ,
3102+ asset_path_skips_image_optimizer( target_url. path ( ) ) ,
30983103 "should skip Image Optimizer for {url}"
30993104 ) ;
31003105 }
@@ -3109,7 +3114,7 @@ mod tests {
31093114 ] {
31103115 let target_url = url:: Url :: parse ( url) . expect ( "should parse target URL" ) ;
31113116 assert ! (
3112- !asset_path_skips_image_optimizer( & target_url) ,
3117+ !asset_path_skips_image_optimizer( target_url. path ( ) ) ,
31133118 "should allow Image Optimizer for {url}"
31143119 ) ;
31153120 }
@@ -3662,6 +3667,49 @@ mod tests {
36623667 ) ;
36633668 }
36643669
3670+ #[ tokio:: test]
3671+ async fn handle_asset_proxy_request_skips_image_optimizer_for_incoming_svg ( ) {
3672+ let stub = Arc :: new ( StubHttpClient :: new ( ) ) ;
3673+ stub. push_response ( 200 , b"ok" . to_vec ( ) ) ;
3674+ let services = build_services_with_http_client (
3675+ Arc :: clone ( & stub) as Arc < dyn crate :: platform:: PlatformHttpClient >
3676+ ) ;
3677+ let mut settings = create_test_settings ( ) ;
3678+ let mut profile_set = test_profile_set ( ) ;
3679+ profile_set. unknown_profile = UnknownProfilePolicy :: Reject ;
3680+ settings. image_optimizer = ImageOptimizerSettings {
3681+ profile_sets : HashMap :: from ( [ ( "default_images" . to_string ( ) , profile_set) ] ) ,
3682+ } ;
3683+ let req = build_http_request (
3684+ Method :: GET ,
3685+ "https://www.example.com/.image/object-id/logo.svg?profile=unknown&ar=1-1" ,
3686+ ) ;
3687+ let mut route = ProxyAssetRoute :: new ( "/.image/" , "https://assets.example.com" ) ;
3688+ route. path_pattern = Some ( r"^/\.image/([^/]+)/[^/]+\.([^/.]+)$" . to_string ( ) ) ;
3689+ route. target_path = Some ( "/image/upload/$1" . to_string ( ) ) ;
3690+ route. image_optimizer = Some ( AssetImageOptimizerConfig {
3691+ enabled : true ,
3692+ region : "us_east" . to_string ( ) ,
3693+ profile_set : "default_images" . to_string ( ) ,
3694+ origin_query : None ,
3695+ } ) ;
3696+
3697+ handle_asset_proxy_request ( & settings, & services, req, & route)
3698+ . await
3699+ . expect ( "should proxy incoming SVG asset without Image Optimizer profile parsing" ) ;
3700+
3701+ assert_eq ! (
3702+ stub. recorded_request_uris( ) ,
3703+ vec![ "https://assets.example.com/image/upload/object-id" ] ,
3704+ "should strip profile-table query even when SVG target path omits extension"
3705+ ) ;
3706+ assert_eq ! (
3707+ stub. recorded_image_optimizer_options( ) ,
3708+ vec![ None ] ,
3709+ "incoming SVG assets should bypass Image Optimizer metadata"
3710+ ) ;
3711+ }
3712+
36653713 #[ tokio:: test]
36663714 async fn handle_asset_proxy_request_skips_s3_preflight_for_svg_image_optimizer_routes ( ) {
36673715 let stub = Arc :: new ( StubHttpClient :: new ( ) ) ;
0 commit comments