From 061d544195214af11f0427434adcdd328d3e33b4 Mon Sep 17 00:00:00 2001 From: Matheus Macabu Date: Tue, 19 Oct 2021 02:20:28 +0200 Subject: [PATCH 1/2] RTMP: If port is explicity set to 0, use default 1935 (#1754). v4.0.181 --- trunk/doc/CHANGELOG.md | 1 + trunk/src/core/srs_core_version4.hpp | 2 +- trunk/src/kernel/srs_kernel_utility.cpp | 4 ++-- trunk/src/utest/srs_utest_kernel.cpp | 8 ++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index bd72a493a..c2665d786 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2021-10-19, Merge [#1754](https://github.com/ossrs/srs/pull/1754): RTMP: If port is explicity set to 0, use default 1935. v4.0.181 * v4.0, 2021-10-18, Merge [#2670](https://github.com/ossrs/srs/pull/2670): SRT: Solve mpegts demux assert bug. v4.0.180 * v4.0, 2021-10-16, Merge [#2665](https://github.com/ossrs/srs/pull/2665): API: Fix the same 'client_id' error when asynchronous call. v4.0.179 * v4.0, 2021-10-13, Merge [#2671](https://github.com/ossrs/srs/pull/2671): SRT: Pes error when mpegts demux in srt. v4.0.178 diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 61bdbb927..541d651f9 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 180 +#define VERSION_REVISION 181 #endif diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 7e783382b..8d59cbc9d 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -189,7 +189,7 @@ void srs_parse_hostport(string hostport, string& host, int& port) if (hostport.find(":") == pos) { host = hostport.substr(0, pos); string p = hostport.substr(pos + 1); - if (!p.empty()) { + if (!p.empty() && p != "0") { port = ::atoi(p.c_str()); } return; @@ -204,7 +204,7 @@ void srs_parse_hostport(string hostport, string& host, int& port) // For ipv6, [host]:port. host = hostport.substr(1, pos - 1); string p = hostport.substr(pos + 2); - if (!p.empty()) { + if (!p.empty() && p != "0") { port = ::atoi(p.c_str()); } } diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 872c98641..37ee0aa98 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -4570,6 +4570,14 @@ VOID TEST(KernelUtilityTest, CoverTimeUtilityAll) srs_parse_hostport("domain.com", host, port); EXPECT_STREQ("domain.com", host.c_str()); } + + if (true) { + string host; + int port = 1935; + srs_parse_hostport("domain.com:0", host, port); + EXPECT_EQ(1935, port); + EXPECT_STREQ("domain.com", host.c_str()); + } if (true) { string ep = srs_any_address_for_listener(); From 34b968aabfab055b86374a40b61039c22e9f30b0 Mon Sep 17 00:00:00 2001 From: xmedia-systems Date: Wed, 20 Oct 2021 08:57:40 +0800 Subject: [PATCH 2/2] JSON: Support escape special chars. (#1758) v4.0.182 --- trunk/doc/CHANGELOG.md | 1 + trunk/src/core/srs_core_version4.hpp | 2 +- trunk/src/protocol/srs_protocol_json.cpp | 28 +++++++--- trunk/src/utest/srs_utest_amf0.cpp | 66 ++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index c2665d786..a89078de2 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2021-10-20, Merge [#1758](https://github.com/ossrs/srs/pull/1758): JSON: Support escape special chars. v4.0.182 * v4.0, 2021-10-19, Merge [#1754](https://github.com/ossrs/srs/pull/1754): RTMP: If port is explicity set to 0, use default 1935. v4.0.181 * v4.0, 2021-10-18, Merge [#2670](https://github.com/ossrs/srs/pull/2670): SRT: Solve mpegts demux assert bug. v4.0.180 * v4.0, 2021-10-16, Merge [#2665](https://github.com/ossrs/srs/pull/2665): API: Fix the same 'client_id' error when asynchronous call. v4.0.179 diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 541d651f9..43cd0562b 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 181 +#define VERSION_REVISION 182 #endif diff --git a/trunk/src/protocol/srs_protocol_json.cpp b/trunk/src/protocol/srs_protocol_json.cpp index a6e91b8eb..c715be31d 100644 --- a/trunk/src/protocol/srs_protocol_json.cpp +++ b/trunk/src/protocol/srs_protocol_json.cpp @@ -1538,17 +1538,31 @@ SrsJsonArray* SrsJsonAny::to_array() return p; } -string escape(string v) +// @see https://github.com/ossrs/srs/pull/1758/files#diff-9568479ef5cb0aa1ade2381e11e9c066c01bf9c4bbed70ffa27094d08bb27380R370 +// @see https://github.com/json-parser/json-builder/blob/2d8c6671926d104c5dcd43ccd2b1431a3f0299e0/json-builder.c#L495 +string json_serialize_string(const string& v) { stringstream ss; - for (int i = 0; i < (int)v.length(); i++) { - if (v.at(i) == '"') { - ss << '\\'; + ss << "\""; + + const char* start = v.data(); + const char* end = start + v.length(); + for (const char* p = start; p < end; ++p) { + switch (*p) { + case '"': ss << '\\' << '"'; break; + case '\\': ss << '\\' << '\\'; break; + case '\b': ss << '\\' << 'b'; break; + case '\f': ss << '\\' << 'f'; break; + case '\n': ss << '\\' << 'n'; break; + case '\r': ss << '\\' << 'r'; break; + case '\t': ss << '\\' << 't'; break; + default: ss << *p; } - ss << v.at(i); } + ss << "\""; + return ss.str(); } @@ -1556,7 +1570,9 @@ string SrsJsonAny::dumps() { switch (marker) { case SRS_JSON_String: { - return "\"" + escape(to_str()) + "\""; + SrsJsonString* p = dynamic_cast(this); + srs_assert(p != NULL); + return json_serialize_string(p->value); } case SRS_JSON_Boolean: { return to_boolean()? "true" : "false"; diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index aa36d574e..e01b8e856 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -2626,6 +2626,72 @@ VOID TEST(ProtocolJSONTest, Dumps) } } +VOID TEST(ProtocolJSONTest, DumpsSpecialChars) +{ + if (true) { + SrsJsonAny* p = SrsJsonAny::str("hello"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"hello\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\"llo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\\"llo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\\llo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\\\llo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\nllo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\nllo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\tllo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\tllo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\bllo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\bllo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\fllo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\fllo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("he\rllo"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"he\\rllo\"", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonAny* p = SrsJsonAny::str("hello视频"); + EXPECT_TRUE(p->is_string()); + EXPECT_STREQ("\"hello\xE8\xA7\x86\xE9\xA2\x91\"", p->dumps().c_str()); + srs_freep(p); + } +} + VOID TEST(ProtocolJSONTest, Parse) { if (true) {