From 1721e4ea4b970bd8c6e8df30fe91077386e54011 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 13 Feb 2018 08:31:25 +0800 Subject: [PATCH 1/3] Fix #1059, support vhost in stream parameters. 2.0.246 --- README.md | 2 + trunk/src/app/srs_app_caster_flv.cpp | 2 +- trunk/src/app/srs_app_http_conn.cpp | 2 +- trunk/src/app/srs_app_mpegts_udp.cpp | 2 +- trunk/src/app/srs_app_rtmp_conn.cpp | 77 ++++++++------- trunk/src/app/srs_app_rtsp.cpp | 4 +- trunk/src/core/srs_core.hpp | 2 +- trunk/src/libs/srs_librtmp.cpp | 2 +- trunk/src/main/srs_main_ingest_hls.cpp | 2 +- trunk/src/protocol/srs_rtmp_stack.cpp | 2 +- trunk/src/protocol/srs_rtmp_utility.cpp | 3 +- trunk/src/protocol/srs_rtmp_utility.hpp | 5 +- trunk/src/utest/srs_utest_protocol.cpp | 123 ++++++++++++++++++++---- 13 files changed, 160 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 2049af95a1..34626e2400 100755 --- a/README.md +++ b/README.md @@ -332,6 +332,7 @@ Remark: ## History +* v2.0, 2018-02-13, Fix [#1059][bug #1059], support vhost in stream parameters. 2.0.246 * v2.0, 2018-01-07, Merge [#1045][bug #1045], fix [#1044][bug #1044], TCP connection alive detection. 2.0.245 * v2.0, 2018-01-04, Merge [#1039][bug #1039], fix bug of init.d script. * v2.0, 2018-01-01, Merge [#1033][bug #1033], allow user to add some specific flags. 2.0.244 @@ -1303,6 +1304,7 @@ Winlin [bug #1039]: https://github.com/ossrs/srs/issues/1039 [bug #1044]: https://github.com/ossrs/srs/issues/1044 [bug #1045]: https://github.com/ossrs/srs/issues/1045 +[bug #1059]: https://github.com/ossrs/srs/issues/1059 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/src/app/srs_app_caster_flv.cpp b/trunk/src/app/srs_app_caster_flv.cpp index 7932154659..445d33d949 100644 --- a/trunk/src/app/srs_app_caster_flv.cpp +++ b/trunk/src/app/srs_app_caster_flv.cpp @@ -284,7 +284,7 @@ int SrsDynamicHttpConn::connect() } srs_discovery_tc_url(req->tcUrl, - req->schema, req->host, req->vhost, req->app, req->port, + req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); } diff --git a/trunk/src/app/srs_app_http_conn.cpp b/trunk/src/app/srs_app_http_conn.cpp index 3e5a99c426..90845890df 100644 --- a/trunk/src/app/srs_app_http_conn.cpp +++ b/trunk/src/app/srs_app_http_conn.cpp @@ -865,7 +865,7 @@ SrsRequest* SrsHttpMessage::to_request(string vhost) req->objectEncoding = 0; srs_discovery_tc_url(req->tcUrl, - req->schema, req->host, req->vhost, req->app, req->port, + req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); req->strip(); diff --git a/trunk/src/app/srs_app_mpegts_udp.cpp b/trunk/src/app/srs_app_mpegts_udp.cpp index dd5149698e..f5abd40d12 100644 --- a/trunk/src/app/srs_app_mpegts_udp.cpp +++ b/trunk/src/app/srs_app_mpegts_udp.cpp @@ -628,7 +628,7 @@ int SrsMpegtsOverUdp::connect() } srs_discovery_tc_url(req->tcUrl, - req->schema, req->host, req->vhost, req->app, req->port, + req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); } diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index aa57842c37..58781768c4 100755 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -53,6 +53,7 @@ using namespace std; #include #include #include +#include // when stream is busy, for example, streaming is already // publishing, when a new client to request to publish, @@ -149,30 +150,6 @@ int SrsRtmpConn::do_cycle() // set client ip to request. req->ip = ip; - // discovery vhost, resolve the vhost from config - SrsConfDirective* parsed_vhost = _srs_config->get_vhost(req->vhost); - if (parsed_vhost) { - req->vhost = parsed_vhost->arg0(); - } - - srs_info("discovery app success. schema=%s, vhost=%s, port=%s, app=%s", - req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str()); - - if (req->schema.empty() || req->vhost.empty() || req->port.empty() || req->app.empty()) { - ret = ERROR_RTMP_REQ_TCURL; - srs_error("discovery tcUrl failed. " - "tcUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, ret=%d", - req->tcUrl.c_str(), req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str(), ret); - return ret; - } - - // check vhost - if ((ret = check_vhost()) != ERROR_SUCCESS) { - srs_error("check vhost failed. ret=%d", ret); - return ret; - } - srs_verbose("check vhost success."); - srs_trace("connect app, " "tcUrl=%s, pageUrl=%s, swfUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, args=%s", req->tcUrl.c_str(), req->pageUrl.c_str(), req->swfUrl.c_str(), @@ -376,19 +353,6 @@ int SrsRtmpConn::service_cycle() return bandwidth->bandwidth_check(rtmp, skt, req, local_ip); } - // do token traverse before serve it. - // @see https://github.com/ossrs/srs/pull/239 - if (true) { - bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); - bool edge_traverse = _srs_config->get_vhost_edge_token_traverse(req->vhost); - if (vhost_is_edge && edge_traverse) { - if ((ret = check_edge_token_traverse_auth()) != ERROR_SUCCESS) { - srs_warn("token auth failed, ret=%d", ret); - return ret; - } - } - } - // set chunk size to larger. // set the chunk size before any larger response greater than 128, // to make OBS happy, @see https://github.com/ossrs/srs/issues/454 @@ -471,10 +435,49 @@ int SrsRtmpConn::stream_service_cycle() } return ret; } + + srs_discovery_tc_url(req->tcUrl, req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); req->strip(); srs_trace("client identified, type=%s, stream_name=%s, duration=%.2f", srs_client_type_string(type).c_str(), req->stream.c_str(), req->duration); + // discovery vhost, resolve the vhost from config + SrsConfDirective* parsed_vhost = _srs_config->get_vhost(req->vhost); + if (parsed_vhost) { + req->vhost = parsed_vhost->arg0(); + } + + if (req->schema.empty() || req->vhost.empty() || req->port.empty() || req->app.empty()) { + ret = ERROR_RTMP_REQ_TCURL; + srs_error("discovery tcUrl failed. " + "tcUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, ret=%d", + req->tcUrl.c_str(), req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str(), ret); + return ret; + } + + if ((ret = check_vhost()) != ERROR_SUCCESS) { + srs_error("check vhost failed. ret=%d", ret); + return ret; + } + + srs_trace("connected stream, tcUrl=%s, pageUrl=%s, swfUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, stream=%s, args=%s", + req->tcUrl.c_str(), req->pageUrl.c_str(), req->swfUrl.c_str(), + req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), + req->app.c_str(), req->stream.c_str(), (req->args? "(obj)":"null")); + + // do token traverse before serve it. + // @see https://github.com/ossrs/srs/pull/239 + if (true) { + bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); + bool edge_traverse = _srs_config->get_vhost_edge_token_traverse(req->vhost); + if (vhost_is_edge && edge_traverse) { + if ((ret = check_edge_token_traverse_auth()) != ERROR_SUCCESS) { + srs_warn("token auth failed, ret=%d", ret); + return ret; + } + } + } + // security check if ((ret = security->check(type, ip, req)) != ERROR_SUCCESS) { srs_error("security check failed. ret=%d", ret); diff --git a/trunk/src/app/srs_app_rtsp.cpp b/trunk/src/app/srs_app_rtsp.cpp index ace19f2882..a330fa68bb 100644 --- a/trunk/src/app/srs_app_rtsp.cpp +++ b/trunk/src/app/srs_app_rtsp.cpp @@ -654,7 +654,7 @@ int SrsRtspConn::connect() req = new SrsRequest(); std::string schema, host, vhost, app, port, param; - srs_discovery_tc_url(rtsp_tcUrl, schema, host, vhost, app, port, param); + srs_discovery_tc_url(rtsp_tcUrl, schema, host, vhost, app, rtsp_stream, port, param); // generate output by template. std::string output = output_template; @@ -671,7 +671,7 @@ int SrsRtspConn::connect() } srs_discovery_tc_url(req->tcUrl, - req->schema, req->host, req->vhost, req->app, req->port, + req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); } diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index baa61b9282..a5f165dac8 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 245 +#define VERSION_REVISION 246 // generated by configure, only macros. #include diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index e22ebc2102..03b8c1544c 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -482,7 +482,7 @@ int srs_librtmp_context_parse_uri(Context* context) std::string schema; srs_discovery_tc_url(context->tcUrl, - schema, context->host, context->vhost, context->app, context->port, + schema, context->host, context->vhost, context->app, context->stream, context->port, context->param); return ret; diff --git a/trunk/src/main/srs_main_ingest_hls.cpp b/trunk/src/main/srs_main_ingest_hls.cpp index 3321e29c85..7480fb0db3 100644 --- a/trunk/src/main/srs_main_ingest_hls.cpp +++ b/trunk/src/main/srs_main_ingest_hls.cpp @@ -1236,7 +1236,7 @@ int SrsIngestSrsOutput::connect() } srs_discovery_tc_url(req->tcUrl, - req->schema, req->host, req->vhost, req->app, req->port, + req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); } diff --git a/trunk/src/protocol/srs_rtmp_stack.cpp b/trunk/src/protocol/srs_rtmp_stack.cpp index 0c929d94cf..8095092cc0 100644 --- a/trunk/src/protocol/srs_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_rtmp_stack.cpp @@ -2515,7 +2515,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req) srs_info("get connect app message params success."); srs_discovery_tc_url(req->tcUrl, - req->schema, req->host, req->vhost, req->app, req->port, + req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); req->strip(); diff --git a/trunk/src/protocol/srs_rtmp_utility.cpp b/trunk/src/protocol/srs_rtmp_utility.cpp index a1a1b74266..fdbaddb05d 100644 --- a/trunk/src/protocol/srs_rtmp_utility.cpp +++ b/trunk/src/protocol/srs_rtmp_utility.cpp @@ -43,7 +43,7 @@ using namespace std; void srs_discovery_tc_url( string tcUrl, string& schema, string& host, string& vhost, - string& app, string& port, std::string& param + string& app, string& stream, string& port, std::string& param ) { size_t pos = std::string::npos; std::string url = tcUrl; @@ -70,6 +70,7 @@ void srs_discovery_tc_url( app = url; vhost = host; srs_vhost_resolve(vhost, app, param); + srs_vhost_resolve(vhost, stream, param); } void srs_vhost_resolve(string& vhost, string& app, string& param) diff --git a/trunk/src/protocol/srs_rtmp_utility.hpp b/trunk/src/protocol/srs_rtmp_utility.hpp index 3efcaafd99..9344410c59 100644 --- a/trunk/src/protocol/srs_rtmp_utility.hpp +++ b/trunk/src/protocol/srs_rtmp_utility.hpp @@ -54,11 +54,14 @@ class ISrsProtocolReaderWriter; * @param port, for example, 19350 * default to 1935 if not specified. * param param, for example, vhost=vhost.ossrs.net +* @remark The param stream is input and output param, that is: +* input: tcUrl+stream +* output: schema, host, vhost, app, stream, port, param */ extern void srs_discovery_tc_url( std::string tcUrl, std::string& schema, std::string& host, std::string& vhost, - std::string& app, std::string& port, std::string& param + std::string& app, std::string& stream, std::string& port, std::string& param ); /** diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index e5a47498c1..9bd2cc3f71 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -461,40 +461,123 @@ VOID TEST(ProtocolUtilityTest, VhostResolve) */ VOID TEST(ProtocolUtilityTest, DiscoveryTcUrl) { - std::string tcUrl; - std::string schema; std::string host; std::string vhost; - std::string app; std::string port; std::string param; + std::string tcUrl, schema, ip, vhost, app, stream, port, param; - tcUrl = "rtmp://127.0.0.1:1935/live"; - srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port, param); + // general url + tcUrl = "rtmp://winlin.cn/live"; stream= "show"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); EXPECT_STREQ("rtmp", schema.c_str()); - EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("winlin.cn", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); + EXPECT_STREQ("1935", port.c_str()); + + tcUrl = "rtmp://winlin.cn:19351/live"; stream= "show"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("winlin.cn", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); + EXPECT_STREQ("19351", port.c_str()); + + tcUrl = "rtmp://winlin.cn/live"; stream= "show?key=abc"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("winlin.cn", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); + EXPECT_STREQ("1935", port.c_str()); + EXPECT_STREQ("?key=abc", param.c_str()); + + tcUrl = "rtmp://winlin.cn/live"; stream= "show?key=abc&&vhost=demo.com"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("demo.com", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); + EXPECT_STREQ("1935", port.c_str()); + EXPECT_STREQ("?key=abc&&vhost=demo.com", param.c_str()); + + // vhost in app + tcUrl = "rtmp://winlin.cn/live?key=abc"; stream= "show"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("winlin.cn", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); + EXPECT_STREQ("1935", port.c_str()); + EXPECT_STREQ("?key=abc", param.c_str()); + + tcUrl = "rtmp://winlin.cn/live?key=abc&&vhost=demo.com"; stream= "show"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("demo.com", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); + EXPECT_STREQ("1935", port.c_str()); + EXPECT_STREQ("?key=abc&&vhost=demo.com", param.c_str()); + + // without stream + tcUrl = "rtmp://winlin.cn/live"; stream=""; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("winlin.cn", ip.c_str()); + EXPECT_STREQ("winlin.cn", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("", stream.c_str()); + EXPECT_STREQ("1935", port.c_str()); + + tcUrl = "rtmp://127.0.0.1:1935/live"; stream=""; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("127.0.0.1", ip.c_str()); EXPECT_STREQ("127.0.0.1", vhost.c_str()); EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("", stream.c_str()); EXPECT_STREQ("1935", port.c_str()); - tcUrl = "rtmp://127.0.0.1:19351/live"; - srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port, param); + tcUrl = "rtmp://127.0.0.1:19351/live"; stream=""; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); EXPECT_STREQ("rtmp", schema.c_str()); - EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("127.0.0.1", ip.c_str()); EXPECT_STREQ("127.0.0.1", vhost.c_str()); EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("", stream.c_str()); EXPECT_STREQ("19351", port.c_str()); - tcUrl = "rtmp://127.0.0.1:19351/live?vhost=demo"; - srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port, param); + tcUrl = "rtmp://127.0.0.1:19351/live?vhost=demo"; stream=""; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); EXPECT_STREQ("rtmp", schema.c_str()); - EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("127.0.0.1", ip.c_str()); EXPECT_STREQ("demo", vhost.c_str()); EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("", stream.c_str()); + EXPECT_STREQ("19351", port.c_str()); + + // no vhost + tcUrl = "rtmp://127.0.0.1:19351/live"; stream= "show"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("127.0.0.1", ip.c_str()); + EXPECT_STREQ("127.0.0.1", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); EXPECT_STREQ("19351", port.c_str()); - tcUrl = "rtmp://127.0.0.1:19351/live/show?vhost=demo"; - srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port, param); + // ip and vhost + tcUrl = "rtmp://127.0.0.1:19351/live"; stream= "show?vhost=demo"; + srs_discovery_tc_url(tcUrl, schema, ip, vhost, app, stream, port, param); EXPECT_STREQ("rtmp", schema.c_str()); - EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("127.0.0.1", ip.c_str()); EXPECT_STREQ("demo", vhost.c_str()); - EXPECT_STREQ("live/show", app.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("show", stream.c_str()); EXPECT_STREQ("19351", port.c_str()); } @@ -5405,7 +5488,7 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest) req.stream = "livestream"; srs_discovery_tc_url("rtmp://std.ossrs.net/live", - req.schema, req.host, req.vhost, req.app, req.port, param); + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); req.strip(); EXPECT_STREQ("rtmp", req.schema.c_str()); EXPECT_STREQ("std.ossrs.net", req.host.c_str()); @@ -5415,7 +5498,7 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest) req.stream = "livestream"; srs_discovery_tc_url("rtmp://s td.os srs.n et/li v e", - req.schema, req.host, req.vhost, req.app, req.port, param); + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); req.strip(); EXPECT_STREQ("rtmp", req.schema.c_str()); EXPECT_STREQ("std.ossrs.net", req.host.c_str()); @@ -5425,7 +5508,7 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest) req.stream = "livestream"; srs_discovery_tc_url("rtmp://s\ntd.o\rssrs.ne\nt/li\nve", - req.schema, req.host, req.vhost, req.app, req.port, param); + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); req.strip(); EXPECT_STREQ("rtmp", req.schema.c_str()); EXPECT_STREQ("std.ossrs.net", req.host.c_str()); @@ -5435,7 +5518,7 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest) req.stream = "livestream"; srs_discovery_tc_url("rtmp://std.ossrs.net/live ", - req.schema, req.host, req.vhost, req.app, req.port, param); + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); req.strip(); EXPECT_STREQ("rtmp", req.schema.c_str()); EXPECT_STREQ("std.ossrs.net", req.host.c_str()); From fd016ed91a60c5426eeba01f97c9ebf30522f1f7 Mon Sep 17 00:00:00 2001 From: RocFang Date: Wed, 28 Feb 2018 13:35:33 +0800 Subject: [PATCH 2/3] use hls->initialize to set req of hls (#1077) --- trunk/src/app/srs_app_hls.cpp | 8 ++++---- trunk/src/app/srs_app_hls.hpp | 2 +- trunk/src/app/srs_app_source.cpp | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 78fc5c2ba3..384cb7a9e8 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -1205,10 +1205,13 @@ int SrsHls::cycle() return ret; } -int SrsHls::initialize(SrsSource* s) +int SrsHls::initialize(SrsSource* s, SrsRequest* r) { int ret = ERROR_SUCCESS; + srs_assert(!_req); + _req = r->copy(); + source = s; if ((ret = muxer->initialize()) != ERROR_SUCCESS) { @@ -1222,9 +1225,6 @@ int SrsHls::on_publish(SrsRequest* req, bool fetch_sequence_header) { int ret = ERROR_SUCCESS; - srs_freep(_req); - _req = req->copy(); - // update the hls time, for hls_dispose. last_update_time = srs_get_system_time_ms(); diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp index 97790c81c9..960a295bb7 100644 --- a/trunk/src/app/srs_app_hls.hpp +++ b/trunk/src/app/srs_app_hls.hpp @@ -391,7 +391,7 @@ class SrsHls /** * initialize the hls by handler and source. */ - virtual int initialize(SrsSource* s); + virtual int initialize(SrsSource* s, SrsRequest* r); /** * publish stream event, continue to write the m3u8, * for the muxer object not destroyed. diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 8b26dd72d3..6fdca502fd 100755 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1080,7 +1080,7 @@ int SrsSource::initialize(SrsRequest* r, ISrsSourceHandler* h) atc = _srs_config->get_atc(_req->vhost); #ifdef SRS_AUTO_HLS - if ((ret = hls->initialize(this)) != ERROR_SUCCESS) { + if ((ret = hls->initialize(this, _req)) != ERROR_SUCCESS) { return ret; } #endif @@ -2175,7 +2175,6 @@ int SrsSource::on_publish() } #endif - // TODO: FIXME: use initialize to set req. #ifdef SRS_AUTO_HLS if ((ret = hls->on_publish(_req, false)) != ERROR_SUCCESS) { srs_error("start hls failed. ret=%d", ret); From 0fe17c3e34ef4ffe504d8cf7ae0da82cbbe82631 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 28 Feb 2018 13:37:30 +0800 Subject: [PATCH 3/3] Merge #1077, fix crash for edge HLS. 2.0.247 --- README.md | 2 ++ trunk/src/core/srs_core.hpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 34626e2400..5e5d78fbfb 100755 --- a/README.md +++ b/README.md @@ -332,6 +332,7 @@ Remark: ## History +* v2.0, 2018-02-28, Merge [#1077][bug #1077], fix crash for edge HLS. 2.0.247 * v2.0, 2018-02-13, Fix [#1059][bug #1059], support vhost in stream parameters. 2.0.246 * v2.0, 2018-01-07, Merge [#1045][bug #1045], fix [#1044][bug #1044], TCP connection alive detection. 2.0.245 * v2.0, 2018-01-04, Merge [#1039][bug #1039], fix bug of init.d script. @@ -1305,6 +1306,7 @@ Winlin [bug #1044]: https://github.com/ossrs/srs/issues/1044 [bug #1045]: https://github.com/ossrs/srs/issues/1045 [bug #1059]: https://github.com/ossrs/srs/issues/1059 +[bug #1077]: https://github.com/ossrs/srs/issues/1077 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index a5f165dac8..cd0ab889ab 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 246 +#define VERSION_REVISION 247 // generated by configure, only macros. #include