From 974bed6b26ce36f68a323a06477f11cc20215489 Mon Sep 17 00:00:00 2001 From: Haibo Chen Date: Sat, 16 Oct 2021 07:50:47 +0800 Subject: [PATCH] API: Fix the same 'client_id' error when asynchronous call (#2665) --- trunk/src/app/srs_app_http_static.cpp | 21 ++++-- trunk/src/app/srs_app_rtc_conn.cpp | 92 ++++++++++++++------------- 2 files changed, 66 insertions(+), 47 deletions(-) diff --git a/trunk/src/app/srs_app_http_static.cpp b/trunk/src/app/srs_app_http_static.cpp index bae3b78721..325280d163 100644 --- a/trunk/src/app/srs_app_http_static.cpp +++ b/trunk/src/app/srs_app_http_static.cpp @@ -37,6 +37,7 @@ using namespace std; #include #include #include +#include #define SRS_CONTEXT_IN_HLS "hls_ctx" @@ -194,6 +195,12 @@ srs_error_t SrsVodStream::serve_m3u8_ctx(ISrsHttpResponseWriter * w, ISrsHttpMes srs_assert(hr); SrsRequest* req = hr->to_request(hr->host())->as_http(); + // discovery vhost, resolve the vhost from config + SrsConfDirective* parsed_vhost = _srs_config->get_vhost(req->vhost); + if (parsed_vhost) { + req->vhost = parsed_vhost->arg0(); + } + SrsAutoFree(SrsRequest, req); string ctx = hr->query_get(SRS_CONTEXT_IN_HLS); @@ -202,16 +209,19 @@ srs_error_t SrsVodStream::serve_m3u8_ctx(ISrsHttpResponseWriter * w, ISrsHttpMes return SrsHttpFileServer::serve_m3u8_ctx(w, r, fullpath); } - if ((err = http_hooks_on_play(req)) != srs_success) { - return srs_error_wrap(err, "HLS: http_hooks_on_play"); - } - if (ctx.empty()) { // make sure unique do { ctx = srs_random_str(8); // the same as cid } while (ctx_is_exist(ctx)); } + + SrsContextRestore(_srs_context->get_id()); + _srs_context->set_id(SrsContextId().set_value(ctx)); + + if ((err = http_hooks_on_play(req)) != srs_success) { + return srs_error_wrap(err, "HLS: http_hooks_on_play"); + } std::stringstream ss; ss << "#EXTM3U" << SRS_CONSTS_LF; @@ -339,6 +349,9 @@ srs_error_t SrsVodStream::on_timer(srs_utime_t interval) SrsRequest* req = it->second.req; srs_utime_t hls_window = _srs_config->get_hls_window(req->vhost); if (it->second.request_time + (2 * hls_window) < srs_get_system_time()) { + SrsContextRestore(_srs_context->get_id()); + _srs_context->set_id(SrsContextId().set_value(ctx)); + http_hooks_on_stop(req); srs_freep(req); diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 1d4bd742b4..97785087a5 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -351,22 +351,22 @@ srs_error_t SrsRtcPLIWorker::cycle() return err; } - -SrsRtcAsyncCallOnStop::SrsRtcAsyncCallOnStop(SrsContextId c, SrsRequest * r) -{ + +SrsRtcAsyncCallOnStop::SrsRtcAsyncCallOnStop(SrsContextId c, SrsRequest * r) +{ cid = c; - req = r->copy(); -} - -SrsRtcAsyncCallOnStop::~SrsRtcAsyncCallOnStop() -{ - srs_freep(req); -} - -srs_error_t SrsRtcAsyncCallOnStop::call() -{ - srs_error_t err = srs_success; - + req = r->copy(); +} + +SrsRtcAsyncCallOnStop::~SrsRtcAsyncCallOnStop() +{ + srs_freep(req); +} + +srs_error_t SrsRtcAsyncCallOnStop::call() +{ + srs_error_t err = srs_success; + if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return err; } @@ -386,17 +386,20 @@ srs_error_t SrsRtcAsyncCallOnStop::call() hooks = conf->args; } + SrsContextRestore(_srs_context->get_id()); + _srs_context->set_id(cid); + for (int i = 0; i < (int)hooks.size(); i++) { std::string url = hooks.at(i); SrsHttpHooks::on_stop(url, req); } - return err; -} - -std::string SrsRtcAsyncCallOnStop::to_string() -{ - return std::string(""); + return err; +} + +std::string SrsRtcAsyncCallOnStop::to_string() +{ + return std::string(""); } SrsRtcPlayStream::SrsRtcPlayStream(SrsRtcConnection* s, const SrsContextId& cid) @@ -997,21 +1000,21 @@ srs_error_t SrsRtcPublishTwccTimer::on_timer(srs_utime_t interval) } -SrsRtcAsyncCallOnUnpublish::SrsRtcAsyncCallOnUnpublish(SrsContextId c, SrsRequest * r) -{ +SrsRtcAsyncCallOnUnpublish::SrsRtcAsyncCallOnUnpublish(SrsContextId c, SrsRequest * r) +{ cid = c; - req = r->copy(); -} - -SrsRtcAsyncCallOnUnpublish::~SrsRtcAsyncCallOnUnpublish() -{ - srs_freep(req); -} - -srs_error_t SrsRtcAsyncCallOnUnpublish::call() -{ - srs_error_t err = srs_success; - + req = r->copy(); +} + +SrsRtcAsyncCallOnUnpublish::~SrsRtcAsyncCallOnUnpublish() +{ + srs_freep(req); +} + +srs_error_t SrsRtcAsyncCallOnUnpublish::call() +{ + srs_error_t err = srs_success; + if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return err; } @@ -1031,17 +1034,20 @@ srs_error_t SrsRtcAsyncCallOnUnpublish::call() hooks = conf->args; } + SrsContextRestore(_srs_context->get_id()); + _srs_context->set_id(cid); + for (int i = 0; i < (int)hooks.size(); i++) { std::string url = hooks.at(i); SrsHttpHooks::on_unpublish(url, req); - } - - return err; -} - -std::string SrsRtcAsyncCallOnUnpublish::to_string() -{ - return std::string(""); + } + + return err; +} + +std::string SrsRtcAsyncCallOnUnpublish::to_string() +{ + return std::string(""); } SrsRtcPublishStream::SrsRtcPublishStream(SrsRtcConnection* session, const SrsContextId& cid)