From 8d534d34709cf343535b5a0d17fa1aaab425d25c Mon Sep 17 00:00:00 2001 From: "qiang.li" Date: Sat, 3 Jan 2015 12:57:13 +0800 Subject: [PATCH] get stream info use http api #227 --- trunk/src/app/srs_app_edge.hpp | 8 +++ trunk/src/app/srs_app_http_api.cpp | 90 +++++++++++++++++++++++++++++- trunk/src/app/srs_app_http_api.hpp | 22 ++++++++ trunk/src/app/srs_app_source.cpp | 11 +++- trunk/src/app/srs_app_source.hpp | 6 ++ 5 files changed, 135 insertions(+), 2 deletions(-) diff --git a/trunk/src/app/srs_app_edge.hpp b/trunk/src/app/srs_app_edge.hpp index 6a7329cfb..285806a95 100644 --- a/trunk/src/app/srs_app_edge.hpp +++ b/trunk/src/app/srs_app_edge.hpp @@ -188,6 +188,10 @@ public: * when ingester start to play stream. */ virtual int on_ingest_play(); + /** + * get state info. + */ + virtual int get_state() { return state; } }; /** @@ -219,6 +223,10 @@ public: * proxy unpublish stream to edge. */ virtual void on_proxy_unpublish(); + /** + * get state info. + */ + virtual int get_state() { return state; } }; #endif diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 3958fd838..54e824843 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -35,6 +35,8 @@ using namespace std; #include #include #include +#include +#include SrsApiRoot::SrsApiRoot() { @@ -122,6 +124,8 @@ SrsApiV1::SrsApiV1() handlers.push_back(new SrsApiMemInfos()); handlers.push_back(new SrsApiAuthors()); handlers.push_back(new SrsApiRequests()); + handlers.push_back(new SrsApiVhosts()); + handlers.push_back(new SrsApiStreams()); } SrsApiV1::~SrsApiV1() @@ -147,7 +151,9 @@ int SrsApiV1::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) << __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_STR("requests", "the request itself, for http debug") << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("vhosts", "list all vhosts") << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("streams?(name/vhost)=xxx", "list streams that match the name or vhost") << __SRS_JOBJECT_END << __SRS_JOBJECT_END; @@ -500,6 +506,88 @@ int SrsApiAuthors::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) return res_json(skt, req, ss.str()); } +SrsApiVhosts::SrsApiVhosts() +{ +} + +SrsApiVhosts::~SrsApiVhosts() +{ +} + +bool SrsApiVhosts::can_handle(const char* path, int length, const char** /*pchild*/) +{ + return srs_path_equals("/vhosts", path, length); +} + +int SrsApiVhosts::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) +{ + std::stringstream ss; + + ss << __SRS_JARRAY_START; + bool first = true; + std::map *source_pool = SrsSource::get_source_pool(); + std::map::iterator it; + for (it=source_pool->begin(); it!=source_pool->end(); it++) { + SrsRequest* source_req = it->second->get_reqinfo(); + if (first) first = false; + else ss << __SRS_JFIELD_CONT; + + ss << "\"" << source_req->vhost << "\""; + } + ss << __SRS_JARRAY_END; + + return res_json(skt, req, ss.str()); +} + +SrsApiStreams::SrsApiStreams() +{ +} + +SrsApiStreams::~SrsApiStreams() +{ +} + +bool SrsApiStreams::can_handle(const char* path, int length, const char** /*pchild*/) +{ + return srs_path_equals("/streams", path, length); +} + +int SrsApiStreams::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) +{ + std::stringstream ss; + + std::string query_name = req->query_get("name"); + std::string query_vhost = req->query_get("vhost"); + if (query_name.size()>0 || query_vhost.size()>0) { + ss << __SRS_JARRAY_START; + bool first = true; + std::map *source_pool = SrsSource::get_source_pool(); + std::map::iterator it; + for (it=source_pool->begin(); it!=source_pool->end(); it++) { + SrsSource* source = it->second; + SrsRequest* source_req = source->get_reqinfo(); + if (source_req->stream==query_name || source_req->vhost==query_vhost) { + if (first) first = false; + else ss << __SRS_JFIELD_CONT; + + ss << __SRS_JOBJECT_START + << __SRS_JFIELD_STR("name", source_req->stream) << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("url", source_req->tcUrl) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("clients", source->get_consumers_size()) << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("status", (source->can_publish()?"idle":"streaming")) << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("type", source->get_source_type()) << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("codec", "") + << __SRS_JOBJECT_END; + } + } + ss << __SRS_JARRAY_END; + } else { + return res_error(skt, req, 400, "Bad Request", "unknown query"); + } + + return res_json(skt, req, ss.str()); +} + SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler) : SrsConnection(srs_server, client_stfd) { diff --git a/trunk/src/app/srs_app_http_api.hpp b/trunk/src/app/srs_app_http_api.hpp index ea12ffcf1..a29e46066 100644 --- a/trunk/src/app/srs_app_http_api.hpp +++ b/trunk/src/app/srs_app_http_api.hpp @@ -164,6 +164,28 @@ protected: virtual int do_process_request(SrsStSocket* skt, SrsHttpMessage* req); }; +class SrsApiVhosts : public SrsHttpHandler +{ +public: + SrsApiVhosts(); + virtual ~SrsApiVhosts(); +public: + virtual bool can_handle(const char* path, int length, const char** pchild); +protected: + virtual int do_process_request(SrsStSocket* skt, SrsHttpMessage* req); +}; + +class SrsApiStreams : public SrsHttpHandler +{ +public: + SrsApiStreams(); + virtual ~SrsApiStreams(); +public: + virtual bool can_handle(const char* path, int length, const char** pchild); +protected: + virtual int do_process_request(SrsStSocket* skt, SrsHttpMessage* req); +}; + class SrsHttpApi : public SrsConnection { private: diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 6003c8883..e788fb465 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1807,4 +1807,13 @@ void SrsSource::destroy_forwarders() forwarders.clear(); } - +std::string SrsSource::get_source_type() +{ + if (play_edge->get_state() == SrsEdgeStateIngestConnected) { + return "origin pull"; + } else if (publish_edge->get_state() == SrsEdgeStatePublish) { + return "edge publish"; + } else { + return "normal publish"; + } +} diff --git a/trunk/src/app/srs_app_source.hpp b/trunk/src/app/srs_app_source.hpp index 145adb8eb..7a6ce1f2a 100644 --- a/trunk/src/app/srs_app_source.hpp +++ b/trunk/src/app/srs_app_source.hpp @@ -486,6 +486,12 @@ public: private: virtual int create_forwarders(); virtual void destroy_forwarders(); +//get information +public: + static std::map* get_source_pool() { return &pool; } + virtual SrsRequest* get_reqinfo() { return _req; } + virtual std::size_t get_consumers_size() { return consumers.size(); } + virtual std::string get_source_type(); }; #endif