winlin

use amf0 encode for json encode.

@@ -36,6 +36,7 @@ using namespace std; @@ -36,6 +36,7 @@ using namespace std;
36 #include <srs_app_utility.hpp> 36 #include <srs_app_utility.hpp>
37 #include <srs_core_autofree.hpp> 37 #include <srs_core_autofree.hpp>
38 #include <srs_app_http_conn.hpp> 38 #include <srs_app_http_conn.hpp>
  39 +#include <srs_rtmp_amf0.hpp>
39 40
40 SrsHttpHeartbeat::SrsHttpHeartbeat() 41 SrsHttpHeartbeat::SrsHttpHeartbeat()
41 { 42 {
@@ -65,23 +66,25 @@ void SrsHttpHeartbeat::heartbeat() @@ -65,23 +66,25 @@ void SrsHttpHeartbeat::heartbeat()
65 ip = ips[_srs_config->get_stats_network() % (int)ips.size()]; 66 ip = ips[_srs_config->get_stats_network() % (int)ips.size()];
66 } 67 }
67 68
68 - std::stringstream ss;  
69 - ss << SRS_JOBJECT_START  
70 - << SRS_JFIELD_STR("device_id", device_id) << SRS_JFIELD_CONT  
71 - << SRS_JFIELD_STR("ip", ip); 69 + SrsAmf0Object* obj = SrsAmf0Any::object();
  70 + SrsAutoFree(SrsAmf0Object, obj);
  71 +
  72 + obj->set("device_id", SrsAmf0Any::str(device_id.c_str()));
  73 + obj->set("ip", SrsAmf0Any::str(ip.c_str()));
  74 +
72 if (_srs_config->get_heartbeat_summaries()) { 75 if (_srs_config->get_heartbeat_summaries()) {
73 - ss << SRS_JFIELD_CONT << SRS_JFIELD_ORG("summaries", "");  
74 - srs_api_dump_summaries(ss);  
75 - }  
76 - ss << SRS_JOBJECT_END; 76 + SrsAmf0Object* summaries = SrsAmf0Any::object();
  77 + obj->set("summaries", summaries);
77 78
78 - std::string req = ss.str(); 79 + srs_api_dump_summaries(summaries);
  80 + }
79 81
80 SrsHttpClient http; 82 SrsHttpClient http;
81 if ((ret = http.initialize(uri.get_host(), uri.get_port())) != ERROR_SUCCESS) { 83 if ((ret = http.initialize(uri.get_host(), uri.get_port())) != ERROR_SUCCESS) {
82 return; 84 return;
83 } 85 }
84 86
  87 + std::string req = obj->to_json();
85 ISrsHttpMessage* msg = NULL; 88 ISrsHttpMessage* msg = NULL;
86 if ((ret = http.post(uri.get_path(), req, &msg)) != ERROR_SUCCESS) { 89 if ((ret = http.post(uri.get_path(), req, &msg)) != ERROR_SUCCESS) {
87 srs_info("http post hartbeart uri failed. url=%s, request=%s, ret=%d", 90 srs_info("http post hartbeart uri failed. url=%s, request=%s, ret=%d",
@@ -267,9 +267,12 @@ SrsGoApiSummaries::~SrsGoApiSummaries() @@ -267,9 +267,12 @@ SrsGoApiSummaries::~SrsGoApiSummaries()
267 267
268 int SrsGoApiSummaries::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 268 int SrsGoApiSummaries::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
269 { 269 {
270 - std::stringstream ss;  
271 - srs_api_dump_summaries(ss);  
272 - return srs_api_response(w, r, ss.str()); 270 + SrsAmf0Object* obj = SrsAmf0Any::object();
  271 + SrsAutoFree(SrsAmf0Object, obj);
  272 +
  273 + srs_api_dump_summaries(obj);
  274 +
  275 + return srs_api_response(w, r, obj->to_json());
273 } 276 }
274 277
275 SrsGoApiRusages::SrsGoApiRusages() 278 SrsGoApiRusages::SrsGoApiRusages()
@@ -295,7 +298,7 @@ int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -295,7 +298,7 @@ int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
295 298
296 SrsRusage* ru = srs_get_system_rusage(); 299 SrsRusage* ru = srs_get_system_rusage();
297 300
298 - data->set("ok", SrsAmf0Any::boolean(ru->ok? "true":"false")); 301 + data->set("ok", SrsAmf0Any::boolean(ru->ok));
299 data->set("sample_time", SrsAmf0Any::number(ru->sample_time)); 302 data->set("sample_time", SrsAmf0Any::number(ru->sample_time));
300 data->set("ru_utime", SrsAmf0Any::number(ru->r.ru_utime.tv_sec)); 303 data->set("ru_utime", SrsAmf0Any::number(ru->r.ru_utime.tv_sec));
301 data->set("ru_stime", SrsAmf0Any::number(ru->r.ru_stime.tv_sec)); 304 data->set("ru_stime", SrsAmf0Any::number(ru->r.ru_stime.tv_sec));
@@ -343,7 +346,7 @@ int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage @@ -343,7 +346,7 @@ int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage
343 string state; 346 string state;
344 state += (char)u->state; 347 state += (char)u->state;
345 348
346 - data->set("ok", SrsAmf0Any::boolean(u->ok? "true":"false")); 349 + data->set("ok", SrsAmf0Any::boolean(u->ok));
347 data->set("sample_time", SrsAmf0Any::number(u->sample_time)); 350 data->set("sample_time", SrsAmf0Any::number(u->sample_time));
348 data->set("percent", SrsAmf0Any::number(u->percent)); 351 data->set("percent", SrsAmf0Any::number(u->percent));
349 data->set("pid", SrsAmf0Any::number(u->pid)); 352 data->set("pid", SrsAmf0Any::number(u->pid));
@@ -417,7 +420,7 @@ int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa @@ -417,7 +420,7 @@ int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa
417 420
418 SrsProcSystemStat* s = srs_get_system_proc_stat(); 421 SrsProcSystemStat* s = srs_get_system_proc_stat();
419 422
420 - data->set("ok", SrsAmf0Any::boolean(s->ok? "true":"false")); 423 + data->set("ok", SrsAmf0Any::boolean(s->ok));
421 data->set("sample_time", SrsAmf0Any::number(s->sample_time)); 424 data->set("sample_time", SrsAmf0Any::number(s->sample_time));
422 data->set("percent", SrsAmf0Any::number(s->percent)); 425 data->set("percent", SrsAmf0Any::number(s->percent));
423 data->set("user", SrsAmf0Any::number(s->user)); 426 data->set("user", SrsAmf0Any::number(s->user));
@@ -456,7 +459,7 @@ int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -456,7 +459,7 @@ int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
456 459
457 SrsMemInfo* m = srs_get_meminfo(); 460 SrsMemInfo* m = srs_get_meminfo();
458 461
459 - data->set("ok", SrsAmf0Any::boolean(m->ok? "true":"false")); 462 + data->set("ok", SrsAmf0Any::boolean(m->ok));
460 data->set("sample_time", SrsAmf0Any::number(m->sample_time)); 463 data->set("sample_time", SrsAmf0Any::number(m->sample_time));
461 data->set("percent_ram", SrsAmf0Any::number(m->percent_ram)); 464 data->set("percent_ram", SrsAmf0Any::number(m->percent_ram));
462 data->set("percent_swap", SrsAmf0Any::number(m->percent_swap)); 465 data->set("percent_swap", SrsAmf0Any::number(m->percent_swap));
@@ -38,6 +38,7 @@ using namespace std; @@ -38,6 +38,7 @@ using namespace std;
38 #include <srs_app_config.hpp> 38 #include <srs_app_config.hpp>
39 #include <srs_kernel_utility.hpp> 39 #include <srs_kernel_utility.hpp>
40 #include <srs_app_http_conn.hpp> 40 #include <srs_app_http_conn.hpp>
  41 +#include <srs_rtmp_amf0.hpp>
41 42
42 #define SRS_HTTP_RESPONSE_OK SRS_XSTR(ERROR_SUCCESS) 43 #define SRS_HTTP_RESPONSE_OK SRS_XSTR(ERROR_SUCCESS)
43 44
@@ -62,18 +63,18 @@ int SrsHttpHooks::on_connect(string url, SrsRequest* req) @@ -62,18 +63,18 @@ int SrsHttpHooks::on_connect(string url, SrsRequest* req)
62 63
63 int client_id = _srs_context->get_id(); 64 int client_id = _srs_context->get_id();
64 65
65 - std::stringstream ss;  
66 - ss << SRS_JOBJECT_START  
67 - << SRS_JFIELD_STR("action", "on_connect") << SRS_JFIELD_CONT  
68 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
69 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
70 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
71 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
72 - << SRS_JFIELD_STR("tcUrl", req->tcUrl) << SRS_JFIELD_CONT  
73 - << SRS_JFIELD_STR("pageUrl", req->pageUrl)  
74 - << SRS_JOBJECT_END;  
75 -  
76 - std::string data = ss.str(); 66 + SrsAmf0Object* obj = SrsAmf0Any::object();
  67 + SrsAutoFree(SrsAmf0Object, obj);
  68 +
  69 + obj->set("action", SrsAmf0Any::str("on_connect"));
  70 + obj->set("client_id", SrsAmf0Any::number(client_id));
  71 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  72 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  73 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  74 + obj->set("tcUrl", SrsAmf0Any::str(req->tcUrl.c_str()));
  75 + obj->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str()));
  76 +
  77 + std::string data = obj->to_json();
77 std::string res; 78 std::string res;
78 int status_code; 79 int status_code;
79 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 80 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -96,18 +97,18 @@ void SrsHttpHooks::on_close(string url, SrsRequest* req, int64_t send_bytes, int @@ -96,18 +97,18 @@ void SrsHttpHooks::on_close(string url, SrsRequest* req, int64_t send_bytes, int
96 97
97 int client_id = _srs_context->get_id(); 98 int client_id = _srs_context->get_id();
98 99
99 - std::stringstream ss;  
100 - ss << SRS_JOBJECT_START  
101 - << SRS_JFIELD_STR("action", "on_close") << SRS_JFIELD_CONT  
102 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
103 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
104 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
105 - << SRS_JFIELD_ORG("send_bytes", send_bytes) << SRS_JFIELD_CONT  
106 - << SRS_JFIELD_ORG("recv_bytes", recv_bytes) << SRS_JFIELD_CONT  
107 - << SRS_JFIELD_STR("app", req->app)  
108 - << SRS_JOBJECT_END;  
109 -  
110 - std::string data = ss.str(); 100 + SrsAmf0Object* obj = SrsAmf0Any::object();
  101 + SrsAutoFree(SrsAmf0Object, obj);
  102 +
  103 + obj->set("action", SrsAmf0Any::str("on_close"));
  104 + obj->set("client_id", SrsAmf0Any::number(client_id));
  105 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  106 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  107 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  108 + obj->set("send_bytes", SrsAmf0Any::number(send_bytes));
  109 + obj->set("recv_bytes", SrsAmf0Any::number(recv_bytes));
  110 +
  111 + std::string data = obj->to_json();
111 std::string res; 112 std::string res;
112 int status_code; 113 int status_code;
113 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 114 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -130,17 +131,17 @@ int SrsHttpHooks::on_publish(string url, SrsRequest* req) @@ -130,17 +131,17 @@ int SrsHttpHooks::on_publish(string url, SrsRequest* req)
130 131
131 int client_id = _srs_context->get_id(); 132 int client_id = _srs_context->get_id();
132 133
133 - std::stringstream ss;  
134 - ss << SRS_JOBJECT_START  
135 - << SRS_JFIELD_STR("action", "on_publish") << SRS_JFIELD_CONT  
136 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
137 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
138 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
139 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
140 - << SRS_JFIELD_STR("stream", req->stream)  
141 - << SRS_JOBJECT_END;  
142 -  
143 - std::string data = ss.str(); 134 + SrsAmf0Object* obj = SrsAmf0Any::object();
  135 + SrsAutoFree(SrsAmf0Object, obj);
  136 +
  137 + obj->set("action", SrsAmf0Any::str("on_publish"));
  138 + obj->set("client_id", SrsAmf0Any::number(client_id));
  139 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  140 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  141 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  142 + obj->set("stream", SrsAmf0Any::str(req->stream.c_str()));
  143 +
  144 + std::string data = obj->to_json();
144 std::string res; 145 std::string res;
145 int status_code; 146 int status_code;
146 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 147 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -163,17 +164,17 @@ void SrsHttpHooks::on_unpublish(string url, SrsRequest* req) @@ -163,17 +164,17 @@ void SrsHttpHooks::on_unpublish(string url, SrsRequest* req)
163 164
164 int client_id = _srs_context->get_id(); 165 int client_id = _srs_context->get_id();
165 166
166 - std::stringstream ss;  
167 - ss << SRS_JOBJECT_START  
168 - << SRS_JFIELD_STR("action", "on_unpublish") << SRS_JFIELD_CONT  
169 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
170 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
171 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
172 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
173 - << SRS_JFIELD_STR("stream", req->stream)  
174 - << SRS_JOBJECT_END;  
175 -  
176 - std::string data = ss.str(); 167 + SrsAmf0Object* obj = SrsAmf0Any::object();
  168 + SrsAutoFree(SrsAmf0Object, obj);
  169 +
  170 + obj->set("action", SrsAmf0Any::str("on_unpublish"));
  171 + obj->set("client_id", SrsAmf0Any::number(client_id));
  172 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  173 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  174 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  175 + obj->set("stream", SrsAmf0Any::str(req->stream.c_str()));
  176 +
  177 + std::string data = obj->to_json();
177 std::string res; 178 std::string res;
178 int status_code; 179 int status_code;
179 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 180 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -196,18 +197,18 @@ int SrsHttpHooks::on_play(string url, SrsRequest* req) @@ -196,18 +197,18 @@ int SrsHttpHooks::on_play(string url, SrsRequest* req)
196 197
197 int client_id = _srs_context->get_id(); 198 int client_id = _srs_context->get_id();
198 199
199 - std::stringstream ss;  
200 - ss << SRS_JOBJECT_START  
201 - << SRS_JFIELD_STR("action", "on_play") << SRS_JFIELD_CONT  
202 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
203 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
204 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
205 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
206 - << SRS_JFIELD_STR("stream", req->stream) << SRS_JFIELD_CONT  
207 - << SRS_JFIELD_STR("pageUrl", req->pageUrl)  
208 - << SRS_JOBJECT_END;  
209 -  
210 - std::string data = ss.str(); 200 + SrsAmf0Object* obj = SrsAmf0Any::object();
  201 + SrsAutoFree(SrsAmf0Object, obj);
  202 +
  203 + obj->set("action", SrsAmf0Any::str("on_play"));
  204 + obj->set("client_id", SrsAmf0Any::number(client_id));
  205 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  206 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  207 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  208 + obj->set("stream", SrsAmf0Any::str(req->stream.c_str()));
  209 + obj->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str()));
  210 +
  211 + std::string data = obj->to_json();
211 std::string res; 212 std::string res;
212 int status_code; 213 int status_code;
213 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 214 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -230,17 +231,17 @@ void SrsHttpHooks::on_stop(string url, SrsRequest* req) @@ -230,17 +231,17 @@ void SrsHttpHooks::on_stop(string url, SrsRequest* req)
230 231
231 int client_id = _srs_context->get_id(); 232 int client_id = _srs_context->get_id();
232 233
233 - std::stringstream ss;  
234 - ss << SRS_JOBJECT_START  
235 - << SRS_JFIELD_STR("action", "on_stop") << SRS_JFIELD_CONT  
236 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
237 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
238 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
239 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
240 - << SRS_JFIELD_STR("stream", req->stream)  
241 - << SRS_JOBJECT_END;  
242 -  
243 - std::string data = ss.str(); 234 + SrsAmf0Object* obj = SrsAmf0Any::object();
  235 + SrsAutoFree(SrsAmf0Object, obj);
  236 +
  237 + obj->set("action", SrsAmf0Any::str("on_stop"));
  238 + obj->set("client_id", SrsAmf0Any::number(client_id));
  239 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  240 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  241 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  242 + obj->set("stream", SrsAmf0Any::str(req->stream.c_str()));
  243 +
  244 + std::string data = obj->to_json();
244 std::string res; 245 std::string res;
245 int status_code; 246 int status_code;
246 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 247 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -264,19 +265,19 @@ int SrsHttpHooks::on_dvr(string url, SrsRequest* req, string file) @@ -264,19 +265,19 @@ int SrsHttpHooks::on_dvr(string url, SrsRequest* req, string file)
264 int client_id = _srs_context->get_id(); 265 int client_id = _srs_context->get_id();
265 std::string cwd = _srs_config->cwd(); 266 std::string cwd = _srs_config->cwd();
266 267
267 - std::stringstream ss;  
268 - ss << SRS_JOBJECT_START  
269 - << SRS_JFIELD_STR("action", "on_dvr") << SRS_JFIELD_CONT  
270 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
271 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
272 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
273 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
274 - << SRS_JFIELD_STR("stream", req->stream) << SRS_JFIELD_CONT  
275 - << SRS_JFIELD_STR("cwd", cwd) << SRS_JFIELD_CONT  
276 - << SRS_JFIELD_STR("file", file)  
277 - << SRS_JOBJECT_END;  
278 -  
279 - std::string data = ss.str(); 268 + SrsAmf0Object* obj = SrsAmf0Any::object();
  269 + SrsAutoFree(SrsAmf0Object, obj);
  270 +
  271 + obj->set("action", SrsAmf0Any::str("on_dvr"));
  272 + obj->set("client_id", SrsAmf0Any::number(client_id));
  273 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  274 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  275 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  276 + obj->set("stream", SrsAmf0Any::str(req->stream.c_str()));
  277 + obj->set("cwd", SrsAmf0Any::str(cwd.c_str()));
  278 + obj->set("file", SrsAmf0Any::str(file.c_str()));
  279 +
  280 + std::string data = obj->to_json();
280 std::string res; 281 std::string res;
281 int status_code; 282 int status_code;
282 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 283 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -300,24 +301,24 @@ int SrsHttpHooks::on_hls(string url, SrsRequest* req, string file, string ts_url @@ -300,24 +301,24 @@ int SrsHttpHooks::on_hls(string url, SrsRequest* req, string file, string ts_url
300 int client_id = _srs_context->get_id(); 301 int client_id = _srs_context->get_id();
301 std::string cwd = _srs_config->cwd(); 302 std::string cwd = _srs_config->cwd();
302 303
303 - std::stringstream ss;  
304 - ss << SRS_JOBJECT_START  
305 - << SRS_JFIELD_STR("action", "on_hls") << SRS_JFIELD_CONT  
306 - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT  
307 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
308 - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT  
309 - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT  
310 - << SRS_JFIELD_STR("stream", req->stream) << SRS_JFIELD_CONT  
311 - << SRS_JFIELD_ORG("duration", duration) << SRS_JFIELD_CONT  
312 - << SRS_JFIELD_STR("cwd", cwd) << SRS_JFIELD_CONT  
313 - << SRS_JFIELD_STR("file", file) << SRS_JFIELD_CONT  
314 - << SRS_JFIELD_STR("url", ts_url) << SRS_JFIELD_CONT  
315 - << SRS_JFIELD_STR("m3u8", m3u8) << SRS_JFIELD_CONT  
316 - << SRS_JFIELD_STR("m3u8_url", m3u8_url) << SRS_JFIELD_CONT  
317 - << SRS_JFIELD_ORG("seq_no", sn)  
318 - << SRS_JOBJECT_END;  
319 -  
320 - std::string data = ss.str(); 304 + SrsAmf0Object* obj = SrsAmf0Any::object();
  305 + SrsAutoFree(SrsAmf0Object, obj);
  306 +
  307 + obj->set("action", SrsAmf0Any::str("on_hls"));
  308 + obj->set("client_id", SrsAmf0Any::number(client_id));
  309 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  310 + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str()));
  311 + obj->set("app", SrsAmf0Any::str(req->app.c_str()));
  312 + obj->set("stream", SrsAmf0Any::str(req->stream.c_str()));
  313 + obj->set("duration", SrsAmf0Any::number(duration));
  314 + obj->set("cwd", SrsAmf0Any::str(cwd.c_str()));
  315 + obj->set("file", SrsAmf0Any::str(file.c_str()));
  316 + obj->set("url", SrsAmf0Any::str(url.c_str()));
  317 + obj->set("m3u8", SrsAmf0Any::str(m3u8.c_str()));
  318 + obj->set("m3u8_url", SrsAmf0Any::str(m3u8_url.c_str()));
  319 + obj->set("seq_no", SrsAmf0Any::number(sn));
  320 +
  321 + std::string data = obj->to_json();
321 std::string res; 322 std::string res;
322 int status_code; 323 int status_code;
323 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { 324 if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) {
@@ -45,6 +45,7 @@ using namespace std; @@ -45,6 +45,7 @@ using namespace std;
45 #include <srs_protocol_kbps.hpp> 45 #include <srs_protocol_kbps.hpp>
46 #include <srs_protocol_json.hpp> 46 #include <srs_protocol_json.hpp>
47 #include <srs_kernel_stream.hpp> 47 #include <srs_kernel_stream.hpp>
  48 +#include <srs_rtmp_amf0.hpp>
48 49
49 // the longest time to wait for a process to quit. 50 // the longest time to wait for a process to quit.
50 #define SRS_PROCESS_QUIT_TIMEOUT_MS 1000 51 #define SRS_PROCESS_QUIT_TIMEOUT_MS 1000
@@ -1354,7 +1355,7 @@ string srs_get_peer_ip(int fd) @@ -1354,7 +1355,7 @@ string srs_get_peer_ip(int fd)
1354 return ip; 1355 return ip;
1355 } 1356 }
1356 1357
1357 -void srs_api_dump_summaries(std::stringstream& ss) 1358 +void srs_api_dump_summaries(SrsAmf0Object* obj)
1358 { 1359 {
1359 SrsRusage* r = srs_get_system_rusage(); 1360 SrsRusage* r = srs_get_system_rusage();
1360 SrsProcSelfStat* u = srs_get_self_proc_stat(); 1361 SrsProcSelfStat* u = srs_get_self_proc_stat();
@@ -1407,57 +1408,61 @@ void srs_api_dump_summaries(std::stringstream& ss) @@ -1407,57 +1408,61 @@ void srs_api_dump_summaries(std::stringstream& ss)
1407 bool ok = (r->ok && u->ok && s->ok && c->ok 1408 bool ok = (r->ok && u->ok && s->ok && c->ok
1408 && d->ok && m->ok && p->ok && nrs->ok); 1409 && d->ok && m->ok && p->ok && nrs->ok);
1409 1410
1410 - ss << SRS_JOBJECT_START  
1411 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
1412 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
1413 - << SRS_JFIELD_ORG("ok", (ok? "true":"false")) << SRS_JFIELD_CONT  
1414 - << SRS_JFIELD_ORG("now_ms", now) << SRS_JFIELD_CONT  
1415 - << SRS_JFIELD_ORG("self", SRS_JOBJECT_START)  
1416 - << SRS_JFIELD_STR("version", RTMP_SIG_SRS_VERSION) << SRS_JFIELD_CONT  
1417 - << SRS_JFIELD_ORG("pid", getpid()) << SRS_JFIELD_CONT  
1418 - << SRS_JFIELD_ORG("ppid", u->ppid) << SRS_JFIELD_CONT  
1419 - << SRS_JFIELD_STR("argv", _srs_config->argv()) << SRS_JFIELD_CONT  
1420 - << SRS_JFIELD_STR("cwd", _srs_config->cwd()) << SRS_JFIELD_CONT  
1421 - << SRS_JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << SRS_JFIELD_CONT  
1422 - << SRS_JFIELD_ORG("mem_percent", self_mem_percent) << SRS_JFIELD_CONT  
1423 - << SRS_JFIELD_ORG("cpu_percent", u->percent) << SRS_JFIELD_CONT  
1424 - << SRS_JFIELD_ORG("srs_uptime", srs_uptime)  
1425 - << SRS_JOBJECT_END << SRS_JFIELD_CONT  
1426 - << SRS_JFIELD_ORG("system", SRS_JOBJECT_START)  
1427 - << SRS_JFIELD_ORG("cpu_percent", s->percent) << SRS_JFIELD_CONT  
1428 - << SRS_JFIELD_ORG("disk_read_KBps", d->in_KBps) << SRS_JFIELD_CONT  
1429 - << SRS_JFIELD_ORG("disk_write_KBps", d->out_KBps) << SRS_JFIELD_CONT  
1430 - << SRS_JFIELD_ORG("disk_busy_percent", d->busy) << SRS_JFIELD_CONT  
1431 - << SRS_JFIELD_ORG("mem_ram_kbyte", m->MemTotal) << SRS_JFIELD_CONT  
1432 - << SRS_JFIELD_ORG("mem_ram_percent", m->percent_ram) << SRS_JFIELD_CONT  
1433 - << SRS_JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << SRS_JFIELD_CONT  
1434 - << SRS_JFIELD_ORG("mem_swap_percent", m->percent_swap) << SRS_JFIELD_CONT  
1435 - << SRS_JFIELD_ORG("cpus", c->nb_processors) << SRS_JFIELD_CONT  
1436 - << SRS_JFIELD_ORG("cpus_online", c->nb_processors_online) << SRS_JFIELD_CONT  
1437 - << SRS_JFIELD_ORG("uptime", p->os_uptime) << SRS_JFIELD_CONT  
1438 - << SRS_JFIELD_ORG("ilde_time", p->os_ilde_time) << SRS_JFIELD_CONT  
1439 - << SRS_JFIELD_ORG("load_1m", p->load_one_minutes) << SRS_JFIELD_CONT  
1440 - << SRS_JFIELD_ORG("load_5m", p->load_five_minutes) << SRS_JFIELD_CONT  
1441 - << SRS_JFIELD_ORG("load_15m", p->load_fifteen_minutes) << SRS_JFIELD_CONT 1411 + SrsAmf0Object* data = SrsAmf0Any::object();
  1412 + obj->set("data", data);
  1413 +
  1414 + data->set("ok", SrsAmf0Any::boolean(ok));
  1415 + data->set("now_ms", SrsAmf0Any::number(now));
  1416 +
  1417 + // self
  1418 + SrsAmf0Object* self = SrsAmf0Any::object();
  1419 + data->set("self", self);
  1420 +
  1421 + self->set("version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION));
  1422 + self->set("pid", SrsAmf0Any::number(getpid()));
  1423 + self->set("ppid", SrsAmf0Any::number(u->ppid));
  1424 + self->set("argv", SrsAmf0Any::str(_srs_config->argv().c_str()));
  1425 + self->set("cwd", SrsAmf0Any::str(_srs_config->cwd().c_str()));
  1426 + self->set("mem_kbyte", SrsAmf0Any::number(r->r.ru_maxrss));
  1427 + self->set("mem_percent", SrsAmf0Any::number(self_mem_percent));
  1428 + self->set("cpu_percent", SrsAmf0Any::number(u->percent));
  1429 + self->set("srs_uptime", SrsAmf0Any::number(srs_uptime));
  1430 +
  1431 + // system
  1432 + SrsAmf0Object* sys = SrsAmf0Any::object();
  1433 + data->set("system", sys);
  1434 +
  1435 + sys->set("cpu_percent", SrsAmf0Any::number(s->percent));
  1436 + sys->set("disk_read_KBps", SrsAmf0Any::number(d->in_KBps));
  1437 + sys->set("disk_write_KBps", SrsAmf0Any::number(d->out_KBps));
  1438 + sys->set("disk_busy_percent", SrsAmf0Any::number(d->busy));
  1439 + sys->set("mem_ram_kbyte", SrsAmf0Any::number(m->MemTotal));
  1440 + sys->set("mem_ram_percent", SrsAmf0Any::number(m->percent_ram));
  1441 + sys->set("mem_swap_kbyte", SrsAmf0Any::number(m->SwapTotal));
  1442 + sys->set("mem_swap_percent", SrsAmf0Any::number(m->percent_swap));
  1443 + sys->set("cpus", SrsAmf0Any::number(c->nb_processors));
  1444 + sys->set("cpus_online", SrsAmf0Any::number(c->nb_processors_online));
  1445 + sys->set("uptime", SrsAmf0Any::number(p->os_uptime));
  1446 + sys->set("ilde_time", SrsAmf0Any::number(p->os_ilde_time));
  1447 + sys->set("load_1m", SrsAmf0Any::number(p->load_one_minutes));
  1448 + sys->set("load_5m", SrsAmf0Any::number(p->load_five_minutes));
  1449 + sys->set("load_15m", SrsAmf0Any::number(p->load_fifteen_minutes));
1442 // system network bytes stat. 1450 // system network bytes stat.
1443 - << SRS_JFIELD_ORG("net_sample_time", n_sample_time) << SRS_JFIELD_CONT 1451 + sys->set("net_sample_time", SrsAmf0Any::number(n_sample_time));
1444 // internet public address network device bytes. 1452 // internet public address network device bytes.
1445 - << SRS_JFIELD_ORG("net_recv_bytes", nr_bytes) << SRS_JFIELD_CONT  
1446 - << SRS_JFIELD_ORG("net_send_bytes", ns_bytes) << SRS_JFIELD_CONT 1453 + sys->set("net_recv_bytes", SrsAmf0Any::number(nr_bytes));
  1454 + sys->set("net_send_bytes", SrsAmf0Any::number(ns_bytes));
1447 // intranet private address network device bytes. 1455 // intranet private address network device bytes.
1448 - << SRS_JFIELD_ORG("net_recvi_bytes", nri_bytes) << SRS_JFIELD_CONT  
1449 - << SRS_JFIELD_ORG("net_sendi_bytes", nsi_bytes) << SRS_JFIELD_CONT 1456 + sys->set("net_recvi_bytes", SrsAmf0Any::number(nri_bytes));
  1457 + sys->set("net_sendi_bytes", SrsAmf0Any::number(nsi_bytes));
1450 // srs network bytes stat. 1458 // srs network bytes stat.
1451 - << SRS_JFIELD_ORG("srs_sample_time", nrs->sample_time) << SRS_JFIELD_CONT  
1452 - << SRS_JFIELD_ORG("srs_recv_bytes", nrs->rbytes) << SRS_JFIELD_CONT  
1453 - << SRS_JFIELD_ORG("srs_send_bytes", nrs->sbytes) << SRS_JFIELD_CONT  
1454 - << SRS_JFIELD_ORG("conn_sys", nrs->nb_conn_sys) << SRS_JFIELD_CONT  
1455 - << SRS_JFIELD_ORG("conn_sys_et", nrs->nb_conn_sys_et) << SRS_JFIELD_CONT  
1456 - << SRS_JFIELD_ORG("conn_sys_tw", nrs->nb_conn_sys_tw) << SRS_JFIELD_CONT  
1457 - << SRS_JFIELD_ORG("conn_sys_udp", nrs->nb_conn_sys_udp) << SRS_JFIELD_CONT  
1458 - << SRS_JFIELD_ORG("conn_srs", nrs->nb_conn_srs)  
1459 - << SRS_JOBJECT_END  
1460 - << SRS_JOBJECT_END  
1461 - << SRS_JOBJECT_END; 1459 + sys->set("srs_sample_time", SrsAmf0Any::number(nrs->sample_time));
  1460 + sys->set("srs_recv_bytes", SrsAmf0Any::number(nrs->rbytes));
  1461 + sys->set("srs_send_bytes", SrsAmf0Any::number(nrs->sbytes));
  1462 + sys->set("conn_sys", SrsAmf0Any::number(nrs->nb_conn_sys));
  1463 + sys->set("conn_sys_et", SrsAmf0Any::number(nrs->nb_conn_sys_et));
  1464 + sys->set("conn_sys_tw", SrsAmf0Any::number(nrs->nb_conn_sys_tw));
  1465 + sys->set("conn_sys_udp", SrsAmf0Any::number(nrs->nb_conn_sys_udp));
  1466 + sys->set("conn_srs", SrsAmf0Any::number(nrs->nb_conn_srs));
1462 } 1467 }
1463 1468
@@ -41,6 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -41,6 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41 41
42 class SrsKbps; 42 class SrsKbps;
43 class SrsStream; 43 class SrsStream;
  44 +class SrsAmf0Object;
44 45
45 // client open socket and connect to server. 46 // client open socket and connect to server.
46 extern int srs_socket_connect(std::string server, int port, int64_t timeout, st_netfd_t* pstfd); 47 extern int srs_socket_connect(std::string server, int port, int64_t timeout, st_netfd_t* pstfd);
@@ -669,7 +670,7 @@ extern int srs_get_local_port(int fd); @@ -669,7 +670,7 @@ extern int srs_get_local_port(int fd);
669 extern std::string srs_get_peer_ip(int fd); 670 extern std::string srs_get_peer_ip(int fd);
670 671
671 // dump summaries for /api/v1/summaries. 672 // dump summaries for /api/v1/summaries.
672 -extern void srs_api_dump_summaries(std::stringstream& ss); 673 +extern void srs_api_dump_summaries(SrsAmf0Object* obj);
673 674
674 #endif 675 #endif
675 676
@@ -174,56 +174,6 @@ public: @@ -174,56 +174,6 @@ public:
174 //////////////////////////////////////////////////////////////////////// 174 ////////////////////////////////////////////////////////////////////////
175 //////////////////////////////////////////////////////////////////////// 175 ////////////////////////////////////////////////////////////////////////
176 //////////////////////////////////////////////////////////////////////// 176 ////////////////////////////////////////////////////////////////////////
177 -/* json encode  
178 - cout<< SRS_JOBJECT_START  
179 - << SRS_JFIELD_STR("name", "srs") << SRS_JFIELD_CONT  
180 - << SRS_JFIELD_ORG("version", 100) << SRS_JFIELD_CONT  
181 - << SRS_JFIELD_NAME("features") << SRS_JOBJECT_START  
182 - << SRS_JFIELD_STR("rtmp", "released") << SRS_JFIELD_CONT  
183 - << SRS_JFIELD_STR("hls", "released") << SRS_JFIELD_CONT  
184 - << SRS_JFIELD_STR("dash", "plan")  
185 - << SRS_JOBJECT_END << SRS_JFIELD_CONT  
186 - << SRS_JFIELD_STR("author", "srs team")  
187 - << SRS_JOBJECT_END  
188 -it's:  
189 - cont<< "{"  
190 - << "name:" << "srs" << ","  
191 - << "version:" << 100 << ","  
192 - << "features:" << "{"  
193 - << "rtmp:" << "released" << ","  
194 - << "hls:" << "released" << ","  
195 - << "dash:" << "plan"  
196 - << "}" << ","  
197 - << "author:" << "srs team"  
198 - << "}"  
199 -that is:  
200 - """  
201 - {  
202 - "name": "srs",  
203 - "version": 100,  
204 - "features": {  
205 - "rtmp": "released",  
206 - "hls": "released",  
207 - "dash": "plan"  
208 - },  
209 - "author": "srs team"  
210 - }  
211 - """  
212 -*/  
213 -////////////////////////////////////////////////////////////////////////  
214 -////////////////////////////////////////////////////////////////////////  
215 -////////////////////////////////////////////////////////////////////////  
216 -#define SRS_JOBJECT_START "{"  
217 -#define SRS_JFIELD_NAME(k) "\"" << k << "\":"  
218 -#define SRS_JFIELD_OBJ(k) SRS_JFIELD_NAME(k) << SRS_JOBJECT_START  
219 -#define SRS_JFIELD_STR(k, v) SRS_JFIELD_NAME(k) << "\"" << v << "\""  
220 -#define SRS_JFIELD_ORG(k, v) SRS_JFIELD_NAME(k) << std::dec << v  
221 -#define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false"))  
222 -#define SRS_JFIELD_NULL(k) SRS_JFIELD_NAME(k) << "null"  
223 -#define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret  
224 -#define SRS_JFIELD_CONT ","  
225 -#define SRS_JOBJECT_END "}"  
226 -#define SRS_JARRAY_START "["  
227 -#define SRS_JARRAY_END "]" 177 +// json encode, please use AMF0.to_json() to encode json object.
228 178
229 #endif 179 #endif
@@ -35,6 +35,55 @@ using namespace std; @@ -35,6 +35,55 @@ using namespace std;
35 35
36 using namespace _srs_internal; 36 using namespace _srs_internal;
37 37
  38 +/* json encode
  39 + cout<< SRS_JOBJECT_START
  40 + << SRS_JFIELD_STR("name", "srs") << SRS_JFIELD_CONT
  41 + << SRS_JFIELD_ORG("version", 100) << SRS_JFIELD_CONT
  42 + << SRS_JFIELD_NAME("features") << SRS_JOBJECT_START
  43 + << SRS_JFIELD_STR("rtmp", "released") << SRS_JFIELD_CONT
  44 + << SRS_JFIELD_STR("hls", "released") << SRS_JFIELD_CONT
  45 + << SRS_JFIELD_STR("dash", "plan")
  46 + << SRS_JOBJECT_END << SRS_JFIELD_CONT
  47 + << SRS_JFIELD_STR("author", "srs team")
  48 + << SRS_JOBJECT_END
  49 + it's:
  50 + cont<< "{"
  51 + << "name:" << "srs" << ","
  52 + << "version:" << 100 << ","
  53 + << "features:" << "{"
  54 + << "rtmp:" << "released" << ","
  55 + << "hls:" << "released" << ","
  56 + << "dash:" << "plan"
  57 + << "}" << ","
  58 + << "author:" << "srs team"
  59 + << "}"
  60 + that is:
  61 + """
  62 + {
  63 + "name": "srs",
  64 + "version": 100,
  65 + "features": {
  66 + "rtmp": "released",
  67 + "hls": "released",
  68 + "dash": "plan"
  69 + },
  70 + "author": "srs team"
  71 + }
  72 + """
  73 + */
  74 +#define SRS_JOBJECT_START "{"
  75 +#define SRS_JFIELD_NAME(k) "\"" << k << "\":"
  76 +#define SRS_JFIELD_OBJ(k) SRS_JFIELD_NAME(k) << SRS_JOBJECT_START
  77 +#define SRS_JFIELD_STR(k, v) SRS_JFIELD_NAME(k) << "\"" << v << "\""
  78 +#define SRS_JFIELD_ORG(k, v) SRS_JFIELD_NAME(k) << std::dec << v
  79 +#define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false"))
  80 +#define SRS_JFIELD_NULL(k) SRS_JFIELD_NAME(k) << "null"
  81 +#define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret
  82 +#define SRS_JFIELD_CONT ","
  83 +#define SRS_JOBJECT_END "}"
  84 +#define SRS_JARRAY_START "["
  85 +#define SRS_JARRAY_END "]"
  86 +
38 // AMF0 marker 87 // AMF0 marker
39 #define RTMP_AMF0_Number 0x00 88 #define RTMP_AMF0_Number 0x00
40 #define RTMP_AMF0_Boolean 0x01 89 #define RTMP_AMF0_Boolean 0x01