mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support token auth in connect args. 0.9.128
This commit is contained in:
parent
6ff193c989
commit
10953c9743
14 changed files with 218 additions and 98 deletions
|
@ -60,6 +60,8 @@ SRS_ARM_UBUNTU12=NO
|
|||
SRS_MIPS_UBUNTU12=NO
|
||||
# dev, open all features for dev, no gperf/prof/arm.
|
||||
SRS_DEV=NO
|
||||
# dev, open main server feature for dev, no bwtc/utest/research/librtmp
|
||||
SRS_FAST_DEV=NO
|
||||
# raspberry-pi, open hls/ssl/static
|
||||
SRS_PI=NO
|
||||
# cubieboard, donot open ffmpeg/nginx.
|
||||
|
@ -151,6 +153,7 @@ Presets:
|
|||
--rtmp-hls only support RTMP+HLS with ssl.
|
||||
--disable-all disable all features, only support vp6 RTMP.
|
||||
--dev for dev, open all features, no nginx/gperf/gprof/arm.
|
||||
--fast-dev for dev fast compile, the RTMP server, without bwtc/librtmp/utest/research.
|
||||
--full enable all features, no gperf/gprof/arm.
|
||||
|
||||
Conflicts:
|
||||
|
@ -232,6 +235,7 @@ function parse_user_option() {
|
|||
--pi) SRS_PI=YES ;;
|
||||
--cubie) SRS_CUBIE=YES ;;
|
||||
--dev) SRS_DEV=YES ;;
|
||||
--fast-dev) SRS_FAST_DEV=YES ;;
|
||||
--fast) SRS_FAST=YES ;;
|
||||
--disable-all) SRS_DISABLE_ALL=YES ;;
|
||||
--pure-rtmp) SRS_PURE_RTMP=YES ;;
|
||||
|
@ -282,12 +286,14 @@ function apply_user_presets() {
|
|||
if [ $SRS_DISABLE_ALL = NO ]; then
|
||||
if [ $SRS_ENABLE_ALL = NO ]; then
|
||||
if [ $SRS_DEV = NO ]; then
|
||||
if [ $SRS_ARM_UBUNTU12 = NO ]; then
|
||||
if [ $SRS_MIPS_UBUNTU12 = NO ]; then
|
||||
if [ $SRS_PI = NO ]; then
|
||||
if [ $SRS_CUBIE = NO ]; then
|
||||
if [ $SRS_X86_X64 = NO ]; then
|
||||
SRS_X86_X64=YES; opt="--x86-x64 $opt";
|
||||
if [ $SRS_FAST_DEV = NO ]; then
|
||||
if [ $SRS_ARM_UBUNTU12 = NO ]; then
|
||||
if [ $SRS_MIPS_UBUNTU12 = NO ]; then
|
||||
if [ $SRS_PI = NO ]; then
|
||||
if [ $SRS_CUBIE = NO ]; then
|
||||
if [ $SRS_X86_X64 = NO ]; then
|
||||
SRS_X86_X64=YES; opt="--x86-x64 $opt";
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
@ -534,6 +540,31 @@ function apply_user_presets() {
|
|||
SRS_STATIC=NO
|
||||
fi
|
||||
|
||||
# if fast dev specified, open main server features.
|
||||
if [ $SRS_FAST_DEV = YES ]; then
|
||||
SRS_HLS=YES
|
||||
SRS_DVR=YES
|
||||
SRS_NGINX=NO
|
||||
SRS_SSL=YES
|
||||
SRS_FFMPEG_TOOL=NO
|
||||
SRS_TRANSCODE=YES
|
||||
SRS_INGEST=YES
|
||||
SRS_HTTP_PARSER=YES
|
||||
SRS_HTTP_CALLBACK=YES
|
||||
SRS_HTTP_SERVER=YES
|
||||
SRS_HTTP_API=YES
|
||||
SRS_LIBRTMP=NO
|
||||
SRS_BWTC=NO
|
||||
SRS_RESEARCH=NO
|
||||
SRS_UTEST=NO
|
||||
SRS_GPERF=NO
|
||||
SRS_GPERF_MC=NO
|
||||
SRS_GPERF_MP=NO
|
||||
SRS_GPERF_CP=NO
|
||||
SRS_GPROF=NO
|
||||
SRS_STATIC=NO
|
||||
fi
|
||||
|
||||
# if raspberry-pi specified, open ssl/hls/static features
|
||||
if [ $SRS_PI = YES ]; then
|
||||
SRS_HLS=YES
|
||||
|
|
|
@ -182,6 +182,12 @@ ok_msg "test \" ${item} \""
|
|||
ret=$?; if [[ $ret -ne 0 ]]; then failed_msg "test \" ${item} \" failed. ret=$ret"; exit $ret; fi
|
||||
ok_msg "test \" ${item} \" success"
|
||||
|
||||
item="./configure --fast-dev"
|
||||
ok_msg "test \" ${item} \""
|
||||
(./configure --dev && make) >>$log 2>&1
|
||||
ret=$?; if [[ $ret -ne 0 ]]; then failed_msg "test \" ${item} \" failed. ret=$ret"; exit $ret; fi
|
||||
ok_msg "test \" ${item} \" success"
|
||||
|
||||
item="./configure --full"
|
||||
ok_msg "test \" ${item} \""
|
||||
(./configure --dev && make) >>$log 2>&1
|
||||
|
|
|
@ -129,7 +129,7 @@ int SrsEdgeIngester::cycle()
|
|||
srs_error("handshake with server failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
if ((ret = client->connect_app(req->app, req->tcUrl)) != ERROR_SUCCESS) {
|
||||
if ((ret = client->connect_app(req->app, req->tcUrl, req)) != ERROR_SUCCESS) {
|
||||
srs_error("connect with server failed, tcUrl=%s. ret=%d", req->tcUrl.c_str(), ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -165,6 +165,11 @@ public:
|
|||
SrsPlayEdge();
|
||||
virtual ~SrsPlayEdge();
|
||||
public:
|
||||
/**
|
||||
* always use the req of source,
|
||||
* for we assume all client to edge is invalid,
|
||||
* if auth open, edge must valid it from origin, then service it.
|
||||
*/
|
||||
virtual int initialize(SrsSource* source, SrsRequest* req);
|
||||
/**
|
||||
* when client play stream on edge.
|
||||
|
|
|
@ -146,10 +146,10 @@ int SrsRtmpConn::do_cycle()
|
|||
srs_verbose("check vhost success.");
|
||||
|
||||
srs_trace("connect app, "
|
||||
"tcUrl=%s, pageUrl=%s, swfUrl=%s, schema=%s, vhost=%s, port=%s, app=%s",
|
||||
"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(),
|
||||
req->schema.c_str(), req->vhost.c_str(), req->port.c_str(),
|
||||
req->app.c_str());
|
||||
req->app.c_str(), (req->args? "(obj)":"null"));
|
||||
|
||||
ret = service_cycle();
|
||||
http_hooks_on_close();
|
||||
|
|
|
@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
// current release version
|
||||
#define VERSION_MAJOR "0"
|
||||
#define VERSION_MINOR "9"
|
||||
#define VERSION_REVISION "127"
|
||||
#define VERSION_REVISION "128"
|
||||
#define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
|
||||
// server info.
|
||||
#define RTMP_SIG_SRS_KEY "SRS"
|
||||
|
|
|
@ -915,94 +915,15 @@ void srs_amf0_strict_array_append(srs_amf0_t amf0, srs_amf0_t value)
|
|||
obj->append(any);
|
||||
}
|
||||
|
||||
void __srs_fill_level_spaces(stringstream& ss, int level)
|
||||
{
|
||||
for (int i = 0; i < level; i++) {
|
||||
ss << " ";
|
||||
}
|
||||
}
|
||||
void __srs_amf0_do_print(SrsAmf0Any* any, stringstream& ss, int level)
|
||||
{
|
||||
if (any->is_boolean()) {
|
||||
ss << "Boolean " << (any->to_boolean()? "true":"false") << endl;
|
||||
} else if (any->is_number()) {
|
||||
ss << "Number " << std::fixed << any->to_number() << endl;
|
||||
} else if (any->is_string()) {
|
||||
ss << "String " << any->to_str() << endl;
|
||||
} else if (any->is_null()) {
|
||||
ss << "Null" << endl;
|
||||
} else if (any->is_ecma_array()) {
|
||||
SrsAmf0EcmaArray* obj = any->to_ecma_array();
|
||||
ss << "EcmaArray " << "(" << obj->count() << " items)" << endl;
|
||||
for (int i = 0; i < obj->count(); i++) {
|
||||
__srs_fill_level_spaces(ss, level + 1);
|
||||
ss << "Elem '" << obj->key_at(i) << "' ";
|
||||
if (obj->value_at(i)->is_complex_object()) {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, level + 1);
|
||||
} else {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, 0);
|
||||
}
|
||||
}
|
||||
} else if (any->is_strict_array()) {
|
||||
SrsAmf0StrictArray* obj = any->to_strict_array();
|
||||
ss << "StrictArray " << "(" << obj->count() << " items)" << endl;
|
||||
for (int i = 0; i < obj->count(); i++) {
|
||||
__srs_fill_level_spaces(ss, level + 1);
|
||||
ss << "Elem ";
|
||||
if (obj->at(i)->is_complex_object()) {
|
||||
__srs_amf0_do_print(obj->at(i), ss, level + 1);
|
||||
} else {
|
||||
__srs_amf0_do_print(obj->at(i), ss, 0);
|
||||
}
|
||||
}
|
||||
} else if (any->is_object()) {
|
||||
SrsAmf0Object* obj = any->to_object();
|
||||
ss << "Object " << "(" << obj->count() << " items)" << endl;
|
||||
for (int i = 0; i < obj->count(); i++) {
|
||||
__srs_fill_level_spaces(ss, level + 1);
|
||||
ss << "Property '" << obj->key_at(i) << "' ";
|
||||
if (obj->value_at(i)->is_complex_object()) {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, level + 1);
|
||||
} else {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ss << "Unknown" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize)
|
||||
{
|
||||
if (!amf0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
stringstream ss;
|
||||
|
||||
ss.precision(1);
|
||||
|
||||
SrsAmf0Any* any = (SrsAmf0Any*)amf0;
|
||||
|
||||
__srs_amf0_do_print(any, ss, 0);
|
||||
|
||||
string str = ss.str();
|
||||
if (str.empty()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* data = new char[str.length() + 1];
|
||||
memcpy(data, str.data(), str.length());
|
||||
data[str.length()] = 0;
|
||||
|
||||
if (pdata) {
|
||||
*pdata = data;
|
||||
}
|
||||
if (psize) {
|
||||
*psize = str.length();
|
||||
}
|
||||
|
||||
return data;
|
||||
return any->human_print(pdata, psize);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -244,9 +244,9 @@ srs_amf0_t srs_amf0_strict_array_property_at(srs_amf0_t amf0, int index);
|
|||
void srs_amf0_strict_array_append(srs_amf0_t amf0, srs_amf0_t value);
|
||||
/**
|
||||
* human readable print
|
||||
* @param pdata, output the heap data,
|
||||
* @param pdata, output the heap data, NULL to ignore.
|
||||
* user must use srs_amf0_free_bytes to free it.
|
||||
* @return return the *pdata for print.
|
||||
* @return return the *pdata for print. NULL to ignore.
|
||||
*/
|
||||
char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize);
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
using namespace std;
|
||||
|
||||
#include <srs_kernel_log.hpp>
|
||||
|
@ -330,6 +331,90 @@ bool SrsAmf0Any::is_object_eof()
|
|||
return marker == RTMP_AMF0_ObjectEnd;
|
||||
}
|
||||
|
||||
void __srs_fill_level_spaces(stringstream& ss, int level)
|
||||
{
|
||||
for (int i = 0; i < level; i++) {
|
||||
ss << " ";
|
||||
}
|
||||
}
|
||||
void __srs_amf0_do_print(SrsAmf0Any* any, stringstream& ss, int level)
|
||||
{
|
||||
if (any->is_boolean()) {
|
||||
ss << "Boolean " << (any->to_boolean()? "true":"false") << endl;
|
||||
} else if (any->is_number()) {
|
||||
ss << "Number " << std::fixed << any->to_number() << endl;
|
||||
} else if (any->is_string()) {
|
||||
ss << "String " << any->to_str() << endl;
|
||||
} else if (any->is_null()) {
|
||||
ss << "Null" << endl;
|
||||
} else if (any->is_ecma_array()) {
|
||||
SrsAmf0EcmaArray* obj = any->to_ecma_array();
|
||||
ss << "EcmaArray " << "(" << obj->count() << " items)" << endl;
|
||||
for (int i = 0; i < obj->count(); i++) {
|
||||
__srs_fill_level_spaces(ss, level + 1);
|
||||
ss << "Elem '" << obj->key_at(i) << "' ";
|
||||
if (obj->value_at(i)->is_complex_object()) {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, level + 1);
|
||||
} else {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, 0);
|
||||
}
|
||||
}
|
||||
} else if (any->is_strict_array()) {
|
||||
SrsAmf0StrictArray* obj = any->to_strict_array();
|
||||
ss << "StrictArray " << "(" << obj->count() << " items)" << endl;
|
||||
for (int i = 0; i < obj->count(); i++) {
|
||||
__srs_fill_level_spaces(ss, level + 1);
|
||||
ss << "Elem ";
|
||||
if (obj->at(i)->is_complex_object()) {
|
||||
__srs_amf0_do_print(obj->at(i), ss, level + 1);
|
||||
} else {
|
||||
__srs_amf0_do_print(obj->at(i), ss, 0);
|
||||
}
|
||||
}
|
||||
} else if (any->is_object()) {
|
||||
SrsAmf0Object* obj = any->to_object();
|
||||
ss << "Object " << "(" << obj->count() << " items)" << endl;
|
||||
for (int i = 0; i < obj->count(); i++) {
|
||||
__srs_fill_level_spaces(ss, level + 1);
|
||||
ss << "Property '" << obj->key_at(i) << "' ";
|
||||
if (obj->value_at(i)->is_complex_object()) {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, level + 1);
|
||||
} else {
|
||||
__srs_amf0_do_print(obj->value_at(i), ss, 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ss << "Unknown" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
char* SrsAmf0Any::human_print(char** pdata, int* psize)
|
||||
{
|
||||
stringstream ss;
|
||||
|
||||
ss.precision(1);
|
||||
|
||||
__srs_amf0_do_print(this, ss, 0);
|
||||
|
||||
string str = ss.str();
|
||||
if (str.empty()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* data = new char[str.length() + 1];
|
||||
memcpy(data, str.data(), str.length());
|
||||
data[str.length()] = 0;
|
||||
|
||||
if (pdata) {
|
||||
*pdata = data;
|
||||
}
|
||||
if (psize) {
|
||||
*psize = str.length();
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
SrsAmf0Any* SrsAmf0Any::str(const char* value)
|
||||
{
|
||||
return new __SrsAmf0String(value);
|
||||
|
|
|
@ -151,6 +151,14 @@ public:
|
|||
virtual int read(SrsStream* stream) = 0;
|
||||
virtual int write(SrsStream* stream) = 0;
|
||||
virtual SrsAmf0Any* copy() = 0;
|
||||
public:
|
||||
/**
|
||||
* human readable print
|
||||
* @param pdata, output the heap data, NULL to ignore.
|
||||
* user must use srs_amf0_free_bytes to free it.
|
||||
* @return return the *pdata for print. NULL to ignore.
|
||||
*/
|
||||
virtual char* human_print(char** pdata, int* psize);
|
||||
public:
|
||||
static SrsAmf0Any* str(const char* value = NULL);
|
||||
static SrsAmf0Any* boolean(bool value = false);
|
||||
|
|
|
@ -78,10 +78,12 @@ SrsRequest::SrsRequest()
|
|||
{
|
||||
objectEncoding = RTMP_SIG_AMF0_VER;
|
||||
duration = -1;
|
||||
args = NULL;
|
||||
}
|
||||
|
||||
SrsRequest::~SrsRequest()
|
||||
{
|
||||
srs_freep(args);
|
||||
}
|
||||
|
||||
SrsRequest* SrsRequest::copy()
|
||||
|
@ -99,6 +101,9 @@ SrsRequest* SrsRequest::copy()
|
|||
cp->tcUrl = tcUrl;
|
||||
cp->vhost = vhost;
|
||||
cp->duration = duration;
|
||||
if (args) {
|
||||
cp->args = args->copy()->to_object();
|
||||
}
|
||||
|
||||
return cp;
|
||||
}
|
||||
|
@ -451,7 +456,7 @@ int SrsRtmpClient::complex_handshake()
|
|||
return ret;
|
||||
}
|
||||
|
||||
int SrsRtmpClient::connect_app(string app, string tc_url)
|
||||
int SrsRtmpClient::connect_app(string app, string tc_url, SrsRequest* req)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
|
@ -461,16 +466,29 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
|
|||
|
||||
pkt->command_object->set("app", SrsAmf0Any::str(app.c_str()));
|
||||
pkt->command_object->set("flashVer", SrsAmf0Any::str("WIN 12,0,0,41"));
|
||||
pkt->command_object->set("swfUrl", SrsAmf0Any::str());
|
||||
if (req) {
|
||||
pkt->command_object->set("swfUrl", SrsAmf0Any::str(req->swfUrl.c_str()));
|
||||
} else {
|
||||
pkt->command_object->set("swfUrl", SrsAmf0Any::str());
|
||||
}
|
||||
pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str()));
|
||||
pkt->command_object->set("fpad", SrsAmf0Any::boolean(false));
|
||||
pkt->command_object->set("capabilities", SrsAmf0Any::number(239));
|
||||
pkt->command_object->set("audioCodecs", SrsAmf0Any::number(3575));
|
||||
pkt->command_object->set("videoCodecs", SrsAmf0Any::number(252));
|
||||
pkt->command_object->set("videoFunction", SrsAmf0Any::number(1));
|
||||
pkt->command_object->set("pageUrl", SrsAmf0Any::str());
|
||||
if (req) {
|
||||
pkt->command_object->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str()));
|
||||
} else {
|
||||
pkt->command_object->set("pageUrl", SrsAmf0Any::str());
|
||||
}
|
||||
pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0));
|
||||
|
||||
if (req && req->args) {
|
||||
srs_freep(pkt->args);
|
||||
pkt->args = req->args->copy()->to_object();
|
||||
}
|
||||
|
||||
if ((ret = protocol->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -825,6 +843,12 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
|
|||
req->objectEncoding = prop->to_number();
|
||||
}
|
||||
|
||||
if (pkt->args) {
|
||||
srs_freep(req->args);
|
||||
req->args = pkt->args->copy()->to_object();
|
||||
srs_info("copy edge traverse to origin auth args.");
|
||||
}
|
||||
|
||||
srs_info("get connect app message params success.");
|
||||
|
||||
return req->discovery_app();
|
||||
|
|
|
@ -43,6 +43,7 @@ class SrsOnMetaDataPacket;
|
|||
class SrsPlayPacket;
|
||||
class SrsMessage;
|
||||
class SrsPacket;
|
||||
class SrsAmf0Object;
|
||||
|
||||
/**
|
||||
* the original request from client.
|
||||
|
@ -74,6 +75,11 @@ public:
|
|||
// in ms.
|
||||
double duration;
|
||||
|
||||
// the token in the connect request,
|
||||
// used for edge traverse to origin authentication,
|
||||
// @see https://github.com/winlinvip/simple-rtmp-server/issues/104
|
||||
SrsAmf0Object* args;
|
||||
|
||||
SrsRequest();
|
||||
virtual ~SrsRequest();
|
||||
|
||||
|
@ -173,7 +179,10 @@ public:
|
|||
virtual int simple_handshake();
|
||||
// only use complex handshake
|
||||
virtual int complex_handshake();
|
||||
virtual int connect_app(std::string app, std::string tc_url);
|
||||
// set req to use the original request of client:
|
||||
// pageUrl and swfUrl for refer antisuck.
|
||||
// args for edge to origin traverse auth, @see SrsRequest.args
|
||||
virtual int connect_app(std::string app, std::string tc_url, SrsRequest* req=NULL);
|
||||
virtual int create_stream(int& stream_id);
|
||||
virtual int play(std::string stream, int stream_id);
|
||||
// flash publish schema:
|
||||
|
|
|
@ -1749,11 +1749,14 @@ SrsConnectAppPacket::SrsConnectAppPacket()
|
|||
command_name = RTMP_AMF0_COMMAND_CONNECT;
|
||||
transaction_id = 1;
|
||||
command_object = SrsAmf0Any::object();
|
||||
// optional
|
||||
args = NULL;
|
||||
}
|
||||
|
||||
SrsConnectAppPacket::~SrsConnectAppPacket()
|
||||
{
|
||||
srs_freep(command_object);
|
||||
srs_freep(args);
|
||||
}
|
||||
|
||||
int SrsConnectAppPacket::decode(SrsStream* stream)
|
||||
|
@ -1789,6 +1792,15 @@ int SrsConnectAppPacket::decode(SrsStream* stream)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (!stream->empty()) {
|
||||
srs_freep(args);
|
||||
args = SrsAmf0Any::object();
|
||||
if ((ret = args->read(stream)) != ERROR_SUCCESS) {
|
||||
srs_error("amf0 decode connect args failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
srs_info("amf0 decode connect packet success");
|
||||
|
||||
return ret;
|
||||
|
@ -1806,8 +1818,16 @@ int SrsConnectAppPacket::get_message_type()
|
|||
|
||||
int SrsConnectAppPacket::get_size()
|
||||
{
|
||||
return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
|
||||
+ SrsAmf0Size::object(command_object);
|
||||
int size = 0;
|
||||
|
||||
size += SrsAmf0Size::str(command_name);
|
||||
size += SrsAmf0Size::number();
|
||||
size += SrsAmf0Size::object(command_object);
|
||||
if (args) {
|
||||
size += SrsAmf0Size::object(args);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int SrsConnectAppPacket::encode_packet(SrsStream* stream)
|
||||
|
@ -1832,6 +1852,12 @@ int SrsConnectAppPacket::encode_packet(SrsStream* stream)
|
|||
}
|
||||
srs_verbose("encode command_object success.");
|
||||
|
||||
if (args && (ret = args->write(stream)) != ERROR_SUCCESS) {
|
||||
srs_error("encode args failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
srs_verbose("encode args success.");
|
||||
|
||||
srs_info("encode connect app request packet success.");
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -486,6 +486,11 @@ public:
|
|||
* so, directly use it, never alloc again.
|
||||
*/
|
||||
SrsAmf0Object* command_object;
|
||||
/**
|
||||
* Object
|
||||
* Any optional information
|
||||
*/
|
||||
SrsAmf0Object* args;
|
||||
public:
|
||||
SrsConnectAppPacket();
|
||||
virtual ~SrsConnectAppPacket();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue