From patchwork Mon Apr 22 14:25:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 48217 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c906:b0:1a9:af23:56c1 with SMTP id gx6csp2325566pzb; Mon, 22 Apr 2024 07:26:46 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUwX9Tw7myEbgPlRT13aeZ4M4sNzV8+FtOIjRetIHpNFoKHRvjphovkjfRwd2SnI5kDTasdiVxg1OfTh9xyxHuq0ozSpAOrz+hZbQ== X-Google-Smtp-Source: AGHT+IHDLt6SRNRmgJNZhmw4+7MXWc7joK35+2YRdN481CSccjrNrxzzOce5whiZMGgxFykkn5g9 X-Received: by 2002:a50:d4c3:0:b0:570:1026:c98b with SMTP id e3-20020a50d4c3000000b005701026c98bmr6493016edj.0.1713796005977; Mon, 22 Apr 2024 07:26:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1713796005; cv=none; d=google.com; s=arc-20160816; b=vSe+oUFcfXreK5nvoNfyNhGxRjlIDwwvKS15k+OE5AitKxB3uVreHZK6OY37Bn2zjv EqlHtT4TiESE0Bv7PSkQx4qEukxqGDn11GIxea5YDklaZYbosXOsd6yetj49H5MTmrB7 AsQnicEoBHO4d9Bje1vmCDqoSA+PByAxXZQSBge7RsFWaPCHIHeJK3lj3HUA/SSm4wwI TWrcR7l1t7R/8kHSrVLEcp0Dp/SDaeNB+NLU+zaDHtrajOEXkWI8oqfNd57nYa8woMCf iJfpDuZ17vrckG1LpZRpzROYR1P/JApGM+hb69wU3YB0KTwQY+fvy6VLfJZM2iRlQCDq wdhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=PrXluRnEfALAPGlDJF9ppppR0PBbZ/wK9jhSjvgQbxo=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=LEuAYCO0lO9Wtp+UpDISX+QSN0oz53fcCrUFzlkuRRpzyOVXklxeYV5jGRsaSppOW3 WtD1/QUAPplqVnk3GXNfVhp8GrsLSclUCUSeaY2JA5d041R8bIOdRlrK/hzp7g/CoHuO P5faW9wQ2dw1xKflZdEOtDc1bdU7oEccwIo1uKo+CCf+BgnFOE+q9in/1q76tepJ0Qs/ FhwK09RadCuJcSj9XtIaZyn6yCneLnIySBegHdUBT+HdueokLb5dtMTkJeL07JiY69Jz VDvjBKeij0GEFqpG5L0g7rYqH9mXZZ+YH+W1/x33kx4ZLRjnY3HtVFq9m/xtvYxQRhDS z0jg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=MUiJqelR; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m19-20020aa7c493000000b0056c4e641eecsi5845806edq.219.2024.04.22.07.26.45; Mon, 22 Apr 2024 07:26:45 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=MUiJqelR; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 86EB668D362; Mon, 22 Apr 2024 17:26:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C24DC68D2F6 for ; Mon, 22 Apr 2024 17:26:02 +0300 (EEST) Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-41a7c7abed9so4754005e9.3 for ; Mon, 22 Apr 2024 07:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713795961; x=1714400761; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=ed35GbOVsIDh5igs22KbqIO4ym27MIMHMP1pm5ApzjU=; b=MUiJqelR+jZVfarG4GH7fPrTD62XgOMnb1qw2zw5Q1uLq2j/vA/Kx/hYTcAzETakvb ZkML0oTAvhGoYMKtEFdHWzTsW4Jb+7BtQZLeu9l9YlHjiKRNta9yUPyQmSR/SHpiifhD Q2QYD8sEWTe63i+8yi0S0nGw2ozK0ewqabPevRAMncr3d9QH6VEGFyF0PDvi/0BB8YHk LX/idG5KefG9O7/VtC3ykNxP0YViLcIUlCsG8IAG3bqDrahjLo/JCR5nTYXaM5NqyWbN Yk8EsF0Bo1Or0n6Ad+HNmiq+PxIALCXXLfWpu1k8VYYY7yE/vBgGLup+jwtdbMtfcsHj c7VA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713795961; x=1714400761; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ed35GbOVsIDh5igs22KbqIO4ym27MIMHMP1pm5ApzjU=; b=mT38xnWu5ooEHOL6k0elEoopsydUVdcmx6O21tvXrX1gY+PxAk9aMQjdLNLZ/Hakys QnZZM6Z+f6pxlKrKhZijgsblr0h/sRZiGXOF1XXw4A80U4AM6P48cW7q3GsoD03BsCTW d6qO+o//D1kUkqkfoKukMpM6i8WbN0zobuFwUzGFga/LIZmd0JEZbb5ROgNy6pjmkrJM 9wEJtGMODzxXqDYQiuYqvK464zs2RHqlqhLfwNKYFJ1Dlla1+8Msjtp3GIZeLG5jH8cC hhw35AJ81tNro87bJWa5YCcEzEcfmRmiK0SGH9OtT3TKJZn4hX78QuBrQXzblU0BNC89 26hg== X-Gm-Message-State: AOJu0YwinBpdAgBMZCJmxnw2ehQt4tChfnsr1T2jtzZkNdeWT/HtcHoH xb4yv2qhrXEOGi6Ti6F39Qsjd+dvXj1ti6IdCcon61eDq/DFHzKodZ5Ozw== X-Received: by 2002:a05:600c:b9a:b0:41a:968a:b2d2 with SMTP id fl26-20020a05600c0b9a00b0041a968ab2d2mr575338wmb.4.1713795961584; Mon, 22 Apr 2024 07:26:01 -0700 (PDT) Received: from localhost.localdomain (33bf3d9d.skybroadband.com. [51.191.61.157]) by smtp.gmail.com with ESMTPSA id d11-20020a05600c3acb00b0041aa14b4646sm67111wms.8.2024.04.22.07.26.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Apr 2024 07:26:00 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 22 Apr 2024 15:25:42 +0100 Message-ID: <20240422142547.281064-5-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240422142547.281064-1-derek.buitenhuis@gmail.com> References: <20240422142547.281064-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 4/9] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4zh7l/qNZMYI 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..5ed481b63a 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; + unsigned 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 = strtoul(p, NULL, 10); } } 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, \