From patchwork Sun Oct 25 13:40:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eran Kornblau X-Patchwork-Id: 23216 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:3414:0:0:0:0:0 with SMTP id b20csp1741387yba; Sun, 25 Oct 2020 06:40:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwRC2+Pyh/3qJcO0AnO0cxCPDyk3EPkroDO5NSxcZ7inDd+6WOqPrlxRYSbSA6NiNrNElLa X-Received: by 2002:a5d:654c:: with SMTP id z12mr7823725wrv.398.1603633217642; Sun, 25 Oct 2020 06:40:17 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l4si6941920wrh.73.2020.10.25.06.40.17; Sun, 25 Oct 2020 06:40:17 -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=@kaltura.com header.s=selector2 header.b=N24OKrmf; arc=fail (body hash mismatch); 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=NONE dis=NONE) header.from=kaltura.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 961F2689EA6; Sun, 25 Oct 2020 15:40:15 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2137.outbound.protection.outlook.com [40.107.20.137]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B0E28687F29 for ; Sun, 25 Oct 2020 15:40:08 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=e2zFH+2jGFACr+5POAD0wBaaF4zJjMW0wwdrcfjpWrxy/PRlrpuSdodPNHvcX5xleYHi6BUmOyqpRltgLHTOSQxA88CBylwRUNvdRoGO+KhVtS8u1em6z/JWBuyodxoW2u7sD8K3MLgcyhOXP9feEKieAKLQV8mntA75Uy0+UahR8MaoHXIwfoZW3EPbPDoKSbyKaeVdoY8dgmvRKXQfdEbwJda+yL22RatH1ntu17HFv8aPSwlG7aVFb+0gtgNXIa8ZiOGc7zA9s8aRKZMUcsgjYoNY89c+aNvzj7OLYFHL1uYs4FHf39K/GmeiRmf9NC3CyX2/qvBoLG12giVKJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nzeandU/cQt5o1tT2VgYQwIwKwwCjabXhF25dhOIIis=; b=cggrGTkssNa7j8DsSQh2ELrnCv7L0LjieGxNt0cZ4SlKZOeCD7mCQaIeiKEk0npyBJHjg5e369nezCfuq7Dx8Zh+Jc/DatE6XRCTbaC6xEydC0cWSP3MPmOrCS322EiH1DabKulZ/ttbB9x/mZUenpOn4QH5twEyfPuu/1emS0v+WXfJjNW5eBfppYJO+Sl66szMUyBSKlI3ZSzsTXWXXN2FPzL1JLvUyAL218A5UH0+JhDsLpkb6+uoRrXNPHh0PrwPXSyUBx32wVyZrNgyveO2RbGK3aQRcRUXJqsvsBji6uJ6Zlf4x7KeG81QR84c8kXg10s0ZnQs8kdQwE0OpQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=kaltura.com; dmarc=pass action=none header.from=kaltura.com; dkim=pass header.d=kaltura.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaltura.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nzeandU/cQt5o1tT2VgYQwIwKwwCjabXhF25dhOIIis=; b=N24OKrmfp3vKKrV0tQLeOY04pmPLlJNeaXk4N0hx2iTEQ84Z4BPLx13XUq93LfnB+F0lNIZTP+pHUcREhKgWFYlvXldWna3yE6+759fS/zEwkEGTmUDs/7lYHg2ON0MQcKVW6PCIA4HhTtJxQ8zp6H24y65nYzuzVe9VhH/qux0= Received: from AM0PR04MB6467.eurprd04.prod.outlook.com (2603:10a6:208:16c::20) by AM0PR04MB5571.eurprd04.prod.outlook.com (2603:10a6:208:11a::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3477.28; Sun, 25 Oct 2020 13:40:07 +0000 Received: from AM0PR04MB6467.eurprd04.prod.outlook.com ([fe80::8c75:514c:bc7b:f6e1]) by AM0PR04MB6467.eurprd04.prod.outlook.com ([fe80::8c75:514c:bc7b:f6e1%5]) with mapi id 15.20.3499.019; Sun, 25 Oct 2020 13:40:06 +0000 From: Eran Kornblau To: FFmpeg development discussions and patches Thread-Topic: [PATCH] http: support retry on connection error Thread-Index: Adaq0/XBW+O9LkDBScClIfrimiidZQ== Date: Sun, 25 Oct 2020 13:40:06 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: authentication-results: ffmpeg.org; dkim=none (message not signed) header.d=none;ffmpeg.org; dmarc=none action=none header.from=kaltura.com; x-originating-ip: [109.66.66.11] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 933b0d76-3026-41e3-4170-08d878eb7c2d x-ms-traffictypediagnostic: AM0PR04MB5571: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3631; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: hsJldukEHAkGUuFL8f4+1VbknibLOaWp6qvZiSZsQUiBDzwtMXlKiBQii69ryniscGjN9GvswdESYtNqIrTWtiBKK80w/G4rp8f4WPuDxe97cRjOT4Suv+1soP2+OuZgVaueWNkOFHTYqQXpgNcrXNWHIA3Uv6862gZ6GO6Kv3YBx/Dx/XS2Dwl/9dAUM+olNTwEB0GFuOC5dciSXfLGCp5qZjDP00ADe5yck+Cu8jMe4VkWFYVbZ5nQTAd4I+yhIC/LkCUxxbeKyF/dYFE/PHp3rAdRM4IgGCGysdhFXcqoLyq+JojhINmX3GDRiCJuch3hk4zs1imhqVb0lYA5BoZ4LoncJAeJ61l2CXQdR0i9n881vBRr8APWnknBDnqdRe5DEUrU3wYF5F3n5JxAwQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM0PR04MB6467.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(396003)(39850400004)(366004)(136003)(346002)(376002)(66476007)(76116006)(99936003)(478600001)(66946007)(64756008)(5660300002)(6916009)(786003)(66446008)(316002)(66616009)(2906002)(4744005)(66556008)(33656002)(9686003)(55016002)(44832011)(71200400001)(8676002)(9326002)(86362001)(186003)(8936002)(83380400001)(52536014)(7696005)(26005)(166002)(6506007)(966005); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata: npMzypp95wuhzKletF4qB5WRCp7gOprhQtOEV/o4hVsOyFNdSMBLYSo9NdHVQBNqTadJ45Dvy8fdMhsLFNCkHpHpv53pgewdqMw/w0VG4F1Nhp3Bi5BlP+ITXuwDdjTVCmzdZvafps4k4CxrxRDXnQnCGDcdOMuaYCUgr1jCPe7MWES9O+zgJeu6vpCnrvrjn1nkDjDG2ch+pq/3/4TFOKN5zEgtID44OoPmOh/YAu1ibxaH80XwT/ftZOY0IBmq9kXvbPjwCUhcXX4p248AZywJ5fDTFrG/m/YNZk8xWDDmtimDW4BetTgbqiRi31DphEjgSApQK++LK7BVI+i9oNy3Q2M2PctONWOUOR7SKrz2uYn/pp8lGhWdf8K+96cVE6rmHFYq2ge7R/GzRVX/lbituPpe4pKm771+9cwoaAr1NucqnR6FXaEZ7uO8RpPbmUpi2yvaCkvCWJ4mqNrH7TDvJlZ3HdVLa1sshz2q4ruMk3LvoMD3yiXTOOHLpTPfyOtO7wpcJhA87n7f60viR3pQpjekU0pbciWQXfUds/1VfO6jMpX2qE24I2gnESHxH90vd+hhSu1kxHOi9ipLh+LP80U10cLhE8zAaIrNNOAfBd9N49I40hc09fCqboLYj+5hb/VcSSaarmfrhuUY2w== x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: kaltura.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6467.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 933b0d76-3026-41e3-4170-08d878eb7c2d X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Oct 2020 13:40:06.7284 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 0c503748-de3f-4e25-97e2-6819d53a42b6 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: UyX2C+z2n6JP9oaB3t+Xt4d98MYU7aCWmsmB236yBb0j1TLC6JeOT2phtMPSaawL/9qqak6hg3P4NSgcdXuAFoCcHmBinlKilyIJpc0sFcE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB5571 X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH] http: support retry on connection error X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: K4sUO53hznc4 Hi, This patch adds 2 options to http: - reconnect_on_status - a list of http status codes that should be retried. the list can contain explicit status codes or the strings 4xx/5xx. - reconnect_on_err - reconnects on arbitrary errors during connect, e.g. ECONNRESET/ETIMEDOUT. The retry employs the same exponential backoff logic as the existing reconnect/reconnect_at_eof flags. Related tickets: https://trac.ffmpeg.org/ticket/6066 https://trac.ffmpeg.org/ticket/7768 Thanks! Eran Subject: [PATCH] http: support retry on connection error added 2 new options: - reconnect_on_status - a list of http status codes that should be retried. the list can contain explicit status codes / the strings 4xx/5xx. - reconnect_on_err - reconnects on arbitrary errors during connect, e.g. ECONNRESET/ETIMEDOUT the retry employs the same exponential backoff logic as the existing reconnect/reconnect_at_eof flags. related tickets: https://trac.ffmpeg.org/ticket/6066 https://trac.ffmpeg.org/ticket/7768 --- libavformat/http.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 3d25d652d3..ea14ef0c47 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -119,8 +119,10 @@ typedef struct HTTPContext { char *method; int reconnect; int reconnect_at_eof; + int reconnect_on_err; int reconnect_streamed; int reconnect_delay_max; + char *reconnect_on_status; int listen; char *resource; int reply_code; @@ -164,6 +166,8 @@ static const AVOption options[] = { { "method", "Override the HTTP method or set the expected HTTP method from a client", OFFSET(method), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E }, { "reconnect", "auto reconnect after disconnect before EOF", OFFSET(reconnect), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D }, { "reconnect_at_eof", "auto reconnect at EOF", OFFSET(reconnect_at_eof), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D }, + { "reconnect_on_err", "auto reconnect in case of tcp/tls error during connect", OFFSET(reconnect_on_err), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D }, + { "reconnect_on_status", "list of http status codes to reconnect on. the list can include specific status codes / 4xx / 5xx", OFFSET(reconnect_on_status), 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 }, { "listen", "listen on HTTP", OFFSET(listen), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, D | E }, @@ -258,21 +262,75 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options) return location_changed; } +static int http_should_reconnect(HTTPContext *s, int err) +{ + const char *status_group; + char http_code[4]; + + switch (err) { + case AVERROR_HTTP_BAD_REQUEST: + case AVERROR_HTTP_UNAUTHORIZED: + case AVERROR_HTTP_FORBIDDEN: + case AVERROR_HTTP_NOT_FOUND: + case AVERROR_HTTP_OTHER_4XX: + status_group = "4xx"; + break; + + case AVERROR_HTTP_SERVER_ERROR: + status_group = "5xx"; + break; + + default: + return s->reconnect_on_err; + } + + if (!s->reconnect_on_status) { + return 0; + } + + if (av_match_list(status_group, s->reconnect_on_status, ',') > 0) { + return 1; + } + + snprintf(http_code, sizeof(http_code), "%d", s->http_code); + + return av_match_list(http_code, s->reconnect_on_status, ',') > 0; +} + /* return non zero if error */ static int http_open_cnx(URLContext *h, AVDictionary **options) { HTTPAuthType cur_auth_type, cur_proxy_auth_type; HTTPContext *s = h->priv_data; int location_changed, attempts = 0, redirects = 0; + int reconnect_delay = 0; + uint64_t off; + redo: av_dict_copy(options, s->chained_options, 0); cur_auth_type = s->auth_state.auth_type; cur_proxy_auth_type = s->auth_state.auth_type; + off = s->off; location_changed = http_open_cnx_internal(h, options); - if (location_changed < 0) - goto fail; + if (location_changed < 0) { + if (!http_should_reconnect(s, location_changed) || + reconnect_delay > s->reconnect_delay_max) + goto fail; + + av_log(h, AV_LOG_WARNING, "Will reconnect at %"PRIu64" in %d second(s).\n", off, reconnect_delay); + location_changed = ff_network_sleep_interruptible(1000U * 1000 * reconnect_delay, &h->interrupt_callback); + if (location_changed != AVERROR(ETIMEDOUT)) + goto fail; + reconnect_delay = 1 + 2 * reconnect_delay; + + /* restore the offset (http_connect resets it) */ + s->off = off; + + ffurl_closep(&s->hd); + goto redo; + } attempts++; if (s->http_code == 401) {