For #1575, use RTMP redirect as tcUrl and redirect2 as RTMP URL. 3.0.100

pull/1587/head^2
winlin 5 years ago
parent 7240fe3040
commit 0e750ab3eb

@ -146,6 +146,7 @@ For previous versions, please read:
## V3 changes
* v3.0, 2020-01-16, For [#1575][bug #1575], use RTMP redirect as tcUrl and redirect2 as RTMP URL. 3.0.100
* v3.0, 2020-01-15, For [#1509][bug #1509], decrease the fast vector init size from 64KB to 64B. 3.0.99
* v3.0, 2020-01-15, For [#1509][bug #1509], release coroutine when source is idle. 3.0.98
* <strong>v3.0, 2020-01-10, [3.0 alpha8(3.0.97)][r3.0a8] released. 121555 lines.</strong>
@ -1595,6 +1596,7 @@ Winlin
[bug #1255]: https://github.com/ossrs/srs/issues/1255
[bug #1543]: https://github.com/ossrs/srs/issues/1543
[bug #1509]: https://github.com/ossrs/srs/issues/1509
[bug #1575]: https://github.com/ossrs/srs/issues/1575
[bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx
[exo #828]: https://github.com/google/ExoPlayer/pull/828

@ -416,9 +416,14 @@ srs_error_t SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg, stri
return err;
}
SrsAmf0Object* ex = prop->to_object();
if ((prop = ex->ensure_property_string("redirect")) == NULL) {
return err;
// The redirect is tcUrl while redirect2 is RTMP URL.
// https://github.com/ossrs/srs/issues/1575#issuecomment-574999798
if ((prop = ex->ensure_property_string("redirect2")) == NULL) {
// TODO: FIXME: Remove it when SRS3 released, it's temporarily support for SRS3 alpha versions(a0 to a8).
if ((prop = ex->ensure_property_string("redirect")) == NULL) {
return err;
}
}
redirect = prop->to_str();

@ -621,8 +621,10 @@ srs_error_t SrsRtmpConn::playing(SrsSource* source)
}
return srs_error_wrap(err, "discover coworkers, url=%s", url.c_str());
}
srs_trace("rtmp: redirect in cluster, from=%s:%d, target=%s:%d, url=%s",
req->host.c_str(), req->port, host.c_str(), port, url.c_str());
string rurl = srs_generate_rtmp_url(host, port, req->host, req->vhost, req->app, req->stream, req->param);
srs_trace("rtmp: redirect in cluster, from=%s:%d, target=%s:%d, url=%s, rurl=%s",
req->host.c_str(), req->port, host.c_str(), port, url.c_str(), rurl.c_str());
// Ignore if host or port is invalid.
if (host.empty() || port == 0) {
@ -630,7 +632,7 @@ srs_error_t SrsRtmpConn::playing(SrsSource* source)
}
bool accepted = false;
if ((err = rtmp->redirect(req, host, port, accepted)) != srs_success) {
if ((err = rtmp->redirect(req, rurl, accepted)) != srs_success) {
srs_error_reset(err);
} else {
return srs_error_new(ERROR_CONTROL_REDIRECT, "redirected");

@ -217,7 +217,7 @@ void SrsFastVector::push_back(SrsSharedPtrMessage* msg)
for (int i = 0; i < nb_msgs; i++) {
buf[i] = msgs[i];
}
srs_warn("fast vector incrase %d=>%d", nb_msgs, size);
srs_info("fast vector incrase %d=>%d", nb_msgs, size);
// use new array.
srs_freepa(msgs);

@ -27,7 +27,7 @@
// The version config.
#define VERSION_MAJOR 3
#define VERSION_MINOR 0
#define VERSION_REVISION 99
#define VERSION_REVISION 100
// The macros generated by configure script.
#include <srs_auto_headers.hpp>

@ -2415,17 +2415,20 @@ srs_error_t SrsRtmpServer::response_connect_app(SrsRequest *req, const char* ser
}
#define SRS_RTMP_REDIRECT_TIMEOUT (3 * SRS_UTIME_SECONDS)
srs_error_t SrsRtmpServer::redirect(SrsRequest* r, string host, int port, bool& accepted)
srs_error_t SrsRtmpServer::redirect(SrsRequest* r, string url, bool& accepted)
{
srs_error_t err = srs_success;
if (true) {
string url = srs_generate_rtmp_url(host, port, r->host, r->vhost, r->app, r->stream, r->param);
SrsAmf0Object* ex = SrsAmf0Any::object();
ex->set("code", SrsAmf0Any::number(302));
ex->set("redirect", SrsAmf0Any::str(url.c_str()));
// The redirect is tcUrl while redirect2 is RTMP URL.
// https://github.com/ossrs/srs/issues/1575#issuecomment-574999798
string tcUrl = srs_path_dirname(url);
ex->set("redirect", SrsAmf0Any::str(tcUrl.c_str()));
ex->set("redirect2", SrsAmf0Any::str(url.c_str()));
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelError));

@ -707,9 +707,9 @@ public:
// @param server_ip the ip of server.
virtual srs_error_t response_connect_app(SrsRequest* req, const char* server_ip = NULL);
// Redirect the connection to another rtmp server.
// @param the hostname or ip of target.
// @param a RTMP url to redirect to.
// @param whether the client accept the redirect.
virtual srs_error_t redirect(SrsRequest* r, std::string host, int port, bool& accepted);
virtual srs_error_t redirect(SrsRequest* r, std::string url, bool& accepted);
// Reject the connect app request.
virtual void response_connect_reject(SrsRequest* req, const char* desc);
// Response client the onBWDone message.

@ -1751,7 +1751,8 @@ VOID TEST(ProtocolRTMPTest, ServerRedirect)
string host = "target.net";
int port = 8888;
bool accepted = false;
HELPER_EXPECT_SUCCESS(r.redirect(&req, host, port, accepted));
string rurl = srs_generate_rtmp_url(host, port, req.host, req.vhost, req.app, req.stream, req.param);
HELPER_EXPECT_SUCCESS(r.redirect(&req, rurl, accepted));
if (true) {
MockBufferIO tio;
@ -1776,6 +1777,14 @@ VOID TEST(ProtocolRTMPTest, ServerRedirect)
prop = ex->get_property("redirect");
ASSERT_TRUE(prop && prop->is_string());
// The recirect is tcUrl, not RTMP URL.
// https://github.com/ossrs/srs/issues/1575#issuecomment-574995475
EXPECT_STREQ("rtmp://target.net:8888/live", prop->to_str().c_str());
prop = ex->get_property("redirect2");
ASSERT_TRUE(prop && prop->is_string());
// The recirect2 is RTMP URL.
// https://github.com/ossrs/srs/issues/1575#issuecomment-574999798
EXPECT_STREQ("rtmp://target.net:8888/live/livestream", prop->to_str().c_str());
srs_freep(msg);
@ -1808,7 +1817,8 @@ VOID TEST(ProtocolRTMPTest, ServerRedirect)
string host = "target.net";
int port = 8888;
bool accepted = false;
HELPER_EXPECT_SUCCESS(r.redirect(&req, host, port, accepted));
string rurl = srs_generate_rtmp_url(host, port, req.host, req.vhost, req.app, req.stream, req.param);
HELPER_EXPECT_SUCCESS(r.redirect(&req, rurl, accepted));
EXPECT_TRUE(accepted);
if (true) {
@ -1834,6 +1844,14 @@ VOID TEST(ProtocolRTMPTest, ServerRedirect)
prop = ex->get_property("redirect");
ASSERT_TRUE(prop && prop->is_string());
// The recirect is tcUrl, not RTMP URL.
// https://github.com/ossrs/srs/issues/1575#issuecomment-574995475
EXPECT_STREQ("rtmp://target.net:8888/live", prop->to_str().c_str());
prop = ex->get_property("redirect2");
ASSERT_TRUE(prop && prop->is_string());
// The recirect2 is RTMP URL.
// https://github.com/ossrs/srs/issues/1575#issuecomment-574999798
EXPECT_STREQ("rtmp://target.net:8888/live/livestream", prop->to_str().c_str());
srs_freep(msg);

Loading…
Cancel
Save