2014-03-27 04:14:04 +00:00
|
|
|
/*
|
|
|
|
The MIT License (MIT)
|
|
|
|
|
2015-04-29 09:38:23 +00:00
|
|
|
Copyright (c) 2013-2015 SRS(simple-rtmp-server)
|
2014-03-27 04:14:04 +00:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
|
|
the Software without restriction, including without limitation the rights to
|
|
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
|
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
|
|
subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <srs_app_http_api.hpp>
|
|
|
|
|
2014-04-15 06:01:57 +00:00
|
|
|
#ifdef SRS_AUTO_HTTP_API
|
2014-04-01 08:06:32 +00:00
|
|
|
|
2014-04-02 04:55:10 +00:00
|
|
|
#include <sstream>
|
|
|
|
using namespace std;
|
|
|
|
|
2014-03-27 05:25:08 +00:00
|
|
|
#include <srs_kernel_log.hpp>
|
|
|
|
#include <srs_kernel_error.hpp>
|
2015-06-14 00:43:38 +00:00
|
|
|
#include <srs_app_st.hpp>
|
2014-04-02 04:55:10 +00:00
|
|
|
#include <srs_core_autofree.hpp>
|
2014-04-03 03:49:14 +00:00
|
|
|
#include <srs_app_json.hpp>
|
2014-04-19 13:23:34 +00:00
|
|
|
#include <srs_kernel_utility.hpp>
|
2014-05-17 06:53:04 +00:00
|
|
|
#include <srs_app_utility.hpp>
|
2015-01-04 14:47:12 +00:00
|
|
|
#include <srs_app_statistic.hpp>
|
2015-06-13 08:04:59 +00:00
|
|
|
#include <srs_rtmp_stack.hpp>
|
2015-02-21 13:17:59 +00:00
|
|
|
#include <srs_app_dvr.hpp>
|
|
|
|
#include <srs_app_config.hpp>
|
2015-05-22 14:34:03 +00:00
|
|
|
#include <srs_app_http_conn.hpp>
|
2014-03-27 05:25:08 +00:00
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiRoot::SrsGoApiRoot()
|
2014-04-02 10:07:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiRoot::~SrsGoApiRoot()
|
2014-04-02 10:07:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-02 10:07:34 +00:00
|
|
|
{
|
2014-04-03 03:49:14 +00:00
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_STR("api", "the api root")
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-02 11:10:22 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiApi::SrsGoApiApi()
|
2014-04-02 11:10:22 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiApi::~SrsGoApiApi()
|
2014-04-02 11:10:22 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-02 11:10:22 +00:00
|
|
|
{
|
2014-04-03 04:08:22 +00:00
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_STR("v1", "the api version 1.0")
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-03 04:08:22 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiV1::SrsGoApiV1()
|
2014-04-03 04:08:22 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiV1::~SrsGoApiV1()
|
2014-04-03 04:08:22 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-03 04:08:22 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_STR("versions", "the version of SRS") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("summaries", "the summary(pid, argv, pwd, cpu, mem) of SRS") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("rusages", "the rusage of SRS") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("self_proc_stats", "the self process stats") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("system_proc_stats", "the system process stats") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("meminfos", "the meminfo of system") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("authors", "the primary authors and contributors") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("requests", "the request itself, for http debug") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("vhosts", "dumps vhost to json") << SRS_JFIELD_CONT
|
2015-08-10 08:41:25 +00:00
|
|
|
<< SRS_JFIELD_STR("streams", "dumps streams to json") << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("errors", "always return an error 100.")
|
2015-03-21 02:25:03 +00:00
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-05-18 09:57:20 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-05-18 09:57:20 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiVersion::SrsGoApiVersion()
|
2014-05-18 09:57:20 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiVersion::~SrsGoApiVersion()
|
2014-05-18 09:57:20 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-03 04:08:22 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_ORG("major", VERSION_MAJOR) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("minor", VERSION_MINOR) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("revision", VERSION_REVISION) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("version", RTMP_SIG_SRS_VERSION)
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-04-03 05:48:52 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-19 13:23:34 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiSummaries::SrsGoApiSummaries()
|
2014-04-19 13:23:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiSummaries::~SrsGoApiSummaries()
|
2014-04-19 13:23:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiSummaries::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-19 13:23:34 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
2014-06-23 07:44:49 +00:00
|
|
|
srs_api_dump_summaries(ss);
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-19 13:23:34 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiRusages::SrsGoApiRusages()
|
2014-04-19 13:23:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiRusages::~SrsGoApiRusages()
|
2014-04-19 13:23:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* req)
|
2014-04-19 13:23:34 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
SrsRusage* r = srs_get_system_rusage();
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_ORG("ok", (r->ok? "true":"false")) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sample_time", r->sample_time) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_utime", r->r.ru_utime.tv_sec) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_stime", r->r.ru_stime.tv_sec) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_maxrss", r->r.ru_maxrss) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_ixrss", r->r.ru_ixrss) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_idrss", r->r.ru_idrss) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_isrss", r->r.ru_isrss) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_minflt", r->r.ru_minflt) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_majflt", r->r.ru_majflt) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_nswap", r->r.ru_nswap) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_inblock", r->r.ru_inblock) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_oublock", r->r.ru_oublock) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_msgsnd", r->r.ru_msgsnd) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_msgrcv", r->r.ru_msgrcv) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_nsignals", r->r.ru_nsignals) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_nvcsw", r->r.ru_nvcsw) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ru_nivcsw", r->r.ru_nivcsw)
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-04-19 13:23:34 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-19 13:43:13 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiSelfProcStats::SrsGoApiSelfProcStats()
|
2014-04-19 13:43:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiSelfProcStats::~SrsGoApiSelfProcStats()
|
2014-04-19 13:43:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-19 13:43:13 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
SrsProcSelfStat* u = srs_get_self_proc_stat();
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_ORG("ok", (u->ok? "true":"false")) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sample_time", u->sample_time) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("percent", u->percent) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("pid", u->pid) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("comm", u->comm) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("state", u->state) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("ppid", u->ppid) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("pgrp", u->pgrp) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("session", u->session) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("tty_nr", u->tty_nr) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("tpgid", u->tpgid) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("flags", u->flags) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("minflt", u->minflt) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("cminflt", u->cminflt) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("majflt", u->majflt) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("cmajflt", u->cmajflt) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("utime", u->utime) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("stime", u->stime) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("cutime", u->cutime) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("cstime", u->cstime) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("priority", u->priority) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("nice", u->nice) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("num_threads", u->num_threads) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("itrealvalue", u->itrealvalue) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("starttime", u->starttime) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("vsize", u->vsize) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("rss", u->rss) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("rsslim", u->rsslim) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("startcode", u->startcode) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("endcode", u->endcode) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("startstack", u->startstack) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("kstkesp", u->kstkesp) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("kstkeip", u->kstkeip) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("signal", u->signal) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("blocked", u->blocked) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sigignore", u->sigignore) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sigcatch", u->sigcatch) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("wchan", u->wchan) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("nswap", u->nswap) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("cnswap", u->cnswap) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("exit_signal", u->exit_signal) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("processor", u->processor) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("rt_priority", u->rt_priority) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("policy", u->policy) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("delayacct_blkio_ticks", u->delayacct_blkio_ticks) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("guest_time", u->guest_time) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("cguest_time", u->cguest_time)
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-04-19 13:43:13 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-19 13:43:13 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiSystemProcStats::SrsGoApiSystemProcStats()
|
2014-04-19 13:43:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiSystemProcStats::~SrsGoApiSystemProcStats()
|
2014-04-19 13:43:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-19 13:43:13 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
SrsProcSystemStat* s = srs_get_system_proc_stat();
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_ORG("ok", (s->ok? "true":"false")) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sample_time", s->sample_time) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("percent", s->percent) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("user", s->user) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("nice", s->nice) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sys", s->sys) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("idle", s->idle) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("iowait", s->iowait) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("irq", s->irq) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("softirq", s->softirq) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("steal", s->steal) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("guest", s->guest)
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-04-19 13:43:13 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-19 13:43:13 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiMemInfos::SrsGoApiMemInfos()
|
2014-04-19 16:15:26 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiMemInfos::~SrsGoApiMemInfos()
|
2014-04-19 16:15:26 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-19 16:15:26 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
SrsMemInfo* m = srs_get_meminfo();
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_ORG("ok", (m->ok? "true":"false")) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("sample_time", m->sample_time) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("percent_ram", m->percent_ram) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("percent_swap", m->percent_swap) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("MemActive", m->MemActive) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("RealInUse", m->RealInUse) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("NotInUse", m->NotInUse) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("MemTotal", m->MemTotal) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("MemFree", m->MemFree) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("Buffers", m->Buffers) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("Cached", m->Cached) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("SwapTotal", m->SwapTotal) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("SwapFree", m->SwapFree)
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-04-19 16:15:26 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2014-04-19 16:15:26 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiAuthors::SrsGoApiAuthors()
|
2014-04-03 05:48:52 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiAuthors::~SrsGoApiAuthors()
|
2014-04-03 05:48:52 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-03 05:48:52 +00:00
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_STR("primary", RTMP_SIG_SRS_PRIMARY) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("authors", RTMP_SIG_SRS_AUTHROS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("contributors_link", RTMP_SIG_SRS_CONTRIBUTORS_URL) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("contributors", SRS_AUTO_CONSTRIBUTORS)
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2014-04-03 04:08:22 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2015-01-17 13:58:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SrsGoApiRequests::SrsGoApiRequests()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SrsGoApiRequests::~SrsGoApiRequests()
|
|
|
|
{
|
2014-04-02 10:07:34 +00:00
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
2015-05-22 14:24:05 +00:00
|
|
|
ISrsHttpMessage* req = r;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
|
|
|
|
<< SRS_JFIELD_STR("uri", req->uri()) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("path", req->path()) << SRS_JFIELD_CONT;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
|
|
|
// method
|
|
|
|
if (req->is_http_get()) {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_STR("METHOD", "GET");
|
2015-01-17 13:58:23 +00:00
|
|
|
} else if (req->is_http_post()) {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_STR("METHOD", "POST");
|
2015-01-17 13:58:23 +00:00
|
|
|
} else if (req->is_http_put()) {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_STR("METHOD", "PUT");
|
2015-01-17 13:58:23 +00:00
|
|
|
} else if (req->is_http_delete()) {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_STR("METHOD", "DELETE");
|
2015-01-17 13:58:23 +00:00
|
|
|
} else {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_ORG("METHOD", req->method());
|
2015-01-17 13:58:23 +00:00
|
|
|
}
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_CONT;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
|
|
|
// request headers
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_NAME("headers") << SRS_JOBJECT_START;
|
2015-01-17 13:58:23 +00:00
|
|
|
for (int i = 0; i < req->request_header_count(); i++) {
|
|
|
|
std::string key = req->request_header_key_at(i);
|
|
|
|
std::string value = req->request_header_value_at(i);
|
|
|
|
if ( i < req->request_header_count() - 1) {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_STR(key, value) << SRS_JFIELD_CONT;
|
2015-01-17 13:58:23 +00:00
|
|
|
} else {
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_STR(key, value);
|
2015-01-17 13:58:23 +00:00
|
|
|
}
|
|
|
|
}
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_END << SRS_JFIELD_CONT;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
|
|
|
// server informations
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JFIELD_NAME("server") << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_STR("sigature", RTMP_SIG_SRS_KEY) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("name", RTMP_SIG_SRS_NAME) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("version", RTMP_SIG_SRS_VERSION) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("link", RTMP_SIG_SRS_URL) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("time", srs_get_system_time_ms())
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END
|
|
|
|
<< SRS_JOBJECT_END;
|
2015-01-17 13:58:23 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2015-01-03 04:57:13 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiVhosts::SrsGoApiVhosts()
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiVhosts::~SrsGoApiVhosts()
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
2015-01-05 04:49:00 +00:00
|
|
|
std::stringstream data;
|
|
|
|
SrsStatistic* stat = SrsStatistic::instance();
|
|
|
|
int ret = stat->dumps_vhosts(data);
|
2015-01-05 04:40:38 +00:00
|
|
|
|
2015-01-03 04:57:13 +00:00
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("vhosts", data.str())
|
|
|
|
<< SRS_JOBJECT_END;
|
2015-01-03 04:57:13 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2015-01-03 04:57:13 +00:00
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiStreams::SrsGoApiStreams()
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
SrsGoApiStreams::~SrsGoApiStreams()
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2015-01-03 04:57:13 +00:00
|
|
|
{
|
2015-01-05 04:49:00 +00:00
|
|
|
std::stringstream data;
|
|
|
|
SrsStatistic* stat = SrsStatistic::instance();
|
|
|
|
int ret = stat->dumps_streams(data);
|
2015-01-05 04:40:38 +00:00
|
|
|
|
2015-01-03 04:57:13 +00:00
|
|
|
std::stringstream ss;
|
|
|
|
|
2015-03-21 02:25:03 +00:00
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_ORG("streams", data.str())
|
|
|
|
<< SRS_JOBJECT_END;
|
2015-01-03 04:57:13 +00:00
|
|
|
|
2015-05-22 12:47:27 +00:00
|
|
|
return srs_http_response_json(w, ss.str());
|
2015-02-21 13:17:59 +00:00
|
|
|
}
|
|
|
|
|
2015-08-10 08:41:25 +00:00
|
|
|
SrsGoApiError::SrsGoApiError()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SrsGoApiError::~SrsGoApiError()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int SrsGoApiError::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
ss << SRS_JOBJECT_START
|
|
|
|
<< SRS_JFIELD_ERROR(100) << SRS_JFIELD_CONT
|
|
|
|
<< SRS_JFIELD_STR("msg", "SRS demo error.")
|
|
|
|
<< SRS_JOBJECT_END;
|
|
|
|
|
|
|
|
return srs_http_response_json(w, ss.str());
|
|
|
|
}
|
|
|
|
|
2015-05-03 15:34:59 +00:00
|
|
|
SrsHttpApi::SrsHttpApi(IConnectionManager* cm, st_netfd_t fd, SrsHttpServeMux* m)
|
|
|
|
: SrsConnection(cm, fd)
|
2014-03-27 05:25:08 +00:00
|
|
|
{
|
2015-01-17 13:58:23 +00:00
|
|
|
mux = m;
|
2014-04-02 04:55:10 +00:00
|
|
|
parser = new SrsHttpParser();
|
2015-02-21 13:17:59 +00:00
|
|
|
crossdomain_required = false;
|
2014-03-27 05:25:08 +00:00
|
|
|
}
|
|
|
|
|
2014-03-27 09:13:26 +00:00
|
|
|
SrsHttpApi::~SrsHttpApi()
|
2014-03-27 05:25:08 +00:00
|
|
|
{
|
2014-04-02 04:55:10 +00:00
|
|
|
srs_freep(parser);
|
2014-03-27 04:14:04 +00:00
|
|
|
}
|
|
|
|
|
2015-03-08 11:59:10 +00:00
|
|
|
void SrsHttpApi::resample()
|
2014-06-19 07:28:05 +00:00
|
|
|
{
|
|
|
|
// TODO: FIXME: implements it
|
|
|
|
}
|
|
|
|
|
|
|
|
int64_t SrsHttpApi::get_send_bytes_delta()
|
|
|
|
{
|
|
|
|
// TODO: FIXME: implements it
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int64_t SrsHttpApi::get_recv_bytes_delta()
|
|
|
|
{
|
|
|
|
// TODO: FIXME: implements it
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-03-08 11:59:10 +00:00
|
|
|
void SrsHttpApi::cleanup()
|
|
|
|
{
|
|
|
|
// TODO: FIXME: implements it
|
|
|
|
}
|
|
|
|
|
2014-03-27 09:13:26 +00:00
|
|
|
int SrsHttpApi::do_cycle()
|
2014-03-27 05:25:08 +00:00
|
|
|
{
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
2014-05-27 08:45:02 +00:00
|
|
|
srs_trace("api get peer ip success. ip=%s", ip.c_str());
|
2014-03-27 05:25:08 +00:00
|
|
|
|
2014-04-02 04:55:10 +00:00
|
|
|
// initialize parser
|
|
|
|
if ((ret = parser->initialize(HTTP_REQUEST)) != ERROR_SUCCESS) {
|
|
|
|
srs_error("api initialize http parser failed. ret=%d", ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
// underlayer socket
|
2014-07-26 12:08:37 +00:00
|
|
|
SrsStSocket skt(stfd);
|
2014-04-02 04:55:10 +00:00
|
|
|
|
2015-05-22 05:57:04 +00:00
|
|
|
// set the recv timeout, for some clients never disconnect the connection.
|
|
|
|
// @see https://github.com/simple-rtmp-server/srs/issues/398
|
|
|
|
skt.set_recv_timeout(SRS_HTTP_RECV_TIMEOUT_US);
|
|
|
|
|
2014-04-02 04:55:10 +00:00
|
|
|
// process http messages.
|
2015-06-08 06:03:16 +00:00
|
|
|
while(!disposed) {
|
2015-05-22 14:24:05 +00:00
|
|
|
ISrsHttpMessage* req = NULL;
|
2014-04-02 04:55:10 +00:00
|
|
|
|
|
|
|
// get a http message
|
2015-05-04 11:06:38 +00:00
|
|
|
if ((ret = parser->parse_message(&skt, this, &req)) != ERROR_SUCCESS) {
|
2014-04-02 04:55:10 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-03-04 10:20:15 +00:00
|
|
|
// if SUCCESS, always NOT-NULL.
|
2014-04-02 04:55:10 +00:00
|
|
|
srs_assert(req);
|
|
|
|
|
|
|
|
// always free it in this scope.
|
2015-05-22 14:24:05 +00:00
|
|
|
SrsAutoFree(ISrsHttpMessage, req);
|
2014-04-02 04:55:10 +00:00
|
|
|
|
|
|
|
// ok, handle http request.
|
2015-03-04 05:09:35 +00:00
|
|
|
SrsHttpResponseWriter writer(&skt);
|
2015-01-17 13:58:23 +00:00
|
|
|
if ((ret = process_request(&writer, req)) != ERROR_SUCCESS) {
|
2014-04-02 04:55:10 +00:00
|
|
|
return ret;
|
|
|
|
}
|
2015-08-03 06:11:21 +00:00
|
|
|
|
|
|
|
// read all rest bytes in request body.
|
|
|
|
char buf[SRS_HTTP_READ_CACHE_BYTES];
|
|
|
|
ISrsHttpResponseReader* br = req->body_reader();
|
|
|
|
while (!br->eof()) {
|
|
|
|
if ((ret = br->read(buf, SRS_HTTP_READ_CACHE_BYTES, NULL)) != ERROR_SUCCESS) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-22 08:27:48 +00:00
|
|
|
// donot keep alive, disconnect it.
|
|
|
|
// @see https://github.com/simple-rtmp-server/srs/issues/399
|
|
|
|
if (!req->is_keep_alive()) {
|
|
|
|
break;
|
|
|
|
}
|
2014-04-02 04:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-05-22 14:24:05 +00:00
|
|
|
int SrsHttpApi::process_request(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
2014-04-02 04:55:10 +00:00
|
|
|
{
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
2014-05-30 01:20:51 +00:00
|
|
|
srs_trace("HTTP %s %s, content-length=%"PRId64"",
|
2015-01-17 13:58:23 +00:00
|
|
|
r->method_str().c_str(), r->url().c_str(), r->content_length());
|
2014-04-02 10:07:34 +00:00
|
|
|
|
2015-02-21 13:17:59 +00:00
|
|
|
// method is OPTIONS and enable crossdomain, required crossdomain header.
|
|
|
|
if (r->is_http_options() && _srs_config->get_http_api_crossdomain()) {
|
|
|
|
crossdomain_required = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// whenever crossdomain required, set crossdomain header.
|
|
|
|
if (crossdomain_required) {
|
|
|
|
w->header()->set("Access-Control-Allow-Origin", "*");
|
|
|
|
w->header()->set("Access-Control-Allow-Methods", "GET, POST, HEAD, PUT, DELETE");
|
|
|
|
w->header()->set("Access-Control-Allow-Headers", "Cache-Control,X-Proxy-Authorization,X-Requested-With,Content-Type");
|
|
|
|
}
|
|
|
|
|
|
|
|
// handle the http options.
|
|
|
|
if (r->is_http_options()) {
|
|
|
|
w->header()->set_content_length(0);
|
|
|
|
if (_srs_config->get_http_api_crossdomain()) {
|
|
|
|
w->write_header(SRS_CONSTS_HTTP_OK);
|
|
|
|
} else {
|
|
|
|
w->write_header(SRS_CONSTS_HTTP_MethodNotAllowed);
|
|
|
|
}
|
|
|
|
return w->final_request();
|
|
|
|
}
|
|
|
|
|
2015-01-17 13:58:23 +00:00
|
|
|
// use default server mux to serve http request.
|
|
|
|
if ((ret = mux->serve_http(w, r)) != ERROR_SUCCESS) {
|
|
|
|
if (!srs_is_client_gracefully_close(ret)) {
|
|
|
|
srs_error("serve http msg failed. ret=%d", ret);
|
|
|
|
}
|
2014-04-02 10:07:34 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-03-27 05:25:08 +00:00
|
|
|
return ret;
|
2014-03-27 04:14:04 +00:00
|
|
|
}
|
2014-04-01 08:06:32 +00:00
|
|
|
|
|
|
|
#endif
|
2014-08-02 14:18:39 +00:00
|
|
|
|