From 8e1fd702f91a94bc2cdcef7b8f01434e21d6b436 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Mon, 30 Mar 2026 09:26:58 -0500 Subject: [PATCH] Reject HRRR downloads when server ignores Range header S3 returns 200 with the full ~116MB file instead of 206 for some older HRRR data. Treat this as a permanent failure instead of trying to parse the entire file. --- lib/microwaveprop/weather/hrrr_client.ex | 6 +++++- lib/microwaveprop/workers/hrrr_fetch_worker.ex | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/microwaveprop/weather/hrrr_client.ex b/lib/microwaveprop/weather/hrrr_client.ex index 6cd8895b..45a5240b 100644 --- a/lib/microwaveprop/weather/hrrr_client.ex +++ b/lib/microwaveprop/weather/hrrr_client.ex @@ -178,9 +178,13 @@ defmodule Microwaveprop.Weather.HrrrClient do Enum.map_join(ranges, ", ", fn {start, stop} -> "#{start}-#{stop}" end) case Req.get(url, [{:headers, [{"Range", "bytes=#{range_header}"}]} | req_options()]) do - {:ok, %{status: status, body: body}} when status in [200, 206] -> + {:ok, %{status: 206, body: body}} -> {:ok, body} + {:ok, %{status: 200}} -> + Logger.warning("HRRR server ignored Range header, returned full file") + {:error, "HRRR range request not supported"} + {:ok, %{status: status}} -> {:error, "HRRR grib HTTP #{status}"} diff --git a/lib/microwaveprop/workers/hrrr_fetch_worker.ex b/lib/microwaveprop/workers/hrrr_fetch_worker.ex index 2da4894f..66ebc897 100644 --- a/lib/microwaveprop/workers/hrrr_fetch_worker.ex +++ b/lib/microwaveprop/workers/hrrr_fetch_worker.ex @@ -69,6 +69,7 @@ defmodule Microwaveprop.Workers.HrrrFetchWorker do defp permanent_failure?("HRRR idx HTTP 404"), do: true defp permanent_failure?("HRRR grib HTTP 404"), do: true + defp permanent_failure?("HRRR range request not supported"), do: true defp permanent_failure?(:outside_grid), do: true defp permanent_failure?("malformed section"), do: true defp permanent_failure?("missing sections: " <> _), do: true