From patchwork Mon Apr 15 16:49:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 48077 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:670b:b0:1a9:af23:56c1 with SMTP id wh11csp1966381pzb; Mon, 15 Apr 2024 09:49:55 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUYeZb924G6Y5C50iMngRJNdv546l36rwy1lF+Co91uUsH6gZRN5oFKUDRlp3MH74mpqgirfu/YInVeyROCfIay3FQaC09IK2QIbA== X-Google-Smtp-Source: AGHT+IEhogPUf7YzAArjrQMQCJFW6edQC8wfH/DRfgNlg50HaNjtJepQOdSp2+YZgjldYTCDnuvT X-Received: by 2002:a05:6512:b98:b0:517:166d:2b93 with SMTP id b24-20020a0565120b9800b00517166d2b93mr7567803lfv.32.1713199795043; Mon, 15 Apr 2024 09:49:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1713199795; cv=none; d=google.com; s=arc-20160816; b=n2sFznYsfQQ1WEU442X/5ZKUtS8UytU30zevoW4bjYbME0GcEMwn/4DCAXRQ+POvEz Xmva+28jWjySngkyOAAp2wOVRupJFddmmQgDEj6BhXaM8/z0dVk5607at60IuPIdTj1w OUhdmu1k9NrVDvneMrSXYVIGNlpA7/fjSVQJx49vMzLIWfwJvIoGW1QSHcwCSmO9ZP7D gZdlHkGUl82tO5gl91NKi2Lmf9PZkHwc61ztxm33JAGewyZFCuquo2Ec5OOnKLYjNwlE Rhm3XiwvVvu2SWM7r5wBdl1TT0/zqn+kKvserOWTjmMm6Dt01Jy6387i5dk8hX/M4rlN iMoA== 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=e2kKxDRN5B89+NmQ95poaNGsafslF2WD8dBLDvvUgVBb4nI40IhQeUgihp3p9qw0na T06XXbGUSs2JP0x7+VZP8LqclZv9jy1luNhYpE6z+ZbDxt6BEdTabHryNMT5JiRgPng2 fBbvA1/vpob78igfB/qq3gWsw6oU6pIKknagd8v0sDQrWXq/eRSFNmlsOlQCj7goLzeJ VvVTDTC/9bqQ/NMo6go2FpkQHOa3ahKJaIJ3lTtp3HqUrJHjN3KA3luLZnzjLvwc8sZ6 5x5jZ/OmJ30o0nYI0ClxKLR4oPcVVe3VfB7lQcqI3yVvx7s7/sWMUkR0tB1rbsv0bdnT IJJg==; 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=LVz5SyhA; 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 ld1-20020a170906f94100b00a51c4502017si4520865ejb.1001.2024.04.15.09.49.54; Mon, 15 Apr 2024 09:49:55 -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=LVz5SyhA; 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 AC1C968CBED; Mon, 15 Apr 2024 19:49:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F120668C2F0 for ; Mon, 15 Apr 2024 19:49:44 +0300 (EEST) Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-418672b4714so6198125e9.3 for ; Mon, 15 Apr 2024 09:49:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713199784; x=1713804584; 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=LVz5SyhAqkvI2MTRuAQHKmQ9OGN+A2G9PDAud6lswAmZhYTYnX03ssyolMfnRV7jaI R1oL5YZQQQyM8hUbLM/9FcsZyKLmaxz232Vu8o9H3PR4ufRKANP/ddUPiIwS1dnr1WpP vUt0UOdhSGdccupwry3Od/76ApFF09Lgg4/lEKq/VZ1XYdEP8P4vGZd71bc8glzk89l+ Uwq9FQYCNGLdrqEI/aanfT6WrFvm7op6nBglxQC5sseQWbcVhpZCIX7qkXBPX+UF8ETi mn+k1T0rrKvECWUsDNwV6JpibU4eim7dOUUqx/OqejQxBBYY9H+GjwyRvR4X4gep9nhs eJbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713199784; x=1713804584; 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=kI9kplxIYUk0kCid8rt8yU8vTcPA5L2RquavMfllBtUBk2YUCSZJ9Y1/XeMyXKMqKx 0uFVAR4AvM6EX+DcOAMW4pnA2QAq0wZ3grN+jJTYpVORUpF7Xmnu1DsnxsFX7XRJFOW/ A9JMTDQ4Yj74CkXJytA8fc+NX61L357exLqSuXfHE9gBvBNIhC5M1PSPRYlEV5FR+vDT PXu+QY1vPl2Rr7wCInupmjz6LTXeF3NapIVt+b3qKGG4tetokuFKXxHcuqckt6OmpNC+ mv+XZFWV2m85BIIlUYbDGkDz05CbhnCnkMW2x575dp6AyDaYNGwqdv+UMf4/GE763ja+ M1dw== X-Gm-Message-State: AOJu0Yy+3dLkLZqBsj1cK0Z+BAw2K64CZiMyNrc5DIt52/qUYyB03qYt ei4XgzAcvdfhk7LbMb23xwNyo4NV5u/v+Z06ch7B1UqbMxaubLwiD17mKQ== X-Received: by 2002:a05:600c:1e0f:b0:418:19d4:fe5c with SMTP id ay15-20020a05600c1e0f00b0041819d4fe5cmr5325068wmb.14.1713199783739; Mon, 15 Apr 2024 09:49:43 -0700 (PDT) Received: from localhost.localdomain (33bf3d9d.skybroadband.com. [51.191.61.157]) by smtp.gmail.com with ESMTPSA id j14-20020a05600c190e00b00418296091d3sm9562441wmq.19.2024.04.15.09.49.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 09:49:43 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 15 Apr 2024 17:49:33 +0100 Message-ID: <20240415164933.110933-1-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240415162741.110374-1-derek.buitenhuis@gmail.com> References: <20240415162741.110374-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/6 v2] 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: fWp+CW+bJmVz 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, \