From 37cb29fa8e659fa529e55740edae544634710aae Mon Sep 17 00:00:00 2001 From: ahaooahaz Date: Mon, 13 Mar 2023 17:38:08 +0800 Subject: [PATCH 01/11] increase sdp rel-addr length limit: #2330 #2302 --- webrtc/Sdp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webrtc/Sdp.cpp b/webrtc/Sdp.cpp index a796ca99..1b08ca8d 100644 --- a/webrtc/Sdp.cpp +++ b/webrtc/Sdp.cpp @@ -680,11 +680,11 @@ string SdpAttrSctpMap::toString() const { void SdpAttrCandidate::parse(const string &str) { char foundation_buf[40] = {0}; char transport_buf[16] = {0}; - char address_buf[8*4+7+1] = {0}; + char address_buf[64] = {0}; char type_buf[16] = {0}; // https://datatracker.ietf.org/doc/html/rfc5245#section-15.1 - CHECK_SDP(sscanf(str.data(), "%32[^ ] %" SCNu32 " %15[^ ] %" SCNu32 " %39[^ ] %" SCNu16 " typ %15[^ ]", + CHECK_SDP(sscanf(str.data(), "%32[^ ] %" SCNu32 " %15[^ ] %" SCNu32 " %63[^ ] %" SCNu16 " typ %15[^ ]", foundation_buf, &component, transport_buf, &priority, address_buf, &port, type_buf) == 7); foundation = foundation_buf; transport = transport_buf; From b9fa5f9b5e4f2189979edfd7be444ad4773b8a8a Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Mon, 13 Mar 2023 20:29:18 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E6=B1=87=E6=8A=A5?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=94=B9=E6=88=9060=E5=88=86=E9=92=9F?= =?UTF-8?q?=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同时新增程序启动日期、是否开启编译ffmpeg选项 --- src/Http/HttpRequester.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Http/HttpRequester.cpp b/src/Http/HttpRequester.cpp index a7885919..6833e44f 100644 --- a/src/Http/HttpRequester.cpp +++ b/src/Http/HttpRequester.cpp @@ -52,7 +52,6 @@ void HttpRequester::setOnResult(const HttpRequesterResult &onResult) { //////////////////////////////////////////////////////////////////////// #if !defined(DISABLE_REPORT) -static constexpr auto s_interval_second = 60 * 5; static constexpr auto s_report_url = "http://report.zlmediakit.com:8888/index/api/report"; extern const char kServerName[]; @@ -112,6 +111,7 @@ static std::string httpBody() { args["build_date"] = __DATE__; args["version"] = kServerName; args["exe_name"] = exeName(); + args["start_time"] = getTimeStr("%Y-%m-%d %H:%M:%S"); #if NDEBUG args["release"] = 1; @@ -161,6 +161,12 @@ static std::string httpBody() { args["openssl"] = 0; #endif +#if ENABLE_FFMPEG + args["ffmpeg"] = 1; +#else + args["ffmpeg"] = 0; +#endif + args["rand_str"] = makeRandStr(32); for (auto &pr : mINI::Instance()) { // 只获取转协议相关配置 @@ -178,14 +184,17 @@ static void sendReport() { requester->setMethod("POST"); requester->setBody(body); - requester->startRequester(s_report_url, nullptr, s_interval_second); + // http超时时间设置为30秒 + requester->startRequester(s_report_url, nullptr, 30); } static toolkit::onceToken s_token([]() { NoticeCenter::Instance().addListener(nullptr, EventPollerPool::kOnStarted, [](EventPollerPool &pool, size_t &size) { - pool.getPoller()->doDelayTask(s_interval_second * 1000, []() { + // 第一次汇报在程序启动后5分钟 + pool.getPoller()->doDelayTask(5 * 60 * 1000, []() { sendReport(); - return s_interval_second * 1000; + // 后续每一个小时汇报一次 + return 60 * 60 * 1000; }); }); }); From 5ae34d666ed4775ec03eb46ba5f87bd0c3c59ffd Mon Sep 17 00:00:00 2001 From: TempoTian <110106787+TempoTian@users.noreply.github.com> Date: Mon, 13 Mar 2023 20:42:31 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=8F=90=E9=AB=98=20rtmp=20tcUrl=20?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=85=BC=E5=AE=B9=E6=80=A7=20(#2303=20#2298)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtmp/RtmpSession.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index 9d8acf51..c387ac91 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -95,6 +95,15 @@ void RtmpSession::onCmd_connect(AMFDecoder &dec) { //tc_url 中可能包含?以及参数,参见issue: #692 _tc_url = _tc_url.substr(0, pos); } + auto stream_start = _tc_url.rfind('/'); + if (stream_start != string::npos && stream_start > 1) { + auto protocol_end = _tc_url.find("://") + 2; + auto app_start = _tc_url.rfind('/', stream_start - 1); + if (app_start != protocol_end) { + // contain stream name part + _tc_url = _tc_url.substr(0, stream_start); + } + } } bool ok = true; //(app == APP_NAME); AMFValue version(AMF_OBJECT); From 70ad9cb0b64efc866bfbf018e82eca1411d26719 Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Mon, 13 Mar 2023 20:59:17 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E8=AE=BE=E7=BD=AEwebrtc=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E7=BC=BA=E7=9C=81=E9=85=8D=E7=BD=AE=E4=B8=BA0(?= =?UTF-8?q?=E4=B8=8D=E5=BC=80=E5=90=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webrtc/WebRtcTransport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webrtc/WebRtcTransport.cpp b/webrtc/WebRtcTransport.cpp index 3551f00a..347f870c 100644 --- a/webrtc/WebRtcTransport.cpp +++ b/webrtc/WebRtcTransport.cpp @@ -52,8 +52,8 @@ static onceToken token([]() { mINI::Instance()[kTimeOutSec] = 15; mINI::Instance()[kExternIP] = ""; mINI::Instance()[kRembBitRate] = 0; - mINI::Instance()[kPort] = 8000; - mINI::Instance()[kTcpPort] = 8000; + mINI::Instance()[kPort] = 0; + mINI::Instance()[kTcpPort] = 0; }); } // namespace RTC From 6008ae157ad5c5143dee02ea6662750416d873cc Mon Sep 17 00:00:00 2001 From: Derek Liu Date: Tue, 14 Mar 2023 19:38:24 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8DaddFFmepgSource?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=82=E6=95=B0=E9=9D=9E=E6=B3=95=E6=97=B6?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=B8=85=E9=99=A4=E8=AE=B0=E5=BD=95=E8=A1=A8?= =?UTF-8?q?=E7=9A=84bug=20(#2305)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 捕获addFFmepgSource接口参数dst_url解析错误的抛错,通过错误回调返回返回错误,清除s_ffmpegMap表中的无效KEY --- server/FFmpegSource.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/FFmpegSource.cpp b/server/FFmpegSource.cpp index 1392d9dc..48fb2cd5 100644 --- a/server/FFmpegSource.cpp +++ b/server/FFmpegSource.cpp @@ -78,7 +78,13 @@ void FFmpegSource::play(const string &ffmpeg_cmd_key, const string &src_url,cons _src_url = src_url; _dst_url = dst_url; _ffmpeg_cmd_key = ffmpeg_cmd_key; - _media_info.parse(dst_url); + + try { + _media_info.parse(dst_url); + } catch (std::exception &ex) { + cb(SockException(Err_other, ex.what())); + return; + } auto ffmpeg_cmd = ffmpeg_cmd_default; if (!ffmpeg_cmd_key.empty()) { From 1dec350dcd65673e581ff7cdd9eee60e6d4e02f2 Mon Sep 17 00:00:00 2001 From: ljx0305 Date: Wed, 15 Mar 2023 14:54:18 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E4=BF=AE=E6=AD=A3on=5Frtp=5Fserver=5Ftim?= =?UTF-8?q?eout=20hook=E6=97=B6=E8=8E=B7=E5=8F=96=E7=9A=84=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E9=9D=9E=E7=9C=9F=E5=AE=9E=E7=AB=AF=E5=8F=A3=20(#2297?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在调用openRtpServer接口时,如果传入的端口为0(随机端口), 那么在触发on_rtp_server_timeout hook时的端口为0 --- src/Rtp/RtpServer.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Rtp/RtpServer.cpp b/src/Rtp/RtpServer.cpp index 9d276c77..741200ba 100644 --- a/src/Rtp/RtpServer.cpp +++ b/src/Rtp/RtpServer.cpp @@ -161,12 +161,13 @@ void RtpServer::start(uint16_t local_port, const string &stream_id, TcpMode tcp_ //随机端口,rtp端口采用偶数 auto pair = std::make_pair(rtp_socket, rtcp_socket); makeSockPair(pair, local_ip, re_use_port); + local_port = rtp_socket->get_local_port(); } else if (!rtp_socket->bindUdpSock(local_port, local_ip, re_use_port)) { //用户指定端口 throw std::runtime_error(StrPrinter << "创建rtp端口 " << local_ip << ":" << local_port << " 失败:" << get_uv_errmsg(true)); - } else if (!rtcp_socket->bindUdpSock(rtp_socket->get_local_port() + 1, local_ip, re_use_port)) { + } else if (!rtcp_socket->bindUdpSock(local_port + 1, local_ip, re_use_port)) { // rtcp端口 - throw std::runtime_error(StrPrinter << "创建rtcp端口 " << local_ip << ":" << rtp_socket->get_local_port() + 1 << " 失败:" << get_uv_errmsg(true)); + throw std::runtime_error(StrPrinter << "创建rtcp端口 " << local_ip << ":" << local_port + 1 << " 失败:" << get_uv_errmsg(true)); } //设置udp socket读缓存 @@ -181,7 +182,7 @@ void RtpServer::start(uint16_t local_port, const string &stream_id, TcpMode tcp_ (*tcp_server)[RtpSession::kSSRC] = ssrc; (*tcp_server)[RtpSession::kOnlyAudio] = only_audio; if (tcp_mode == PASSIVE) { - tcp_server->start(rtp_socket->get_local_port(), local_ip); + tcp_server->start(local_port, local_ip); } else if (stream_id.empty()) { // tcp主动模式时只能一个端口一个流,必须指定流id; 创建TcpServer对象也仅用于传参 throw std::runtime_error(StrPrinter << "tcp主动模式时必需指定流id"); @@ -216,7 +217,7 @@ void RtpServer::start(uint16_t local_port, const string &stream_id, TcpMode tcp_ //单端口多线程接收多个流,根据ssrc区分流 udp_server = std::make_shared(rtp_socket->getPoller()); (*udp_server)[RtpSession::kOnlyAudio] = only_audio; - udp_server->start(rtp_socket->get_local_port(), local_ip); + udp_server->start(local_port, local_ip); rtp_socket = nullptr; #else //单端口单线程接收多个流 From a754a22680c4381d6623d6340cac832cb17a9ff6 Mon Sep 17 00:00:00 2001 From: baiyfcu Date: Fri, 17 Mar 2023 01:31:56 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8WINDOWS?= =?UTF-8?q?=E4=B8=8Acpu=E7=B1=BB=E5=9E=8B=E6=97=A0=E6=B3=95=E5=88=A4?= =?UTF-8?q?=E6=96=ADBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/HttpRequester.cpp | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/Http/HttpRequester.cpp b/src/Http/HttpRequester.cpp index 6833e44f..8fd9807e 100644 --- a/src/Http/HttpRequester.cpp +++ b/src/Http/HttpRequester.cpp @@ -72,6 +72,58 @@ static std::string httpBody() { os = "unknow"; #endif +#if (defined(_WIN32) && !defined(WIN32)) +#define WIN32 _WIN32 +#elif (defined(WIN32) && !defined(_WIN32)) +#define _WIN32 WIN32 +#endif + +#if (defined(_WIN32) && !defined(_MSC_VER) && !defined(_WIN64)) +#ifndef __i386__ +#define __i386__ +#endif +#elif defined(_MSC_VER) +#if (defined(_M_IX86) && !defined(__i386__)) +#define __i386__ +#endif +#endif + +#ifndef __i386__ +#if (defined(__386__) || defined(__I386__) || _M_IX86) +#define __i386__ +#endif +#endif + +#if (defined(__i386__) && !defined(__I386__)) +#define __I386__ +#endif + +#if (defined(__x86_64__) && !defined(__x86_64)) +#define __x86_64 +#endif + +#if (defined(__x86_64) && !defined(__x86_64__)) +#define __x86_64__ +#endif + +#if (defined(_M_AMD64)) && (!defined(__amd64__)) +#define __amd64__ +#endif + +#if (defined(__amd64) && !defined(__amd64__)) +#define __amd64__ +#endif + +#if (defined(__amd64__) && !defined(__amd64)) +#define __amd64 +#endif + +#if (defined(__i386__) || defined(__amd64__)) && (!defined(__x86__)) +#if !(defined(_MSC_VER) && defined(__amd64__)) +#define __x86__ // MSVC doesn't support inline assembly in x64 +#endif +#endif + auto &arch = args["arch"]; #if defined(__x86_64__) || defined(__amd64__) arch = "x86_64"; From 950f33bd3ffe154290cec27623d9e6da2b419ebb Mon Sep 17 00:00:00 2001 From: baiyfcu Date: Fri, 17 Mar 2023 02:04:00 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E6=96=B0=E5=A2=9Ewindows=E4=B8=AD=5FM=5F?= =?UTF-8?q?ARM64=20=5FM=5FARM=20=5FM=5FX64=20CPU=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E9=9B=86=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/HttpRequester.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Http/HttpRequester.cpp b/src/Http/HttpRequester.cpp index 8fd9807e..e6e91378 100644 --- a/src/Http/HttpRequester.cpp +++ b/src/Http/HttpRequester.cpp @@ -117,13 +117,25 @@ static std::string httpBody() { #if (defined(__amd64__) && !defined(__amd64)) #define __amd64 #endif + +#if (defined(_M_ARM64) && !defined(__arm64__)) +#define __arm64__ +#endif + +#if (defined(_M_X64) && !defined(__x86_64__)) +#define __x86_64__ +#endif + +#if (defined(_M_ARM) && !defined(__arm__)) +#define __arm__ +#endif #if (defined(__i386__) || defined(__amd64__)) && (!defined(__x86__)) #if !(defined(_MSC_VER) && defined(__amd64__)) #define __x86__ // MSVC doesn't support inline assembly in x64 #endif #endif - + auto &arch = args["arch"]; #if defined(__x86_64__) || defined(__amd64__) arch = "x86_64"; From cf342a6fdf9167e97b768f6bc55b846679b392c3 Mon Sep 17 00:00:00 2001 From: Leonnash <354573339@qq.com> Date: Wed, 22 Mar 2023 15:52:56 +0800 Subject: [PATCH 09/11] Update WebApi.cpp --- server/WebApi.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 887b1736..113df96f 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -537,7 +537,7 @@ void addStreamProxy(const string &vhost, const string &app, const string &stream return; } //添加拉流代理 - auto player = std::make_shared(vhost, app, stream, option, retry_count ? retry_count : -1); + auto player = std::make_shared(vhost, app, stream, option, retry_count >=0 ? retry_count : -1); s_proxyMap[key] = player; //指定RTP over TCP(播放rtsp时有效) @@ -952,7 +952,7 @@ void installWebApi() { } //添加推流代理 - PusherProxy::Ptr pusher(new PusherProxy(src, retry_count ? retry_count : -1)); + PusherProxy::Ptr pusher(new PusherProxy(src, retry_count>=0 ? retry_count : -1)); s_proxyPusherMap[key] = pusher; //指定RTP over TCP(播放rtsp时有效) @@ -988,12 +988,13 @@ void installWebApi() { CHECK_SECRET(); CHECK_ARGS("schema", "vhost", "app", "stream", "dst_url"); auto dst_url = allArgs["dst_url"]; + auto retry_count = allArgs["retry_count"].empty()? -1: allArgs["retry_count"].as(); addStreamPusherProxy(allArgs["schema"], allArgs["vhost"], allArgs["app"], allArgs["stream"], allArgs["dst_url"], - allArgs["retry_count"], + retry_count, allArgs["rtp_type"], allArgs["timeout_sec"], [invoker, val, headerOut, dst_url](const SockException &ex, const string &key) mutable { @@ -1024,12 +1025,12 @@ void installWebApi() { CHECK_ARGS("vhost","app","stream","url"); ProtocolOption option(allArgs); - + auto retry_count = allArgs["retry_count"].empty()? -1: allArgs["retry_count"].as(); addStreamProxy(allArgs["vhost"], allArgs["app"], allArgs["stream"], allArgs["url"], - allArgs["retry_count"], + retry_count, option, allArgs["rtp_type"], allArgs["timeout_sec"], From dfd37ff3500d3bad11ffc05389431aa28efa6e78 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Wed, 22 Mar 2023 21:18:46 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=88=B3=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9B=B8=E5=AF=B9=E6=97=B6=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Stamp.cpp | 9 +++++++++ src/Common/Stamp.h | 3 +++ 2 files changed, 12 insertions(+) diff --git a/src/Common/Stamp.cpp b/src/Common/Stamp.cpp index 75f818be..df7f7368 100644 --- a/src/Common/Stamp.cpp +++ b/src/Common/Stamp.cpp @@ -20,6 +20,15 @@ using namespace toolkit; namespace mediakit { +int64_t DeltaStamp::relativeStamp(int64_t stamp) { + _relative_stamp += deltaStamp(stamp); + return _relative_stamp; +} + +int64_t DeltaStamp::relativeStamp(){ + return _relative_stamp; +} + int64_t DeltaStamp::deltaStamp(int64_t stamp) { if(!_last_stamp){ //第一次计算时间戳增量,时间戳增量为0 diff --git a/src/Common/Stamp.h b/src/Common/Stamp.h index f943fc40..cc2dcae0 100644 --- a/src/Common/Stamp.h +++ b/src/Common/Stamp.h @@ -28,9 +28,12 @@ public: * @return 时间戳增量 */ int64_t deltaStamp(int64_t stamp); + int64_t relativeStamp(int64_t stamp); + int64_t relativeStamp(); private: int64_t _last_stamp = 0; + int64_t _relative_stamp = 0; }; //该类解决时间戳回环、回退问题 From 98ec6b68d99397f0fcbf78d61c7aca0de32081e2 Mon Sep 17 00:00:00 2001 From: mtdxc Date: Thu, 23 Mar 2023 14:46:45 +0800 Subject: [PATCH 11/11] =?UTF-8?q?HttpRequester=E6=94=AF=E6=8C=81=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=87=8D=E8=AF=95=E5=8A=9F=E8=83=BD(#2323)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/HttpRequester.cpp | 20 +++++++++++++++++++- src/Http/HttpRequester.h | 7 +++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Http/HttpRequester.cpp b/src/Http/HttpRequester.cpp index e6e91378..669d17fe 100644 --- a/src/Http/HttpRequester.cpp +++ b/src/Http/HttpRequester.cpp @@ -11,7 +11,7 @@ #include "HttpRequester.h" #include "Util/onceToken.h" #include "Util/NoticeCenter.h" - +#include using namespace std; using namespace toolkit; @@ -26,6 +26,17 @@ void HttpRequester::onResponseBody(const char *buf, size_t size) { } void HttpRequester::onResponseCompleted(const SockException &ex) { + if (ex && _retry++ < _max_retry) { + std::weak_ptr weak_self = std::dynamic_pointer_cast(shared_from_this()); + getPoller()->doDelayTask(_retry_delay, [weak_self](){ + if (auto self = weak_self.lock()) { + InfoL << "resend request " << self->getUrl() << " with retry " << self->getRetry(); + self->sendRequest(self->getUrl()); + } + return 0; + }); + return ; + } const_cast(response()).setContent(std::move(_res_body)); if (_on_result) { _on_result(ex, response()); @@ -33,8 +44,15 @@ void HttpRequester::onResponseCompleted(const SockException &ex) { } } +void HttpRequester::setRetry(size_t count, size_t delay) { + InfoL << "setRetry max=" << count << ", delay=" << delay; + _max_retry = count; + _retry_delay = delay; +} + void HttpRequester::startRequester(const string &url, const HttpRequesterResult &on_result, float timeout_sec) { _on_result = on_result; + _retry = 0; setCompleteTimeout(timeout_sec * 1000); sendRequest(url); } diff --git a/src/Http/HttpRequester.h b/src/Http/HttpRequester.h index 69dd05a6..067bb0e8 100644 --- a/src/Http/HttpRequester.h +++ b/src/Http/HttpRequester.h @@ -25,6 +25,10 @@ public: void setOnResult(const HttpRequesterResult &onResult); void startRequester(const std::string &url, const HttpRequesterResult &on_result, float timeout_sec = 10); + void setRetry(size_t count, size_t delay); + size_t getRetry() const { return _retry; } + size_t getRetryDelay() const { return _retry_delay; } + size_t getMaxRetry() const { return _max_retry; } void clear() override; private: @@ -33,6 +37,9 @@ private: void onResponseCompleted(const toolkit::SockException &ex) override; private: + size_t _retry = 0; + size_t _max_retry = 0; + size_t _retry_delay = 2000; // ms std::string _res_body; HttpRequesterResult _on_result; };