From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 763B849ED7 for ; Mon, 15 Apr 2024 16:36:00 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4778868CF0F; Mon, 15 Apr 2024 19:35:58 +0300 (EEST) Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BFCA268BA5C for ; Mon, 15 Apr 2024 19:35:51 +0300 (EEST) Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-1e504f58230so27126865ad.2 for ; Mon, 15 Apr 2024 09:35:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713198949; x=1713803749; darn=ffmpeg.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=7r7WfxkLNUKRDYCTVJF0OjuqouVRlgYMUs/zowKXr5Y=; b=joeQl8UQxUnPfhfLOCMAc0FeicOh9D9Usib3vc2AOhS71C1BxhWTs5lLGpDkcfUV9e EH8lJ6s5w84YcT+NoJU1QoulLMgKhCRQS7daV4QUQTdkpTmxxvAJsmiieonoRmXG+tc/ 8cuuM45+kYxxKCUKO/kjRrr06NlZTZMMKC61qNZvFRoYvfaOTGBDh7ny4x1aPNBLCVp1 Dh78wDOIBsx6af1A1NCH7w5GoGGVWrqHx8FmQ4sB23t9zV29t7w7G44WF6rDQALN04ow twCvSF2wseZeN4l1tUgDDgtyPPCVwUlGYI2CzxsipWzZJuxFWnKG16gVOiDMSoAvs752 vheA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713198949; x=1713803749; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7r7WfxkLNUKRDYCTVJF0OjuqouVRlgYMUs/zowKXr5Y=; b=Xeq07qPMFn1ydpflC6D3VDU8fsqM7R3z3Z5wSzHe5vF93SU7GJ+nuYa2Tbf2en2RAb yEfdNyRVL+EXDm7zND/DFfFEKCVGythapw56NLMJMU5RxXcQ9OPOtA2eBs611d6hYR44 6efsRH3E42JAJsDp47quJOp75yYotpJf+KikVgHHWYU3BVNxDL1EhHFw6DT5z2FA1R1t zDRlUR4gbHgQ6OY4FQ/vAWlMlmP6b64PWwtgknTBXA7g50YVkaIjhWuN7WWg3A5I91BV 0yhSCwPwzvHS+u7cJWPIdxP4rhmjCULbfMd16R+IlAJlJgy32nC/xorkSfb5KGffZK74 VAug== X-Gm-Message-State: AOJu0YzqjH4u5PM+qn1N/uJNDn5VMwFDSZiIgY7PX3C/DmD+UdGy4dgG PD2cZx5QiUb2tVksRBIpHgeDIIUeLKaXgybhXfhh3aWbhwBpytzmKL+oCw== X-Google-Smtp-Source: AGHT+IGiklX8vWQdE/3gZgQ/YncW39SKOK0bHuqkx7YRweB2KYypnK1yt6aAMsEy+Pvo8Wu8tNurNQ== X-Received: by 2002:a17:902:f68f:b0:1e5:9390:8437 with SMTP id l15-20020a170902f68f00b001e593908437mr11584384plg.32.1713198948948; Mon, 15 Apr 2024 09:35:48 -0700 (PDT) Received: from [192.168.0.16] ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id p5-20020a170902780500b001e2a4497956sm8286636pll.90.2024.04.15.09.35.47 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 15 Apr 2024 09:35:48 -0700 (PDT) Message-ID: <339990ae-c2df-49d8-8721-e3572bb5bc5d@gmail.com> Date: Mon, 15 Apr 2024 13:35:56 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20240415162741.110374-1-derek.buitenhuis@gmail.com> <20240415162741.110374-5-derek.buitenhuis@gmail.com> Content-Language: en-US From: James Almer In-Reply-To: <20240415162741.110374-5-derek.buitenhuis@gmail.com> Subject: Re: [FFmpeg-devel] [PATCH 4/6] avformat/http: Add support for Retry-After header X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 4/15/2024 1:27 PM, Derek Buitenhuis wrote: > 429 and 503 codes can, and often do (e.g. all Google Cloud > Storage URLs can), return a Retry-After header with the error, > indicating how long to wait, in seconds, before retrying again. > If it is not respected by, for example, using our default backoff > stratetgy instead, chances of success are very unlikely. > > This adds an AVOption to respect that header. > > Signed-off-by: Derek Buitenhuis > --- > libavformat/http.c | 12 ++++++++++++ > libavformat/version.h | 2 +- > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/libavformat/http.c b/libavformat/http.c > index e7603037f4..8f092f108d 100644 > --- a/libavformat/http.c > +++ b/libavformat/http.c > @@ -138,6 +138,8 @@ typedef struct HTTPContext { > char *new_location; > AVDictionary *redirect_cache; > uint64_t filesize_from_content_range; > + int respect_retry_after; > + int retry_after; > } HTTPContext; > > #define OFFSET(x) offsetof(HTTPContext, x) > @@ -176,6 +178,7 @@ static const AVOption options[] = { > { "reconnect_on_http_error", "list of http status codes to reconnect on", OFFSET(reconnect_on_http_error), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D }, > { "reconnect_streamed", "auto reconnect streamed / non seekable streams", OFFSET(reconnect_streamed), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D }, > { "reconnect_delay_max", "max reconnect delay in seconds after which to give up", OFFSET(reconnect_delay_max), AV_OPT_TYPE_INT, { .i64 = 120 }, 0, UINT_MAX/1000/1000, D }, > + { "respect_retry_after", "respect the Retry-After header when retrying connections", OFFSET(respect_retry_after), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, D }, > { "listen", "listen on HTTP", OFFSET(listen), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, D | E }, > { "resource", "The resource requested by a client", OFFSET(resource), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, E }, > { "reply_code", "The http status code to return to a client", OFFSET(reply_code), AV_OPT_TYPE_INT, { .i64 = 200}, INT_MIN, 599, E}, > @@ -386,6 +389,13 @@ redo: > reconnect_delay > s->reconnect_delay_max) > goto fail; > > + if (s->respect_retry_after && s->retry_after > 0) { > + reconnect_delay = s->retry_after; > + if (reconnect_delay > s->reconnect_delay_max) > + goto fail; > + s->retry_after = 0; > + } > + > av_log(h, AV_LOG_WARNING, "Will reconnect at %"PRIu64" in %d second(s).\n", off, reconnect_delay); > ret = ff_network_sleep_interruptible(1000U * 1000 * reconnect_delay, &h->interrupt_callback); > if (ret != AVERROR(ETIMEDOUT)) > @@ -1231,6 +1241,8 @@ static int process_line(URLContext *h, char *line, int line_count, int *parsed_h > parse_expires(s, p); > } else if (!av_strcasecmp(tag, "Cache-Control")) { > parse_cache_control(s, p); > + } else if (!av_strcasecmp(tag, "Retry-After")) { > + s->retry_after = strtoull(p, NULL, 10); Why strtoull for an int? If the value can't be negative, then make it unsigned and use strtoul instead. > } > } > return 1; > diff --git a/libavformat/version.h b/libavformat/version.h > index 7ff1483912..ee91990360 100644 > --- a/libavformat/version.h > +++ b/libavformat/version.h > @@ -32,7 +32,7 @@ > #include "version_major.h" > > #define LIBAVFORMAT_VERSION_MINOR 3 > -#define LIBAVFORMAT_VERSION_MICRO 100 > +#define LIBAVFORMAT_VERSION_MICRO 101 > > #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ > LIBAVFORMAT_VERSION_MINOR, \ _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".