Skip to content

Commit c8378ef

Browse files
committed
fix: move WebP conversion to run after tile validation
- added `validation_enabled` in `fetch_with_lock` and enforced flow: `fetch_http` -> `VipsTileValidator.validate` -> `convert_to_webp` -> `save_tile_to_db` - in the no-validation branch (`validation.enabled=false`), WebP conversion is now executed before saving, with `record_miss` on `webp_conversion_error` - removed inline WebP conversion from `fetch_http` (including downsample path); the method now returns fetched/processed data without final encoding - preserved existing PNG/LERC/downsample behavior; only the final WebP conversion order relative to validation was changed
1 parent 7d28f02 commit c8378ef

1 file changed

Lines changed: 25 additions & 15 deletions

File tree

src/config.ru

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -442,16 +442,27 @@ helpers do
442442
tile = get_cached_tile(route, z, x, tms)
443443
return blob_to_string(tile[:tile_data]) if tile
444444

445+
validation_enabled = route.dig(:validation, :enabled)
445446
result = fetch_http(route:, x: x, y: y, z: z)
446447

447448
if result[:error]
448449
DatabaseManager.record_miss(route, z, x, y, result[:reason], result[:details], result[:status], result[:body])
449450
return nil
450451
end
451452

452-
unless route.dig(:validation, :enabled)
453-
save_tile_to_db(route, z, x, tms, result[:data])
454-
return result[:data]
453+
unless validation_enabled
454+
data = result[:data]
455+
if route[:output_format] == 'webp'
456+
begin
457+
data = convert_to_webp(data, route)
458+
rescue => e
459+
DatabaseManager.record_miss(route, z, x, y, 'webp_conversion_error', "WebP conversion error: #{e.message}", 500, nil)
460+
return nil
461+
end
462+
end
463+
464+
save_tile_to_db(route, z, x, tms, data)
465+
return data
455466
end
456467

457468
check_transparency = route.dig(:validation, :check_transparency)
@@ -464,6 +475,15 @@ helpers do
464475
DatabaseManager.record_miss(route, z, x, y, validation_result.to_s, "Tile is #{validation_result}", 200, nil)
465476
nil
466477
else
478+
if route[:output_format] == 'webp'
479+
begin
480+
result[:data] = convert_to_webp(result[:data], route)
481+
rescue => e
482+
DatabaseManager.record_miss(route, z, x, y, 'webp_conversion_error', "WebP conversion error after validation: #{e.message}", 500, nil)
483+
return nil
484+
end
485+
end
486+
467487
save_tile_to_db(route, z, x, tms, result[:data])
468488
result[:data]
469489
end
@@ -567,27 +587,17 @@ helpers do
567587

568588
data = TerrainDownsampleFFI.downsample_png(data, target_size, encoding, method)
569589

570-
if target_format == 'webp'
571-
data = convert_to_webp(data, route)
572-
headers['Content-Type'] = 'image/webp'
573-
else
590+
if target_format != 'webp'
574591
headers['Content-Type'] = 'image/png'
575592
end
576593
rescue => e
577594
return { error: true, reason: 'image_processing_error', details: build_error_details(response, "Image processing error: #{e.message}"), status: 500, body: data }
578595
end
579-
elsif target_format == 'webp'
580-
begin
581-
data = convert_to_webp(data, route)
582-
headers['Content-Type'] = 'image/webp'
583-
rescue => e
584-
return { error: true, reason: 'webp_conversion_error', details: build_error_details(response, "WebP conversion error: #{e.message}"), status: 500, body: data }
585-
end
586596
elsif target_format == 'png' && current_format != 'png'
587597
data = Vips::Image.new_from_buffer(data, '').write_to_buffer('.png')
588598
headers['Content-Type'] = 'image/png'
589599
end
590-
600+
591601
{ error: false, data: data }
592602
end
593603

0 commit comments

Comments
 (0)