telegram: bound photo download to 60s

HttpClient::request_timeout only covers send_request, not body collect,
so a stuck download would otherwise stall the entire long-poll loop
indefinitely. tokio::time::timeout at the call site keeps the failure
contained — a slow/dead download surfaces as the same [image: download
failed: ...] marker as any other error.

60s is generous for the 1-5MB photos Kent typically sends; Telegram's
bot getFile cap is 20MB, which would still complete on most connections.

Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
Kent Overstreet 2026-05-01 18:56:03 -04:00
commit 190eb50ed9

View file

@ -221,7 +221,15 @@ async fn get_updates(
error!("telegram photo: missing file_id in update {update_id}"); error!("telegram photo: missing file_id in update {update_id}");
(caption, None) (caption, None)
} else { } else {
match download_telegram_file(client, token, file_id).await { // Bound the download — HttpClient::request_timeout only covers
// send_request, not body collect, so an indefinitely-slow body
// would otherwise stall every subsequent poll.
let dl = tokio::time::timeout(
std::time::Duration::from_secs(60),
download_telegram_file(client, token, file_id),
).await
.unwrap_or_else(|_| Err("download timed out after 60s".into()));
match dl {
Ok(path) => (caption, Some(path)), Ok(path) => (caption, Some(path)),
Err(e) => { Err(e) => {
error!("telegram photo download failed (file_id={file_id}): {e}"); error!("telegram photo download failed (file_id={file_id}): {e}");