winlin

refine code, merge json encode to amf0.

@@ -78,13 +78,12 @@ int srs_api_response_jsonp(ISrsHttpResponseWriter* w, string callback, string da @@ -78,13 +78,12 @@ int srs_api_response_jsonp(ISrsHttpResponseWriter* w, string callback, string da
78 78
79 int srs_api_response_jsonp_code(ISrsHttpResponseWriter* w, string callback, int code) 79 int srs_api_response_jsonp_code(ISrsHttpResponseWriter* w, string callback, int code)
80 { 80 {
81 - std::stringstream ss; 81 + SrsAmf0Object* obj = SrsAmf0Any::object();
  82 + SrsAutoFree(SrsAmf0Object, obj);
82 83
83 - ss << SRS_JOBJECT_START  
84 - << SRS_JFIELD_ERROR(code)  
85 - << SRS_JOBJECT_END; 84 + obj->set("code", SrsAmf0Any::number(code));
86 85
87 - return srs_api_response_jsonp(w, callback, ss.str()); 86 + return srs_api_response_jsonp(w, callback, obj->to_json());
88 } 87 }
89 88
90 int srs_api_response_json(ISrsHttpResponseWriter* w, string data) 89 int srs_api_response_json(ISrsHttpResponseWriter* w, string data)
@@ -99,13 +98,12 @@ int srs_api_response_json(ISrsHttpResponseWriter* w, string data) @@ -99,13 +98,12 @@ int srs_api_response_json(ISrsHttpResponseWriter* w, string data)
99 98
100 int srs_api_response_json_code(ISrsHttpResponseWriter* w, int code) 99 int srs_api_response_json_code(ISrsHttpResponseWriter* w, int code)
101 { 100 {
102 - std::stringstream ss; 101 + SrsAmf0Object* obj = SrsAmf0Any::object();
  102 + SrsAutoFree(SrsAmf0Object, obj);
103 103
104 - ss << SRS_JOBJECT_START  
105 - << SRS_JFIELD_ERROR(code)  
106 - << SRS_JOBJECT_END; 104 + obj->set("code", SrsAmf0Any::number(code));
107 105
108 - return srs_api_response_json(w, ss.str()); 106 + return srs_api_response_json(w, obj->to_json());
109 } 107 }
110 108
111 int srs_api_response(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string json) 109 int srs_api_response(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string json)
@@ -143,17 +141,19 @@ SrsGoApiRoot::~SrsGoApiRoot() @@ -143,17 +141,19 @@ SrsGoApiRoot::~SrsGoApiRoot()
143 int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 141 int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
144 { 142 {
145 SrsStatistic* stat = SrsStatistic::instance(); 143 SrsStatistic* stat = SrsStatistic::instance();
146 - std::stringstream ss;  
147 144
148 - ss << SRS_JOBJECT_START  
149 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
150 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
151 - << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)  
152 - << SRS_JFIELD_STR("api", "the api root")  
153 - << SRS_JOBJECT_END  
154 - << SRS_JOBJECT_END; 145 + SrsAmf0Object* obj = SrsAmf0Any::object();
  146 + SrsAutoFree(SrsAmf0Object, obj);
155 147
156 - return srs_api_response(w, r, ss.str()); 148 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  149 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  150 +
  151 + SrsAmf0Object* urls = SrsAmf0Any::object();
  152 + obj->set("urls", urls);
  153 +
  154 + urls->set("api", SrsAmf0Any::str("the api root"));
  155 +
  156 + return srs_api_response(w, r, obj->to_json());
157 } 157 }
158 158
159 SrsGoApiApi::SrsGoApiApi() 159 SrsGoApiApi::SrsGoApiApi()
@@ -167,17 +167,19 @@ SrsGoApiApi::~SrsGoApiApi() @@ -167,17 +167,19 @@ SrsGoApiApi::~SrsGoApiApi()
167 int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 167 int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
168 { 168 {
169 SrsStatistic* stat = SrsStatistic::instance(); 169 SrsStatistic* stat = SrsStatistic::instance();
170 - std::stringstream ss;  
171 170
172 - ss << SRS_JOBJECT_START  
173 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
174 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
175 - << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)  
176 - << SRS_JFIELD_STR("v1", "the api version 1.0")  
177 - << SRS_JOBJECT_END  
178 - << SRS_JOBJECT_END; 171 + SrsAmf0Object* obj = SrsAmf0Any::object();
  172 + SrsAutoFree(SrsAmf0Object, obj);
179 173
180 - return srs_api_response(w, r, ss.str()); 174 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  175 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  176 +
  177 + SrsAmf0Object* urls = SrsAmf0Any::object();
  178 + obj->set("urls", urls);
  179 +
  180 + urls->set("v1", SrsAmf0Any::str("the api version 1.0"));
  181 +
  182 + return srs_api_response(w, r, obj->to_json());
181 } 183 }
182 184
183 SrsGoApiV1::SrsGoApiV1() 185 SrsGoApiV1::SrsGoApiV1()
@@ -191,35 +193,39 @@ SrsGoApiV1::~SrsGoApiV1() @@ -191,35 +193,39 @@ SrsGoApiV1::~SrsGoApiV1()
191 int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 193 int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
192 { 194 {
193 SrsStatistic* stat = SrsStatistic::instance(); 195 SrsStatistic* stat = SrsStatistic::instance();
194 - std::stringstream ss;  
195 196
196 - ss << SRS_JOBJECT_START  
197 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
198 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
199 - << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)  
200 - << SRS_JFIELD_STR("versions", "the version of SRS") << SRS_JFIELD_CONT  
201 - << SRS_JFIELD_STR("summaries", "the summary(pid, argv, pwd, cpu, mem) of SRS") << SRS_JFIELD_CONT  
202 - << SRS_JFIELD_STR("rusages", "the rusage of SRS") << SRS_JFIELD_CONT  
203 - << SRS_JFIELD_STR("self_proc_stats", "the self process stats") << SRS_JFIELD_CONT  
204 - << SRS_JFIELD_STR("system_proc_stats", "the system process stats") << SRS_JFIELD_CONT  
205 - << SRS_JFIELD_STR("meminfos", "the meminfo of system") << SRS_JFIELD_CONT  
206 - << SRS_JFIELD_STR("authors", "the license, copyright, authors and contributors") << SRS_JFIELD_CONT  
207 - << SRS_JFIELD_STR("features", "the supported features of SRS") << SRS_JFIELD_CONT  
208 - << SRS_JFIELD_STR("requests", "the request itself, for http debug") << SRS_JFIELD_CONT  
209 - << SRS_JFIELD_STR("vhosts", "manage all vhosts or specified vhost") << SRS_JFIELD_CONT  
210 - << SRS_JFIELD_STR("streams", "manage all streams or specified stream") << SRS_JFIELD_CONT  
211 - << SRS_JFIELD_STR("clients", "manage all clients or specified client, default query top 10 clients") << SRS_JFIELD_CONT  
212 - << SRS_JFIELD_STR("raw", "raw api for srs, support CUID srs for instance the config") << SRS_JFIELD_CONT  
213 - << SRS_JFIELD_ORG("tests", SRS_JOBJECT_START)  
214 - << SRS_JFIELD_STR("requests", "show the request info") << SRS_JFIELD_CONT  
215 - << SRS_JFIELD_STR("errors", "always return an error 100") << SRS_JFIELD_CONT  
216 - << SRS_JFIELD_STR("redirects", "always redirect to /api/v1/test/errors") << SRS_JFIELD_CONT  
217 - << SRS_JFIELD_STR("[vhost]", "http vhost for http://error.srs.com:1985/api/v1/tests/errors")  
218 - << SRS_JOBJECT_END  
219 - << SRS_JOBJECT_END  
220 - << SRS_JOBJECT_END; 197 + SrsAmf0Object* obj = SrsAmf0Any::object();
  198 + SrsAutoFree(SrsAmf0Object, obj);
221 199
222 - return srs_api_response(w, r, ss.str()); 200 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  201 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  202 +
  203 + SrsAmf0Object* urls = SrsAmf0Any::object();
  204 + obj->set("urls", urls);
  205 +
  206 + urls->set("versions", SrsAmf0Any::str("the version of SRS"));
  207 + urls->set("summaries", SrsAmf0Any::str("the summary(pid, argv, pwd, cpu, mem) of SRS"));
  208 + urls->set("rusages", SrsAmf0Any::str("the rusage of SRS"));
  209 + urls->set("self_proc_stats", SrsAmf0Any::str("the self process stats"));
  210 + urls->set("system_proc_stats", SrsAmf0Any::str("the system process stats"));
  211 + urls->set("meminfos", SrsAmf0Any::str("the meminfo of system"));
  212 + urls->set("authors", SrsAmf0Any::str("the license, copyright, authors and contributors"));
  213 + urls->set("features", SrsAmf0Any::str("the supported features of SRS"));
  214 + urls->set("requests", SrsAmf0Any::str("the request itself, for http debug"));
  215 + urls->set("vhosts", SrsAmf0Any::str("manage all vhosts or specified vhost"));
  216 + urls->set("streams", SrsAmf0Any::str("manage all streams or specified stream"));
  217 + urls->set("clients", SrsAmf0Any::str("manage all clients or specified client, default query top 10 clients"));
  218 + urls->set("raw", SrsAmf0Any::str("raw api for srs, support CUID srs for instance the config"));
  219 +
  220 + SrsAmf0Object* tests = SrsAmf0Any::object();
  221 + obj->set("tests", tests);
  222 +
  223 + tests->set("requests", SrsAmf0Any::str("show the request info"));
  224 + tests->set("errors", SrsAmf0Any::str("always return an error 100"));
  225 + tests->set("redirects", SrsAmf0Any::str("always redirect to /api/v1/test/errors"));
  226 + tests->set("[vhost]", SrsAmf0Any::str("http vhost for http://error.srs.com:1985/api/v1/tests/errors"));
  227 +
  228 + return srs_api_response(w, r, obj->to_json());
223 } 229 }
224 230
225 SrsGoApiVersion::SrsGoApiVersion() 231 SrsGoApiVersion::SrsGoApiVersion()
@@ -233,20 +239,22 @@ SrsGoApiVersion::~SrsGoApiVersion() @@ -233,20 +239,22 @@ SrsGoApiVersion::~SrsGoApiVersion()
233 int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 239 int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
234 { 240 {
235 SrsStatistic* stat = SrsStatistic::instance(); 241 SrsStatistic* stat = SrsStatistic::instance();
236 - std::stringstream ss;  
237 242
238 - ss << SRS_JOBJECT_START  
239 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
240 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
241 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
242 - << SRS_JFIELD_ORG("major", VERSION_MAJOR) << SRS_JFIELD_CONT  
243 - << SRS_JFIELD_ORG("minor", VERSION_MINOR) << SRS_JFIELD_CONT  
244 - << SRS_JFIELD_ORG("revision", VERSION_REVISION) << SRS_JFIELD_CONT  
245 - << SRS_JFIELD_STR("version", RTMP_SIG_SRS_VERSION)  
246 - << SRS_JOBJECT_END  
247 - << SRS_JOBJECT_END; 243 + SrsAmf0Object* obj = SrsAmf0Any::object();
  244 + SrsAutoFree(SrsAmf0Object, obj);
248 245
249 - return srs_api_response(w, r, ss.str()); 246 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  247 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  248 +
  249 + SrsAmf0Object* data = SrsAmf0Any::object();
  250 + obj->set("data", data);
  251 +
  252 + data->set("major", SrsAmf0Any::number(VERSION_MAJOR));
  253 + data->set("minor", SrsAmf0Any::number(VERSION_MINOR));
  254 + data->set("revision", SrsAmf0Any::number(VERSION_REVISION));
  255 + data->set("version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION));
  256 +
  257 + return srs_api_response(w, r, obj->to_json());
250 } 258 }
251 259
252 SrsGoApiSummaries::SrsGoApiSummaries() 260 SrsGoApiSummaries::SrsGoApiSummaries()
@@ -275,36 +283,38 @@ SrsGoApiRusages::~SrsGoApiRusages() @@ -275,36 +283,38 @@ SrsGoApiRusages::~SrsGoApiRusages()
275 int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 283 int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
276 { 284 {
277 SrsStatistic* stat = SrsStatistic::instance(); 285 SrsStatistic* stat = SrsStatistic::instance();
278 - std::stringstream ss; 286 +
  287 + SrsAmf0Object* obj = SrsAmf0Any::object();
  288 + SrsAutoFree(SrsAmf0Object, obj);
  289 +
  290 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  291 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  292 +
  293 + SrsAmf0Object* data = SrsAmf0Any::object();
  294 + obj->set("data", data);
279 295
280 SrsRusage* ru = srs_get_system_rusage(); 296 SrsRusage* ru = srs_get_system_rusage();
281 297
282 - ss << SRS_JOBJECT_START  
283 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
284 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
285 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
286 - << SRS_JFIELD_ORG("ok", (ru->ok? "true":"false")) << SRS_JFIELD_CONT  
287 - << SRS_JFIELD_ORG("sample_time", ru->sample_time) << SRS_JFIELD_CONT  
288 - << SRS_JFIELD_ORG("ru_utime", ru->r.ru_utime.tv_sec) << SRS_JFIELD_CONT  
289 - << SRS_JFIELD_ORG("ru_stime", ru->r.ru_stime.tv_sec) << SRS_JFIELD_CONT  
290 - << SRS_JFIELD_ORG("ru_maxrss", ru->r.ru_maxrss) << SRS_JFIELD_CONT  
291 - << SRS_JFIELD_ORG("ru_ixrss", ru->r.ru_ixrss) << SRS_JFIELD_CONT  
292 - << SRS_JFIELD_ORG("ru_idrss", ru->r.ru_idrss) << SRS_JFIELD_CONT  
293 - << SRS_JFIELD_ORG("ru_isrss", ru->r.ru_isrss) << SRS_JFIELD_CONT  
294 - << SRS_JFIELD_ORG("ru_minflt", ru->r.ru_minflt) << SRS_JFIELD_CONT  
295 - << SRS_JFIELD_ORG("ru_majflt", ru->r.ru_majflt) << SRS_JFIELD_CONT  
296 - << SRS_JFIELD_ORG("ru_nswap", ru->r.ru_nswap) << SRS_JFIELD_CONT  
297 - << SRS_JFIELD_ORG("ru_inblock", ru->r.ru_inblock) << SRS_JFIELD_CONT  
298 - << SRS_JFIELD_ORG("ru_oublock", ru->r.ru_oublock) << SRS_JFIELD_CONT  
299 - << SRS_JFIELD_ORG("ru_msgsnd", ru->r.ru_msgsnd) << SRS_JFIELD_CONT  
300 - << SRS_JFIELD_ORG("ru_msgrcv", ru->r.ru_msgrcv) << SRS_JFIELD_CONT  
301 - << SRS_JFIELD_ORG("ru_nsignals", ru->r.ru_nsignals) << SRS_JFIELD_CONT  
302 - << SRS_JFIELD_ORG("ru_nvcsw", ru->r.ru_nvcsw) << SRS_JFIELD_CONT  
303 - << SRS_JFIELD_ORG("ru_nivcsw", ru->r.ru_nivcsw)  
304 - << SRS_JOBJECT_END  
305 - << SRS_JOBJECT_END; 298 + data->set("ok", SrsAmf0Any::boolean(ru->ok? "true":"false"));
  299 + data->set("sample_time", SrsAmf0Any::number(ru->sample_time));
  300 + 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));
  302 + data->set("ru_maxrss", SrsAmf0Any::number(ru->r.ru_maxrss));
  303 + data->set("ru_ixrss", SrsAmf0Any::number(ru->r.ru_ixrss));
  304 + data->set("ru_idrss", SrsAmf0Any::number(ru->r.ru_idrss));
  305 + data->set("ru_isrss", SrsAmf0Any::number(ru->r.ru_isrss));
  306 + data->set("ru_minflt", SrsAmf0Any::number(ru->r.ru_minflt));
  307 + data->set("ru_majflt", SrsAmf0Any::number(ru->r.ru_majflt));
  308 + data->set("ru_nswap", SrsAmf0Any::number(ru->r.ru_nswap));
  309 + data->set("ru_inblock", SrsAmf0Any::number(ru->r.ru_inblock));
  310 + data->set("ru_oublock", SrsAmf0Any::number(ru->r.ru_oublock));
  311 + data->set("ru_msgsnd", SrsAmf0Any::number(ru->r.ru_msgsnd));
  312 + data->set("ru_msgrcv", SrsAmf0Any::number(ru->r.ru_msgrcv));
  313 + data->set("ru_nsignals", SrsAmf0Any::number(ru->r.ru_nsignals));
  314 + data->set("ru_nvcsw", SrsAmf0Any::number(ru->r.ru_nvcsw));
  315 + data->set("ru_nivcsw", SrsAmf0Any::number(ru->r.ru_nivcsw));
306 316
307 - return srs_api_response(w, r, ss.str()); 317 + return srs_api_response(w, r, obj->to_json());
308 } 318 }
309 319
310 SrsGoApiSelfProcStats::SrsGoApiSelfProcStats() 320 SrsGoApiSelfProcStats::SrsGoApiSelfProcStats()
@@ -318,65 +328,70 @@ SrsGoApiSelfProcStats::~SrsGoApiSelfProcStats() @@ -318,65 +328,70 @@ SrsGoApiSelfProcStats::~SrsGoApiSelfProcStats()
318 int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 328 int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
319 { 329 {
320 SrsStatistic* stat = SrsStatistic::instance(); 330 SrsStatistic* stat = SrsStatistic::instance();
321 - std::stringstream ss; 331 +
  332 + SrsAmf0Object* obj = SrsAmf0Any::object();
  333 + SrsAutoFree(SrsAmf0Object, obj);
  334 +
  335 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  336 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  337 +
  338 + SrsAmf0Object* data = SrsAmf0Any::object();
  339 + obj->set("data", data);
322 340
323 SrsProcSelfStat* u = srs_get_self_proc_stat(); 341 SrsProcSelfStat* u = srs_get_self_proc_stat();
324 342
325 - ss << SRS_JOBJECT_START  
326 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
327 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
328 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
329 - << SRS_JFIELD_ORG("ok", (u->ok? "true":"false")) << SRS_JFIELD_CONT  
330 - << SRS_JFIELD_ORG("sample_time", u->sample_time) << SRS_JFIELD_CONT  
331 - << SRS_JFIELD_ORG("percent", u->percent) << SRS_JFIELD_CONT  
332 - << SRS_JFIELD_ORG("pid", u->pid) << SRS_JFIELD_CONT  
333 - << SRS_JFIELD_STR("comm", u->comm) << SRS_JFIELD_CONT  
334 - << SRS_JFIELD_STR("state", u->state) << SRS_JFIELD_CONT  
335 - << SRS_JFIELD_ORG("ppid", u->ppid) << SRS_JFIELD_CONT  
336 - << SRS_JFIELD_ORG("pgrp", u->pgrp) << SRS_JFIELD_CONT  
337 - << SRS_JFIELD_ORG("session", u->session) << SRS_JFIELD_CONT  
338 - << SRS_JFIELD_ORG("tty_nr", u->tty_nr) << SRS_JFIELD_CONT  
339 - << SRS_JFIELD_ORG("tpgid", u->tpgid) << SRS_JFIELD_CONT  
340 - << SRS_JFIELD_ORG("flags", u->flags) << SRS_JFIELD_CONT  
341 - << SRS_JFIELD_ORG("minflt", u->minflt) << SRS_JFIELD_CONT  
342 - << SRS_JFIELD_ORG("cminflt", u->cminflt) << SRS_JFIELD_CONT  
343 - << SRS_JFIELD_ORG("majflt", u->majflt) << SRS_JFIELD_CONT  
344 - << SRS_JFIELD_ORG("cmajflt", u->cmajflt) << SRS_JFIELD_CONT  
345 - << SRS_JFIELD_ORG("utime", u->utime) << SRS_JFIELD_CONT  
346 - << SRS_JFIELD_ORG("stime", u->stime) << SRS_JFIELD_CONT  
347 - << SRS_JFIELD_ORG("cutime", u->cutime) << SRS_JFIELD_CONT  
348 - << SRS_JFIELD_ORG("cstime", u->cstime) << SRS_JFIELD_CONT  
349 - << SRS_JFIELD_ORG("priority", u->priority) << SRS_JFIELD_CONT  
350 - << SRS_JFIELD_ORG("nice", u->nice) << SRS_JFIELD_CONT  
351 - << SRS_JFIELD_ORG("num_threads", u->num_threads) << SRS_JFIELD_CONT  
352 - << SRS_JFIELD_ORG("itrealvalue", u->itrealvalue) << SRS_JFIELD_CONT  
353 - << SRS_JFIELD_ORG("starttime", u->starttime) << SRS_JFIELD_CONT  
354 - << SRS_JFIELD_ORG("vsize", u->vsize) << SRS_JFIELD_CONT  
355 - << SRS_JFIELD_ORG("rss", u->rss) << SRS_JFIELD_CONT  
356 - << SRS_JFIELD_ORG("rsslim", u->rsslim) << SRS_JFIELD_CONT  
357 - << SRS_JFIELD_ORG("startcode", u->startcode) << SRS_JFIELD_CONT  
358 - << SRS_JFIELD_ORG("endcode", u->endcode) << SRS_JFIELD_CONT  
359 - << SRS_JFIELD_ORG("startstack", u->startstack) << SRS_JFIELD_CONT  
360 - << SRS_JFIELD_ORG("kstkesp", u->kstkesp) << SRS_JFIELD_CONT  
361 - << SRS_JFIELD_ORG("kstkeip", u->kstkeip) << SRS_JFIELD_CONT  
362 - << SRS_JFIELD_ORG("signal", u->signal) << SRS_JFIELD_CONT  
363 - << SRS_JFIELD_ORG("blocked", u->blocked) << SRS_JFIELD_CONT  
364 - << SRS_JFIELD_ORG("sigignore", u->sigignore) << SRS_JFIELD_CONT  
365 - << SRS_JFIELD_ORG("sigcatch", u->sigcatch) << SRS_JFIELD_CONT  
366 - << SRS_JFIELD_ORG("wchan", u->wchan) << SRS_JFIELD_CONT  
367 - << SRS_JFIELD_ORG("nswap", u->nswap) << SRS_JFIELD_CONT  
368 - << SRS_JFIELD_ORG("cnswap", u->cnswap) << SRS_JFIELD_CONT  
369 - << SRS_JFIELD_ORG("exit_signal", u->exit_signal) << SRS_JFIELD_CONT  
370 - << SRS_JFIELD_ORG("processor", u->processor) << SRS_JFIELD_CONT  
371 - << SRS_JFIELD_ORG("rt_priority", u->rt_priority) << SRS_JFIELD_CONT  
372 - << SRS_JFIELD_ORG("policy", u->policy) << SRS_JFIELD_CONT  
373 - << SRS_JFIELD_ORG("delayacct_blkio_ticks", u->delayacct_blkio_ticks) << SRS_JFIELD_CONT  
374 - << SRS_JFIELD_ORG("guest_time", u->guest_time) << SRS_JFIELD_CONT  
375 - << SRS_JFIELD_ORG("cguest_time", u->cguest_time)  
376 - << SRS_JOBJECT_END  
377 - << SRS_JOBJECT_END; 343 + string state;
  344 + state += (char)u->state;
  345 +
  346 + data->set("ok", SrsAmf0Any::boolean(u->ok? "true":"false"));
  347 + data->set("sample_time", SrsAmf0Any::number(u->sample_time));
  348 + data->set("percent", SrsAmf0Any::number(u->percent));
  349 + data->set("pid", SrsAmf0Any::number(u->pid));
  350 + data->set("comm", SrsAmf0Any::str(u->comm));
  351 + data->set("state", SrsAmf0Any::str(state.c_str()));
  352 + data->set("ppid", SrsAmf0Any::number(u->ppid));
  353 + data->set("pgrp", SrsAmf0Any::number(u->pgrp));
  354 + data->set("session", SrsAmf0Any::number(u->session));
  355 + data->set("tty_nr", SrsAmf0Any::number(u->tty_nr));
  356 + data->set("tpgid", SrsAmf0Any::number(u->tpgid));
  357 + data->set("flags", SrsAmf0Any::number(u->flags));
  358 + data->set("minflt", SrsAmf0Any::number(u->minflt));
  359 + data->set("cminflt", SrsAmf0Any::number(u->cminflt));
  360 + data->set("majflt", SrsAmf0Any::number(u->majflt));
  361 + data->set("cmajflt", SrsAmf0Any::number(u->cmajflt));
  362 + data->set("utime", SrsAmf0Any::number(u->utime));
  363 + data->set("stime", SrsAmf0Any::number(u->stime));
  364 + data->set("cutime", SrsAmf0Any::number(u->cutime));
  365 + data->set("cstime", SrsAmf0Any::number(u->cstime));
  366 + data->set("priority", SrsAmf0Any::number(u->priority));
  367 + data->set("nice", SrsAmf0Any::number(u->nice));
  368 + data->set("num_threads", SrsAmf0Any::number(u->num_threads));
  369 + data->set("itrealvalue", SrsAmf0Any::number(u->itrealvalue));
  370 + data->set("starttime", SrsAmf0Any::number(u->starttime));
  371 + data->set("vsize", SrsAmf0Any::number(u->vsize));
  372 + data->set("rss", SrsAmf0Any::number(u->rss));
  373 + data->set("rsslim", SrsAmf0Any::number(u->rsslim));
  374 + data->set("startcode", SrsAmf0Any::number(u->startcode));
  375 + data->set("endcode", SrsAmf0Any::number(u->endcode));
  376 + data->set("startstack", SrsAmf0Any::number(u->startstack));
  377 + data->set("kstkesp", SrsAmf0Any::number(u->kstkesp));
  378 + data->set("kstkeip", SrsAmf0Any::number(u->kstkeip));
  379 + data->set("signal", SrsAmf0Any::number(u->signal));
  380 + data->set("blocked", SrsAmf0Any::number(u->blocked));
  381 + data->set("sigignore", SrsAmf0Any::number(u->sigignore));
  382 + data->set("sigcatch", SrsAmf0Any::number(u->sigcatch));
  383 + data->set("wchan", SrsAmf0Any::number(u->wchan));
  384 + data->set("nswap", SrsAmf0Any::number(u->nswap));
  385 + data->set("cnswap", SrsAmf0Any::number(u->cnswap));
  386 + data->set("exit_signal", SrsAmf0Any::number(u->exit_signal));
  387 + data->set("processor", SrsAmf0Any::number(u->processor));
  388 + data->set("rt_priority", SrsAmf0Any::number(u->rt_priority));
  389 + data->set("policy", SrsAmf0Any::number(u->policy));
  390 + data->set("delayacct_blkio_ticks", SrsAmf0Any::number(u->delayacct_blkio_ticks));
  391 + data->set("guest_time", SrsAmf0Any::number(u->guest_time));
  392 + data->set("cguest_time", SrsAmf0Any::number(u->cguest_time));
378 393
379 - return srs_api_response(w, r, ss.str()); 394 + return srs_api_response(w, r, obj->to_json());
380 } 395 }
381 396
382 SrsGoApiSystemProcStats::SrsGoApiSystemProcStats() 397 SrsGoApiSystemProcStats::SrsGoApiSystemProcStats()
@@ -390,30 +405,32 @@ SrsGoApiSystemProcStats::~SrsGoApiSystemProcStats() @@ -390,30 +405,32 @@ SrsGoApiSystemProcStats::~SrsGoApiSystemProcStats()
390 int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 405 int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
391 { 406 {
392 SrsStatistic* stat = SrsStatistic::instance(); 407 SrsStatistic* stat = SrsStatistic::instance();
393 - std::stringstream ss; 408 +
  409 + SrsAmf0Object* obj = SrsAmf0Any::object();
  410 + SrsAutoFree(SrsAmf0Object, obj);
  411 +
  412 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  413 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  414 +
  415 + SrsAmf0Object* data = SrsAmf0Any::object();
  416 + obj->set("data", data);
394 417
395 SrsProcSystemStat* s = srs_get_system_proc_stat(); 418 SrsProcSystemStat* s = srs_get_system_proc_stat();
396 419
397 - ss << SRS_JOBJECT_START  
398 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
399 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
400 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
401 - << SRS_JFIELD_ORG("ok", (s->ok? "true":"false")) << SRS_JFIELD_CONT  
402 - << SRS_JFIELD_ORG("sample_time", s->sample_time) << SRS_JFIELD_CONT  
403 - << SRS_JFIELD_ORG("percent", s->percent) << SRS_JFIELD_CONT  
404 - << SRS_JFIELD_ORG("user", s->user) << SRS_JFIELD_CONT  
405 - << SRS_JFIELD_ORG("nice", s->nice) << SRS_JFIELD_CONT  
406 - << SRS_JFIELD_ORG("sys", s->sys) << SRS_JFIELD_CONT  
407 - << SRS_JFIELD_ORG("idle", s->idle) << SRS_JFIELD_CONT  
408 - << SRS_JFIELD_ORG("iowait", s->iowait) << SRS_JFIELD_CONT  
409 - << SRS_JFIELD_ORG("irq", s->irq) << SRS_JFIELD_CONT  
410 - << SRS_JFIELD_ORG("softirq", s->softirq) << SRS_JFIELD_CONT  
411 - << SRS_JFIELD_ORG("steal", s->steal) << SRS_JFIELD_CONT  
412 - << SRS_JFIELD_ORG("guest", s->guest)  
413 - << SRS_JOBJECT_END  
414 - << SRS_JOBJECT_END; 420 + data->set("ok", SrsAmf0Any::boolean(s->ok? "true":"false"));
  421 + data->set("sample_time", SrsAmf0Any::number(s->sample_time));
  422 + data->set("percent", SrsAmf0Any::number(s->percent));
  423 + data->set("user", SrsAmf0Any::number(s->user));
  424 + data->set("nice", SrsAmf0Any::number(s->nice));
  425 + data->set("sys", SrsAmf0Any::number(s->sys));
  426 + data->set("idle", SrsAmf0Any::number(s->idle));
  427 + data->set("iowait", SrsAmf0Any::number(s->iowait));
  428 + data->set("irq", SrsAmf0Any::number(s->irq));
  429 + data->set("softirq", SrsAmf0Any::number(s->softirq));
  430 + data->set("steal", SrsAmf0Any::number(s->steal));
  431 + data->set("guest", SrsAmf0Any::number(s->guest));
415 432
416 - return srs_api_response(w, r, ss.str()); 433 + return srs_api_response(w, r, obj->to_json());
417 } 434 }
418 435
419 SrsGoApiMemInfos::SrsGoApiMemInfos() 436 SrsGoApiMemInfos::SrsGoApiMemInfos()
@@ -427,31 +444,33 @@ SrsGoApiMemInfos::~SrsGoApiMemInfos() @@ -427,31 +444,33 @@ SrsGoApiMemInfos::~SrsGoApiMemInfos()
427 int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 444 int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
428 { 445 {
429 SrsStatistic* stat = SrsStatistic::instance(); 446 SrsStatistic* stat = SrsStatistic::instance();
430 - std::stringstream ss; 447 +
  448 + SrsAmf0Object* obj = SrsAmf0Any::object();
  449 + SrsAutoFree(SrsAmf0Object, obj);
  450 +
  451 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  452 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  453 +
  454 + SrsAmf0Object* data = SrsAmf0Any::object();
  455 + obj->set("data", data);
431 456
432 SrsMemInfo* m = srs_get_meminfo(); 457 SrsMemInfo* m = srs_get_meminfo();
433 458
434 - ss << SRS_JOBJECT_START  
435 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
436 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
437 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
438 - << SRS_JFIELD_ORG("ok", (m->ok? "true":"false")) << SRS_JFIELD_CONT  
439 - << SRS_JFIELD_ORG("sample_time", m->sample_time) << SRS_JFIELD_CONT  
440 - << SRS_JFIELD_ORG("percent_ram", m->percent_ram) << SRS_JFIELD_CONT  
441 - << SRS_JFIELD_ORG("percent_swap", m->percent_swap) << SRS_JFIELD_CONT  
442 - << SRS_JFIELD_ORG("MemActive", m->MemActive) << SRS_JFIELD_CONT  
443 - << SRS_JFIELD_ORG("RealInUse", m->RealInUse) << SRS_JFIELD_CONT  
444 - << SRS_JFIELD_ORG("NotInUse", m->NotInUse) << SRS_JFIELD_CONT  
445 - << SRS_JFIELD_ORG("MemTotal", m->MemTotal) << SRS_JFIELD_CONT  
446 - << SRS_JFIELD_ORG("MemFree", m->MemFree) << SRS_JFIELD_CONT  
447 - << SRS_JFIELD_ORG("Buffers", m->Buffers) << SRS_JFIELD_CONT  
448 - << SRS_JFIELD_ORG("Cached", m->Cached) << SRS_JFIELD_CONT  
449 - << SRS_JFIELD_ORG("SwapTotal", m->SwapTotal) << SRS_JFIELD_CONT  
450 - << SRS_JFIELD_ORG("SwapFree", m->SwapFree)  
451 - << SRS_JOBJECT_END  
452 - << SRS_JOBJECT_END; 459 + data->set("ok", SrsAmf0Any::boolean(m->ok? "true":"false"));
  460 + data->set("sample_time", SrsAmf0Any::number(m->sample_time));
  461 + data->set("percent_ram", SrsAmf0Any::number(m->percent_ram));
  462 + data->set("percent_swap", SrsAmf0Any::number(m->percent_swap));
  463 + data->set("MemActive", SrsAmf0Any::number(m->MemActive));
  464 + data->set("RealInUse", SrsAmf0Any::number(m->RealInUse));
  465 + data->set("NotInUse", SrsAmf0Any::number(m->NotInUse));
  466 + data->set("MemTotal", SrsAmf0Any::number(m->MemTotal));
  467 + data->set("MemFree", SrsAmf0Any::number(m->MemFree));
  468 + data->set("Buffers", SrsAmf0Any::number(m->Buffers));
  469 + data->set("Cached", SrsAmf0Any::number(m->Cached));
  470 + data->set("SwapTotal", SrsAmf0Any::number(m->SwapTotal));
  471 + data->set("SwapFree", SrsAmf0Any::number(m->SwapFree));
453 472
454 - return srs_api_response(w, r, ss.str()); 473 + return srs_api_response(w, r, obj->to_json());
455 } 474 }
456 475
457 SrsGoApiAuthors::SrsGoApiAuthors() 476 SrsGoApiAuthors::SrsGoApiAuthors()
@@ -465,22 +484,24 @@ SrsGoApiAuthors::~SrsGoApiAuthors() @@ -465,22 +484,24 @@ SrsGoApiAuthors::~SrsGoApiAuthors()
465 int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 484 int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
466 { 485 {
467 SrsStatistic* stat = SrsStatistic::instance(); 486 SrsStatistic* stat = SrsStatistic::instance();
468 - std::stringstream ss;  
469 487
470 - ss << SRS_JOBJECT_START  
471 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
472 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
473 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
474 - << SRS_JFIELD_STR("primary", RTMP_SIG_SRS_PRIMARY) << SRS_JFIELD_CONT  
475 - << SRS_JFIELD_STR("license", RTMP_SIG_SRS_LICENSE) << SRS_JFIELD_CONT  
476 - << SRS_JFIELD_STR("copyright", RTMP_SIG_SRS_COPYRIGHT) << SRS_JFIELD_CONT  
477 - << SRS_JFIELD_STR("authors", RTMP_SIG_SRS_AUTHROS) << SRS_JFIELD_CONT  
478 - << SRS_JFIELD_STR("contributors_link", RTMP_SIG_SRS_CONTRIBUTORS_URL) << SRS_JFIELD_CONT  
479 - << SRS_JFIELD_STR("contributors", SRS_AUTO_CONSTRIBUTORS)  
480 - << SRS_JOBJECT_END  
481 - << SRS_JOBJECT_END; 488 + SrsAmf0Object* obj = SrsAmf0Any::object();
  489 + SrsAutoFree(SrsAmf0Object, obj);
482 490
483 - return srs_api_response(w, r, ss.str()); 491 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  492 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  493 +
  494 + SrsAmf0Object* data = SrsAmf0Any::object();
  495 + obj->set("data", data);
  496 +
  497 + data->set("primary", SrsAmf0Any::str(RTMP_SIG_SRS_PRIMARY));
  498 + data->set("license", SrsAmf0Any::str(RTMP_SIG_SRS_LICENSE));
  499 + data->set("copyright", SrsAmf0Any::str(RTMP_SIG_SRS_COPYRIGHT));
  500 + data->set("authors", SrsAmf0Any::str(RTMP_SIG_SRS_AUTHROS));
  501 + data->set("contributors_link", SrsAmf0Any::str(RTMP_SIG_SRS_CONTRIBUTORS_URL));
  502 + data->set("contributors", SrsAmf0Any::str(SRS_AUTO_CONSTRIBUTORS));
  503 +
  504 + return srs_api_response(w, r, obj->to_json());
484 } 505 }
485 506
486 SrsGoApiFeatures::SrsGoApiFeatures() 507 SrsGoApiFeatures::SrsGoApiFeatures()
@@ -494,119 +515,111 @@ SrsGoApiFeatures::~SrsGoApiFeatures() @@ -494,119 +515,111 @@ SrsGoApiFeatures::~SrsGoApiFeatures()
494 int SrsGoApiFeatures::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 515 int SrsGoApiFeatures::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
495 { 516 {
496 SrsStatistic* stat = SrsStatistic::instance(); 517 SrsStatistic* stat = SrsStatistic::instance();
497 - std::stringstream ss; 518 +
  519 + SrsAmf0Object* obj = SrsAmf0Any::object();
  520 + SrsAutoFree(SrsAmf0Object, obj);
  521 +
  522 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  523 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  524 +
  525 + SrsAmf0Object* data = SrsAmf0Any::object();
  526 + obj->set("data", data);
  527 +
  528 + data->set("options", SrsAmf0Any::str(SRS_AUTO_USER_CONFIGURE));
  529 + data->set("options2", SrsAmf0Any::str(SRS_AUTO_CONFIGURE));
  530 + data->set("build", SrsAmf0Any::str(SRS_AUTO_BUILD_DATE));
  531 + data->set("build2", SrsAmf0Any::str(SRS_AUTO_BUILD_TS));
  532 +
  533 + SrsAmf0Object* features = SrsAmf0Any::object();
  534 + data->set("features", features);
498 535
499 #ifdef SRS_AUTO_SSL 536 #ifdef SRS_AUTO_SSL
500 - bool ssl = true; 537 + features->set("ssl", SrsAmf0Any::boolean(true));
501 #else 538 #else
502 - bool ssl = false; 539 + features->set("ssl", SrsAmf0Any::boolean(false));
503 #endif 540 #endif
504 #ifdef SRS_AUTO_HLS 541 #ifdef SRS_AUTO_HLS
505 - bool hls = true; 542 + features->set("hls", SrsAmf0Any::boolean(true));
506 #else 543 #else
507 - bool hls = false; 544 + features->set("hls", SrsAmf0Any::boolean(false));
508 #endif 545 #endif
509 #ifdef SRS_AUTO_HDS 546 #ifdef SRS_AUTO_HDS
510 - bool hds = true; 547 + features->set("hds", SrsAmf0Any::boolean(true));
511 #else 548 #else
512 - bool hds = false; 549 + features->set("hds", SrsAmf0Any::boolean(false));
513 #endif 550 #endif
514 #ifdef SRS_AUTO_HTTP_CALLBACK 551 #ifdef SRS_AUTO_HTTP_CALLBACK
515 - bool callback = true; 552 + features->set("callback", SrsAmf0Any::boolean(true));
516 #else 553 #else
517 - bool callback = false; 554 + features->set("callback", SrsAmf0Any::boolean(false));
518 #endif 555 #endif
519 #ifdef SRS_AUTO_HTTP_API 556 #ifdef SRS_AUTO_HTTP_API
520 - bool api = true; 557 + features->set("api", SrsAmf0Any::boolean(true));
521 #else 558 #else
522 - bool api = false; 559 + features->set("api", SrsAmf0Any::boolean(false));
523 #endif 560 #endif
524 #ifdef SRS_AUTO_HTTP_SERVER 561 #ifdef SRS_AUTO_HTTP_SERVER
525 - bool httpd = true; 562 + features->set("httpd", SrsAmf0Any::boolean(true));
526 #else 563 #else
527 - bool httpd = false; 564 + features->set("httpd", SrsAmf0Any::boolean(false));
528 #endif 565 #endif
529 #ifdef SRS_AUTO_DVR 566 #ifdef SRS_AUTO_DVR
530 - bool dvr = true; 567 + features->set("dvr", SrsAmf0Any::boolean(true));
531 #else 568 #else
532 - bool dvr = false; 569 + features->set("dvr", SrsAmf0Any::boolean(false));
533 #endif 570 #endif
534 #ifdef SRS_AUTO_TRANSCODE 571 #ifdef SRS_AUTO_TRANSCODE
535 - bool transcode = true; 572 + features->set("transcode", SrsAmf0Any::boolean(true));
536 #else 573 #else
537 - bool transcode = false; 574 + features->set("transcode", SrsAmf0Any::boolean(false));
538 #endif 575 #endif
539 #ifdef SRS_AUTO_INGEST 576 #ifdef SRS_AUTO_INGEST
540 - bool ingest = true; 577 + features->set("ingest", SrsAmf0Any::boolean(true));
541 #else 578 #else
542 - bool ingest = false; 579 + features->set("ingest", SrsAmf0Any::boolean(false));
543 #endif 580 #endif
544 #ifdef SRS_AUTO_STAT 581 #ifdef SRS_AUTO_STAT
545 - bool _stat = true; 582 + features->set("stat", SrsAmf0Any::boolean(true));
546 #else 583 #else
547 - bool _stat = false; 584 + features->set("stat", SrsAmf0Any::boolean(false));
548 #endif 585 #endif
549 #ifdef SRS_AUTO_NGINX 586 #ifdef SRS_AUTO_NGINX
550 - bool nginx = true; 587 + features->set("nginx", SrsAmf0Any::boolean(true));
551 #else 588 #else
552 - bool nginx = false; 589 + features->set("nginx", SrsAmf0Any::boolean(false));
553 #endif 590 #endif
554 #ifdef SRS_AUTO_FFMPEG_TOOL 591 #ifdef SRS_AUTO_FFMPEG_TOOL
555 - bool ffmpeg = true; 592 + features->set("ffmpeg", SrsAmf0Any::boolean(true));
556 #else 593 #else
557 - bool ffmpeg = false; 594 + features->set("ffmpeg", SrsAmf0Any::boolean(false));
558 #endif 595 #endif
559 #ifdef SRS_AUTO_STREAM_CASTER 596 #ifdef SRS_AUTO_STREAM_CASTER
560 - bool caster = true; 597 + features->set("caster", SrsAmf0Any::boolean(true));
561 #else 598 #else
562 - bool caster = false; 599 + features->set("caster", SrsAmf0Any::boolean(false));
563 #endif 600 #endif
564 #ifdef SRS_PERF_COMPLEX_SEND 601 #ifdef SRS_PERF_COMPLEX_SEND
565 - bool complex_send = true; 602 + features->set("complex_send", SrsAmf0Any::boolean(true));
566 #else 603 #else
567 - bool complex_send = false; 604 + features->set("complex_send", SrsAmf0Any::boolean(false));
568 #endif 605 #endif
569 #ifdef SRS_PERF_TCP_NODELAY 606 #ifdef SRS_PERF_TCP_NODELAY
570 - bool tcp_nodelay = true; 607 + features->set("tcp_nodelay", SrsAmf0Any::boolean(true));
571 #else 608 #else
572 - bool tcp_nodelay = false; 609 + features->set("tcp_nodelay", SrsAmf0Any::boolean(false));
573 #endif 610 #endif
574 #ifdef SRS_PERF_SO_SNDBUF_SIZE 611 #ifdef SRS_PERF_SO_SNDBUF_SIZE
575 - bool so_sendbuf = true; 612 + features->set("so_sendbuf", SrsAmf0Any::boolean(true));
576 #else 613 #else
577 - bool so_sendbuf = false; 614 + features->set("so_sendbuf", SrsAmf0Any::boolean(false));
578 #endif 615 #endif
579 #ifdef SRS_PERF_MERGED_READ 616 #ifdef SRS_PERF_MERGED_READ
580 - bool mr = true; 617 + features->set("mr", SrsAmf0Any::boolean(true));
581 #else 618 #else
582 - bool mr = false; 619 + features->set("mr", SrsAmf0Any::boolean(false));
583 #endif 620 #endif
584 621
585 - ss << SRS_JOBJECT_START  
586 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
587 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
588 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
589 - << SRS_JFIELD_BOOL("ssl", ssl) << SRS_JFIELD_CONT  
590 - << SRS_JFIELD_BOOL("hls", hls) << SRS_JFIELD_CONT  
591 - << SRS_JFIELD_BOOL("hds", hds) << SRS_JFIELD_CONT  
592 - << SRS_JFIELD_BOOL("callback", callback) << SRS_JFIELD_CONT  
593 - << SRS_JFIELD_BOOL("api", api) << SRS_JFIELD_CONT  
594 - << SRS_JFIELD_BOOL("httpd", httpd) << SRS_JFIELD_CONT  
595 - << SRS_JFIELD_BOOL("dvr", dvr) << SRS_JFIELD_CONT  
596 - << SRS_JFIELD_BOOL("transcode", transcode) << SRS_JFIELD_CONT  
597 - << SRS_JFIELD_BOOL("ingest", ingest) << SRS_JFIELD_CONT  
598 - << SRS_JFIELD_BOOL("stat", _stat) << SRS_JFIELD_CONT  
599 - << SRS_JFIELD_BOOL("nginx", nginx) << SRS_JFIELD_CONT  
600 - << SRS_JFIELD_BOOL("ffmpeg", ffmpeg) << SRS_JFIELD_CONT  
601 - << SRS_JFIELD_BOOL("stream_caster", caster) << SRS_JFIELD_CONT  
602 - << SRS_JFIELD_BOOL("complex_send", complex_send) << SRS_JFIELD_CONT  
603 - << SRS_JFIELD_BOOL("tcp_nodelay", tcp_nodelay) << SRS_JFIELD_CONT  
604 - << SRS_JFIELD_BOOL("so_sendbuf", so_sendbuf) << SRS_JFIELD_CONT  
605 - << SRS_JFIELD_BOOL("mr", mr)  
606 - << SRS_JOBJECT_END  
607 - << SRS_JOBJECT_END;  
608 -  
609 - return srs_api_response(w, r, ss.str()); 622 + return srs_api_response(w, r, obj->to_json());
610 } 623 }
611 624
612 SrsGoApiRequests::SrsGoApiRequests() 625 SrsGoApiRequests::SrsGoApiRequests()
@@ -619,57 +632,44 @@ SrsGoApiRequests::~SrsGoApiRequests() @@ -619,57 +632,44 @@ SrsGoApiRequests::~SrsGoApiRequests()
619 632
620 int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 633 int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
621 { 634 {
622 - ISrsHttpMessage* req = r;  
623 -  
624 SrsStatistic* stat = SrsStatistic::instance(); 635 SrsStatistic* stat = SrsStatistic::instance();
625 - std::stringstream ss;  
626 636
627 - ss << SRS_JOBJECT_START  
628 - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT  
629 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
630 - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)  
631 - << SRS_JFIELD_STR("uri", req->uri()) << SRS_JFIELD_CONT  
632 - << SRS_JFIELD_STR("path", req->path()) << SRS_JFIELD_CONT; 637 + SrsAmf0Object* obj = SrsAmf0Any::object();
  638 + SrsAutoFree(SrsAmf0Object, obj);
  639 +
  640 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  641 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  642 +
  643 + SrsAmf0Object* data = SrsAmf0Any::object();
  644 + obj->set("data", data);
  645 +
  646 + data->set("uri", SrsAmf0Any::str(r->uri().c_str()));
  647 + data->set("path", SrsAmf0Any::str(r->path().c_str()));
633 648
634 // method 649 // method
635 - if (req->is_http_get()) {  
636 - ss << SRS_JFIELD_STR("METHOD", "GET");  
637 - } else if (req->is_http_post()) {  
638 - ss << SRS_JFIELD_STR("METHOD", "POST");  
639 - } else if (req->is_http_put()) {  
640 - ss << SRS_JFIELD_STR("METHOD", "PUT");  
641 - } else if (req->is_http_delete()) {  
642 - ss << SRS_JFIELD_STR("METHOD", "DELETE");  
643 - } else {  
644 - ss << SRS_JFIELD_ORG("METHOD", req->method());  
645 - }  
646 - ss << SRS_JFIELD_CONT; 650 + data->set("METHOD", SrsAmf0Any::str(r->method_str().c_str()));
647 651
648 // request headers 652 // request headers
649 - ss << SRS_JFIELD_NAME("headers") << SRS_JOBJECT_START;  
650 - for (int i = 0; i < req->request_header_count(); i++) {  
651 - std::string key = req->request_header_key_at(i);  
652 - std::string value = req->request_header_value_at(i);  
653 - if ( i < req->request_header_count() - 1) {  
654 - ss << SRS_JFIELD_STR(key, value) << SRS_JFIELD_CONT;  
655 - } else {  
656 - ss << SRS_JFIELD_STR(key, value);  
657 - } 653 + SrsAmf0Object* headers = SrsAmf0Any::object();
  654 + data->set("headers", headers);
  655 +
  656 + for (int i = 0; i < r->request_header_count(); i++) {
  657 + std::string key = r->request_header_key_at(i);
  658 + std::string value = r->request_header_value_at(i);
  659 + headers->set(key, SrsAmf0Any::str(value.c_str()));
658 } 660 }
659 - ss << SRS_JOBJECT_END << SRS_JFIELD_CONT;  
660 661
661 // server informations 662 // server informations
662 - ss << SRS_JFIELD_NAME("server") << SRS_JOBJECT_START  
663 - << SRS_JFIELD_STR("sigature", RTMP_SIG_SRS_KEY) << SRS_JFIELD_CONT  
664 - << SRS_JFIELD_STR("name", RTMP_SIG_SRS_NAME) << SRS_JFIELD_CONT  
665 - << SRS_JFIELD_STR("version", RTMP_SIG_SRS_VERSION) << SRS_JFIELD_CONT  
666 - << SRS_JFIELD_STR("link", RTMP_SIG_SRS_URL) << SRS_JFIELD_CONT  
667 - << SRS_JFIELD_ORG("time", srs_get_system_time_ms())  
668 - << SRS_JOBJECT_END  
669 - << SRS_JOBJECT_END  
670 - << SRS_JOBJECT_END; 663 + SrsAmf0Object* server = SrsAmf0Any::object();
  664 + data->set("headers", server);
671 665
672 - return srs_api_response(w, r, ss.str()); 666 + server->set("sigature", SrsAmf0Any::str(RTMP_SIG_SRS_KEY));
  667 + server->set("name", SrsAmf0Any::str(RTMP_SIG_SRS_NAME));
  668 + server->set("version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION));
  669 + server->set("link", SrsAmf0Any::str(RTMP_SIG_SRS_URL));
  670 + server->set("time", SrsAmf0Any::number(srs_get_system_time_ms()));
  671 +
  672 + return srs_api_response(w, r, obj->to_json());
673 } 673 }
674 674
675 SrsGoApiVhosts::SrsGoApiVhosts() 675 SrsGoApiVhosts::SrsGoApiVhosts()
@@ -685,7 +685,6 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -685,7 +685,6 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
685 int ret = ERROR_SUCCESS; 685 int ret = ERROR_SUCCESS;
686 686
687 SrsStatistic* stat = SrsStatistic::instance(); 687 SrsStatistic* stat = SrsStatistic::instance();
688 - std::stringstream ss;  
689 688
690 // path: {pattern}{vhost_id} 689 // path: {pattern}{vhost_id}
691 // e.g. /api/v1/vhosts/100 pattern= /api/v1/vhosts/, vhost_id=100 690 // e.g. /api/v1/vhosts/100 pattern= /api/v1/vhosts/, vhost_id=100
@@ -698,31 +697,33 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -698,31 +697,33 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
698 return srs_api_response_code(w, r, ret); 697 return srs_api_response_code(w, r, ret);
699 } 698 }
700 699
701 - if (r->is_http_get()) {  
702 - std::stringstream data; 700 + SrsAmf0Object* obj = SrsAmf0Any::object();
  701 + SrsAutoFree(SrsAmf0Object, obj);
  702 +
  703 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  704 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
703 705
  706 + if (r->is_http_get()) {
704 if (!vhost) { 707 if (!vhost) {
705 - ret = stat->dumps_vhosts(data); 708 + SrsAmf0StrictArray* data = SrsAmf0Any::strict_array();
  709 + obj->set("vhosts", data);
706 710
707 - ss << SRS_JOBJECT_START  
708 - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT  
709 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
710 - << SRS_JFIELD_ORG("vhosts", data.str())  
711 - << SRS_JOBJECT_END; 711 + if ((ret = stat->dumps_vhosts(data)) != ERROR_SUCCESS) {
  712 + return srs_api_response_code(w, r, ret);
  713 + }
712 } else { 714 } else {
713 - ret = vhost->dumps(data); 715 + SrsAmf0Object* data = SrsAmf0Any::object();
  716 + obj->set("vhost", data);;
714 717
715 - ss << SRS_JOBJECT_START  
716 - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT  
717 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
718 - << SRS_JFIELD_ORG("vhost", data.str())  
719 - << SRS_JOBJECT_END; 718 + if ((ret = vhost->dumps(data)) != ERROR_SUCCESS) {
  719 + return srs_api_response_code(w, r, ret);
720 } 720 }
721 -  
722 - return srs_api_response(w, r, ss.str()); 721 + }
  722 + } else {
  723 + return srs_go_http_error(w, SRS_CONSTS_HTTP_MethodNotAllowed);
723 } 724 }
724 725
725 - return srs_api_response(w, r, ss.str()); 726 + return srs_api_response(w, r, obj->to_json());
726 } 727 }
727 728
728 SrsGoApiStreams::SrsGoApiStreams() 729 SrsGoApiStreams::SrsGoApiStreams()
@@ -738,7 +739,6 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -738,7 +739,6 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
738 int ret = ERROR_SUCCESS; 739 int ret = ERROR_SUCCESS;
739 740
740 SrsStatistic* stat = SrsStatistic::instance(); 741 SrsStatistic* stat = SrsStatistic::instance();
741 - std::stringstream ss;  
742 742
743 // path: {pattern}{stream_id} 743 // path: {pattern}{stream_id}
744 // e.g. /api/v1/streams/100 pattern= /api/v1/streams/, stream_id=100 744 // e.g. /api/v1/streams/100 pattern= /api/v1/streams/, stream_id=100
@@ -751,31 +751,33 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -751,31 +751,33 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
751 return srs_api_response_code(w, r, ret); 751 return srs_api_response_code(w, r, ret);
752 } 752 }
753 753
754 - if (r->is_http_get()) {  
755 - std::stringstream data; 754 + SrsAmf0Object* obj = SrsAmf0Any::object();
  755 + SrsAutoFree(SrsAmf0Object, obj);
756 756
  757 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  758 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
  759 +
  760 + if (r->is_http_get()) {
757 if (!stream) { 761 if (!stream) {
758 - ret = stat->dumps_streams(data); 762 + SrsAmf0StrictArray* data = SrsAmf0Any::strict_array();
  763 + obj->set("streams", data);
759 764
760 - ss << SRS_JOBJECT_START  
761 - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT  
762 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
763 - << SRS_JFIELD_ORG("streams", data.str())  
764 - << SRS_JOBJECT_END; 765 + if ((ret = stat->dumps_streams(data)) != ERROR_SUCCESS) {
  766 + return srs_api_response_code(w, r, ret);
  767 + }
765 } else { 768 } else {
766 - ret = stream->dumps(data); 769 + SrsAmf0Object* data = SrsAmf0Any::object();
  770 + obj->set("stream", data);;
767 771
768 - ss << SRS_JOBJECT_START  
769 - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT  
770 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
771 - << SRS_JFIELD_ORG("stream", data.str())  
772 - << SRS_JOBJECT_END; 772 + if ((ret = stream->dumps(data)) != ERROR_SUCCESS) {
  773 + return srs_api_response_code(w, r, ret);
773 } 774 }
774 -  
775 - return srs_api_response(w, r, ss.str()); 775 + }
  776 + } else {
  777 + return srs_go_http_error(w, SRS_CONSTS_HTTP_MethodNotAllowed);
776 } 778 }
777 779
778 - return ret; 780 + return srs_api_response(w, r, obj->to_json());
779 } 781 }
780 782
781 SrsGoApiClients::SrsGoApiClients() 783 SrsGoApiClients::SrsGoApiClients()
@@ -791,7 +793,6 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -791,7 +793,6 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
791 int ret = ERROR_SUCCESS; 793 int ret = ERROR_SUCCESS;
792 794
793 SrsStatistic* stat = SrsStatistic::instance(); 795 SrsStatistic* stat = SrsStatistic::instance();
794 - std::stringstream ss;  
795 796
796 // path: {pattern}{client_id} 797 // path: {pattern}{client_id}
797 // e.g. /api/v1/clients/100 pattern= /api/v1/clients/, client_id=100 798 // e.g. /api/v1/clients/100 pattern= /api/v1/clients/, client_id=100
@@ -804,39 +805,33 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -804,39 +805,33 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
804 return srs_api_response_code(w, r, ret); 805 return srs_api_response_code(w, r, ret);
805 } 806 }
806 807
807 - if (r->is_http_delete()) {  
808 - srs_assert(client); 808 + SrsAmf0Object* obj = SrsAmf0Any::object();
  809 + SrsAutoFree(SrsAmf0Object, obj);
809 810
810 - client->conn->expire();  
811 - srs_warn("delete client=%d ok", cid);  
812 - return srs_api_response_code(w, r, ret);  
813 - } else if (r->is_http_get()) {  
814 - std::stringstream data; 811 + obj->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  812 + obj->set("server", SrsAmf0Any::number(stat->server_id()));
815 813
  814 + if (r->is_http_get()) {
816 if (!client) { 815 if (!client) {
817 - ret = stat->dumps_clients(data, 0, 10); 816 + SrsAmf0StrictArray* data = SrsAmf0Any::strict_array();
  817 + obj->set("clients", data);
818 818
819 - ss << SRS_JOBJECT_START  
820 - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT  
821 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
822 - << SRS_JFIELD_ORG("clients", data.str())  
823 - << SRS_JOBJECT_END; 819 + if ((ret = stat->dumps_clients(data, 0, 10)) != ERROR_SUCCESS) {
  820 + return srs_api_response_code(w, r, ret);
  821 + }
824 } else { 822 } else {
825 - ret = client->dumps(data); 823 + SrsAmf0Object* data = SrsAmf0Any::object();
  824 + obj->set("client", data);;
826 825
827 - ss << SRS_JOBJECT_START  
828 - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT  
829 - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT  
830 - << SRS_JFIELD_ORG("client", data.str())  
831 - << SRS_JOBJECT_END; 826 + if ((ret = client->dumps(data)) != ERROR_SUCCESS) {
  827 + return srs_api_response_code(w, r, ret);
  828 + }
832 } 829 }
833 -  
834 - return srs_api_response(w, r, ss.str());  
835 } else { 830 } else {
836 return srs_go_http_error(w, SRS_CONSTS_HTTP_MethodNotAllowed); 831 return srs_go_http_error(w, SRS_CONSTS_HTTP_MethodNotAllowed);
837 } 832 }
838 833
839 - return ret; 834 + return srs_api_response(w, r, obj->to_json());
840 } 835 }
841 836
842 SrsGoApiRaw::SrsGoApiRaw(SrsServer* svr) 837 SrsGoApiRaw::SrsGoApiRaw(SrsServer* svr)
@@ -33,6 +33,7 @@ using namespace std; @@ -33,6 +33,7 @@ using namespace std;
33 #include <srs_app_conn.hpp> 33 #include <srs_app_conn.hpp>
34 #include <srs_app_config.hpp> 34 #include <srs_app_config.hpp>
35 #include <srs_kernel_utility.hpp> 35 #include <srs_kernel_utility.hpp>
  36 +#include <srs_rtmp_amf0.hpp>
36 37
37 int64_t srs_gvid = getpid(); 38 int64_t srs_gvid = getpid();
38 39
@@ -57,7 +58,7 @@ SrsStatisticVhost::~SrsStatisticVhost() @@ -57,7 +58,7 @@ SrsStatisticVhost::~SrsStatisticVhost()
57 srs_freep(kbps); 58 srs_freep(kbps);
58 } 59 }
59 60
60 -int SrsStatisticVhost::dumps(stringstream& ss) 61 +int SrsStatisticVhost::dumps(SrsAmf0Object* obj)
61 { 62 {
62 int ret = ERROR_SUCCESS; 63 int ret = ERROR_SUCCESS;
63 64
@@ -65,26 +66,27 @@ int SrsStatisticVhost::dumps(stringstream& ss) @@ -65,26 +66,27 @@ int SrsStatisticVhost::dumps(stringstream& ss)
65 bool hls_enabled = _srs_config->get_hls_enabled(vhost); 66 bool hls_enabled = _srs_config->get_hls_enabled(vhost);
66 bool enabled = _srs_config->get_vhost_enabled(vhost); 67 bool enabled = _srs_config->get_vhost_enabled(vhost);
67 68
68 - ss << SRS_JOBJECT_START  
69 - << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT  
70 - << SRS_JFIELD_STR("name", vhost) << SRS_JFIELD_CONT  
71 - << SRS_JFIELD_BOOL("enabled", enabled) << SRS_JFIELD_CONT  
72 - << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT  
73 - << SRS_JFIELD_ORG("streams", nb_streams) << SRS_JFIELD_CONT  
74 - << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT  
75 - << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT  
76 - << SRS_JFIELD_OBJ("kbps")  
77 - << SRS_JFIELD_ORG("recv_30s", kbps->get_recv_kbps_30s()) << SRS_JFIELD_CONT  
78 - << SRS_JFIELD_ORG("send_30s", kbps->get_send_kbps_30s())  
79 - << SRS_JOBJECT_END << SRS_JFIELD_CONT  
80 - << SRS_JFIELD_NAME("hls") << SRS_JOBJECT_START  
81 - << SRS_JFIELD_BOOL("enabled", hls_enabled); 69 + obj->set("id", SrsAmf0Any::number(id));
  70 + obj->set("name", SrsAmf0Any::str(vhost.c_str()));
  71 + obj->set("enabled", SrsAmf0Any::boolean(enabled));
  72 + obj->set("clients", SrsAmf0Any::number(nb_clients));
  73 + obj->set("streams", SrsAmf0Any::number(nb_streams));
  74 + obj->set("send_bytes", SrsAmf0Any::number(kbps->get_send_bytes()));
  75 + obj->set("recv_bytes", SrsAmf0Any::number(kbps->get_recv_bytes()));
  76 +
  77 + SrsAmf0Object* okbps = SrsAmf0Any::object();
  78 + obj->set("kbps", okbps);
  79 +
  80 + okbps->set("recv_30s", SrsAmf0Any::number(kbps->get_recv_kbps_30s()));
  81 + okbps->set("send_30s", SrsAmf0Any::number(kbps->get_send_kbps_30s()));
  82 +
  83 + SrsAmf0Object* hls = SrsAmf0Any::object();
  84 + obj->set("hls", hls);
  85 +
  86 + hls->set("enabled", SrsAmf0Any::boolean(hls_enabled));
82 if (hls_enabled) { 87 if (hls_enabled) {
83 - ss << SRS_JFIELD_CONT;  
84 - ss << SRS_JFIELD_ORG("fragment", _srs_config->get_hls_fragment(vhost)); 88 + hls->set("fragment", SrsAmf0Any::number(_srs_config->get_hls_fragment(vhost)));
85 } 89 }
86 - ss << SRS_JOBJECT_END  
87 - << SRS_JOBJECT_END;  
88 90
89 return ret; 91 return ret;
90 } 92 }
@@ -118,51 +120,53 @@ SrsStatisticStream::~SrsStatisticStream() @@ -118,51 +120,53 @@ SrsStatisticStream::~SrsStatisticStream()
118 srs_freep(kbps); 120 srs_freep(kbps);
119 } 121 }
120 122
121 -int SrsStatisticStream::dumps(stringstream& ss) 123 +int SrsStatisticStream::dumps(SrsAmf0Object* obj)
122 { 124 {
123 int ret = ERROR_SUCCESS; 125 int ret = ERROR_SUCCESS;
124 126
125 - ss << SRS_JOBJECT_START  
126 - << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT  
127 - << SRS_JFIELD_STR("name", stream) << SRS_JFIELD_CONT  
128 - << SRS_JFIELD_ORG("vhost", vhost->id) << SRS_JFIELD_CONT  
129 - << SRS_JFIELD_STR("app", app) << SRS_JFIELD_CONT  
130 - << SRS_JFIELD_ORG("live_ms", srs_get_system_time_ms()) << SRS_JFIELD_CONT  
131 - << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT  
132 - << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT  
133 - << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT  
134 - << SRS_JFIELD_OBJ("kbps")  
135 - << SRS_JFIELD_ORG("recv_30s", kbps->get_recv_kbps_30s()) << SRS_JFIELD_CONT  
136 - << SRS_JFIELD_ORG("send_30s", kbps->get_send_kbps_30s())  
137 - << SRS_JOBJECT_END << SRS_JFIELD_CONT  
138 - << SRS_JFIELD_OBJ("publish")  
139 - << SRS_JFIELD_BOOL("active", active) << SRS_JFIELD_CONT  
140 - << SRS_JFIELD_ORG("cid", connection_cid)  
141 - << SRS_JOBJECT_END << SRS_JFIELD_CONT; 127 + obj->set("id", SrsAmf0Any::number(id));
  128 + obj->set("name", SrsAmf0Any::str(stream.c_str()));
  129 + obj->set("vhost", SrsAmf0Any::number(vhost->id));
  130 + obj->set("app", SrsAmf0Any::str(app.c_str()));
  131 + obj->set("live_ms", SrsAmf0Any::number(srs_get_system_time_ms()));
  132 + obj->set("clients", SrsAmf0Any::number(nb_clients));
  133 + obj->set("send_bytes", SrsAmf0Any::number(kbps->get_send_bytes()));
  134 + obj->set("recv_bytes", SrsAmf0Any::number(kbps->get_recv_bytes()));
  135 +
  136 + SrsAmf0Object* okbps = SrsAmf0Any::object();
  137 + obj->set("kbps", okbps);
  138 +
  139 + okbps->set("recv_30s", SrsAmf0Any::number(kbps->get_recv_kbps_30s()));
  140 + okbps->set("send_30s", SrsAmf0Any::number(kbps->get_send_kbps_30s()));
  141 +
  142 + SrsAmf0Object* publish = SrsAmf0Any::object();
  143 + obj->set("publish", publish);
  144 +
  145 + publish->set("active", SrsAmf0Any::boolean(active));
  146 + publish->set("cid", SrsAmf0Any::number(connection_cid));
142 147
143 if (!has_video) { 148 if (!has_video) {
144 - ss << SRS_JFIELD_NULL("video") << SRS_JFIELD_CONT; 149 + obj->set("video", SrsAmf0Any::null());
145 } else { 150 } else {
146 - ss << SRS_JFIELD_NAME("video") << SRS_JOBJECT_START  
147 - << SRS_JFIELD_STR("codec", srs_codec_video2str(vcodec)) << SRS_JFIELD_CONT  
148 - << SRS_JFIELD_STR("profile", srs_codec_avc_profile2str(avc_profile)) << SRS_JFIELD_CONT  
149 - << SRS_JFIELD_ORG("level", srs_codec_avc_level2str(avc_level))  
150 - << SRS_JOBJECT_END  
151 - << SRS_JFIELD_CONT; 151 + SrsAmf0Object* video = SrsAmf0Any::object();
  152 + obj->set("video", video);
  153 +
  154 + video->set("codec", SrsAmf0Any::str(srs_codec_video2str(vcodec).c_str()));
  155 + video->set("profile", SrsAmf0Any::str(srs_codec_avc_profile2str(avc_profile).c_str()));
  156 + video->set("level", SrsAmf0Any::str(srs_codec_avc_level2str(avc_level).c_str()));
152 } 157 }
153 158
154 if (!has_audio) { 159 if (!has_audio) {
155 - ss << SRS_JFIELD_NULL("audio"); 160 + obj->set("audio", SrsAmf0Any::null());
156 } else { 161 } else {
157 - ss << SRS_JFIELD_NAME("audio") << SRS_JOBJECT_START  
158 - << SRS_JFIELD_STR("codec", srs_codec_audio2str(acodec)) << SRS_JFIELD_CONT  
159 - << SRS_JFIELD_ORG("sample_rate", (int)flv_sample_rates[asample_rate]) << SRS_JFIELD_CONT  
160 - << SRS_JFIELD_ORG("channel", (int)asound_type + 1) << SRS_JFIELD_CONT  
161 - << SRS_JFIELD_STR("profile", srs_codec_aac_object2str(aac_object))  
162 - << SRS_JOBJECT_END;  
163 - } 162 + SrsAmf0Object* audio = SrsAmf0Any::object();
  163 + obj->set("audio", audio);
164 164
165 - ss << SRS_JOBJECT_END; 165 + audio->set("codec", SrsAmf0Any::str(srs_codec_audio2str(acodec).c_str()));
  166 + audio->set("sample_rate", SrsAmf0Any::number(flv_sample_rates[asample_rate]));
  167 + audio->set("channel", SrsAmf0Any::number(asound_type + 1));
  168 + audio->set("profile", SrsAmf0Any::str(srs_codec_aac_object2str(aac_object).c_str()));
  169 + }
166 170
167 return ret; 171 return ret;
168 } 172 }
@@ -198,23 +202,21 @@ SrsStatisticClient::~SrsStatisticClient() @@ -198,23 +202,21 @@ SrsStatisticClient::~SrsStatisticClient()
198 { 202 {
199 } 203 }
200 204
201 -int SrsStatisticClient::dumps(stringstream& ss) 205 +int SrsStatisticClient::dumps(SrsAmf0Object* obj)
202 { 206 {
203 int ret = ERROR_SUCCESS; 207 int ret = ERROR_SUCCESS;
204 208
205 - ss << SRS_JOBJECT_START  
206 - << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT  
207 - << SRS_JFIELD_ORG("vhost", stream->vhost->id) << SRS_JFIELD_CONT  
208 - << SRS_JFIELD_ORG("stream", stream->id) << SRS_JFIELD_CONT  
209 - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT  
210 - << SRS_JFIELD_STR("pageUrl", req->pageUrl) << SRS_JFIELD_CONT  
211 - << SRS_JFIELD_STR("swfUrl", req->swfUrl) << SRS_JFIELD_CONT  
212 - << SRS_JFIELD_STR("tcUrl", req->tcUrl) << SRS_JFIELD_CONT  
213 - << SRS_JFIELD_STR("url", req->get_stream_url()) << SRS_JFIELD_CONT  
214 - << SRS_JFIELD_STR("type", srs_client_type_string(type)) << SRS_JFIELD_CONT  
215 - << SRS_JFIELD_BOOL("publish", srs_client_type_is_publish(type)) << SRS_JFIELD_CONT  
216 - << SRS_JFIELD_ORG("alive", srs_get_system_time_ms() - create)  
217 - << SRS_JOBJECT_END; 209 + obj->set("id", SrsAmf0Any::number(id));
  210 + obj->set("vhost", SrsAmf0Any::number(stream->vhost->id));
  211 + obj->set("stream", SrsAmf0Any::number(stream->id));
  212 + obj->set("ip", SrsAmf0Any::str(req->ip.c_str()));
  213 + obj->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str()));
  214 + obj->set("swfUrl", SrsAmf0Any::str(req->swfUrl.c_str()));
  215 + obj->set("tcUrl", SrsAmf0Any::str(req->tcUrl.c_str()));
  216 + obj->set("url", SrsAmf0Any::str(req->get_stream_url().c_str()));
  217 + obj->set("type", SrsAmf0Any::str(srs_client_type_string(type).c_str()));
  218 + obj->set("publish", SrsAmf0Any::boolean(srs_client_type_is_publish(type)));
  219 + obj->set("alive", SrsAmf0Any::number(srs_get_system_time_ms() - create));
218 220
219 return ret; 221 return ret;
220 } 222 }
@@ -446,55 +448,48 @@ int64_t SrsStatistic::server_id() @@ -446,55 +448,48 @@ int64_t SrsStatistic::server_id()
446 return _server_id; 448 return _server_id;
447 } 449 }
448 450
449 -int SrsStatistic::dumps_vhosts(stringstream& ss) 451 +int SrsStatistic::dumps_vhosts(SrsAmf0StrictArray* arr)
450 { 452 {
451 int ret = ERROR_SUCCESS; 453 int ret = ERROR_SUCCESS;
452 454
453 - ss << SRS_JARRAY_START;  
454 std::map<int64_t, SrsStatisticVhost*>::iterator it; 455 std::map<int64_t, SrsStatisticVhost*>::iterator it;
455 for (it = vhosts.begin(); it != vhosts.end(); it++) { 456 for (it = vhosts.begin(); it != vhosts.end(); it++) {
456 SrsStatisticVhost* vhost = it->second; 457 SrsStatisticVhost* vhost = it->second;
457 458
458 - if (it != vhosts.begin()) {  
459 - ss << SRS_JFIELD_CONT;  
460 - } 459 + SrsAmf0Object* obj = SrsAmf0Any::object();
  460 + arr->append(obj);
461 461
462 - if ((ret = vhost->dumps(ss)) != ERROR_SUCCESS) { 462 + if ((ret = vhost->dumps(obj)) != ERROR_SUCCESS) {
463 return ret; 463 return ret;
464 } 464 }
465 } 465 }
466 - ss << SRS_JARRAY_END;  
467 466
468 return ret; 467 return ret;
469 } 468 }
470 469
471 -int SrsStatistic::dumps_streams(stringstream& ss) 470 +int SrsStatistic::dumps_streams(SrsAmf0StrictArray* arr)
472 { 471 {
473 int ret = ERROR_SUCCESS; 472 int ret = ERROR_SUCCESS;
474 473
475 - ss << SRS_JARRAY_START;  
476 std::map<int64_t, SrsStatisticStream*>::iterator it; 474 std::map<int64_t, SrsStatisticStream*>::iterator it;
477 for (it = streams.begin(); it != streams.end(); it++) { 475 for (it = streams.begin(); it != streams.end(); it++) {
478 SrsStatisticStream* stream = it->second; 476 SrsStatisticStream* stream = it->second;
479 477
480 - if (it != streams.begin()) {  
481 - ss << SRS_JFIELD_CONT;  
482 - } 478 + SrsAmf0Object* obj = SrsAmf0Any::object();
  479 + arr->append(obj);
483 480
484 - if ((ret = stream->dumps(ss)) != ERROR_SUCCESS) { 481 + if ((ret = stream->dumps(obj)) != ERROR_SUCCESS) {
485 return ret; 482 return ret;
486 } 483 }
487 } 484 }
488 - ss << SRS_JARRAY_END;  
489 485
490 return ret; 486 return ret;
491 } 487 }
492 488
493 -int SrsStatistic::dumps_clients(stringstream& ss, int start, int count) 489 +int SrsStatistic::dumps_clients(SrsAmf0StrictArray* arr, int start, int count)
494 { 490 {
495 int ret = ERROR_SUCCESS; 491 int ret = ERROR_SUCCESS;
496 492
497 - ss << SRS_JARRAY_START;  
498 std::map<int, SrsStatisticClient*>::iterator it = clients.begin(); 493 std::map<int, SrsStatisticClient*>::iterator it = clients.begin();
499 for (int i = 0; i < start + count && it != clients.end(); it++, i++) { 494 for (int i = 0; i < start + count && it != clients.end(); it++, i++) {
500 if (i < start) { 495 if (i < start) {
@@ -503,16 +498,13 @@ int SrsStatistic::dumps_clients(stringstream& ss, int start, int count) @@ -503,16 +498,13 @@ int SrsStatistic::dumps_clients(stringstream& ss, int start, int count)
503 498
504 SrsStatisticClient* client = it->second; 499 SrsStatisticClient* client = it->second;
505 500
506 - if (i != start) {  
507 - ss << SRS_JFIELD_CONT;  
508 - } 501 + SrsAmf0Object* obj = SrsAmf0Any::object();
  502 + arr->append(obj);
509 503
510 - if ((ret = client->dumps(ss)) != ERROR_SUCCESS) { 504 + if ((ret = client->dumps(obj)) != ERROR_SUCCESS) {
511 return ret; 505 return ret;
512 } 506 }
513 } 507 }
514 - ss << SRS_JARRAY_END;  
515 -  
516 508
517 return ret; 509 return ret;
518 } 510 }
@@ -39,6 +39,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -39,6 +39,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
39 class SrsKbps; 39 class SrsKbps;
40 class SrsRequest; 40 class SrsRequest;
41 class SrsConnection; 41 class SrsConnection;
  42 +class SrsAmf0Object;
  43 +class SrsAmf0StrictArray;
42 44
43 struct SrsStatisticVhost 45 struct SrsStatisticVhost
44 { 46 {
@@ -56,7 +58,7 @@ public: @@ -56,7 +58,7 @@ public:
56 SrsStatisticVhost(); 58 SrsStatisticVhost();
57 virtual ~SrsStatisticVhost(); 59 virtual ~SrsStatisticVhost();
58 public: 60 public:
59 - virtual int dumps(std::stringstream& ss); 61 + virtual int dumps(SrsAmf0Object* obj);
60 }; 62 };
61 63
62 struct SrsStatisticStream 64 struct SrsStatisticStream
@@ -98,7 +100,7 @@ public: @@ -98,7 +100,7 @@ public:
98 SrsStatisticStream(); 100 SrsStatisticStream();
99 virtual ~SrsStatisticStream(); 101 virtual ~SrsStatisticStream();
100 public: 102 public:
101 - virtual int dumps(std::stringstream& ss); 103 + virtual int dumps(SrsAmf0Object* obj);
102 public: 104 public:
103 /** 105 /**
104 * publish the stream. 106 * publish the stream.
@@ -123,7 +125,7 @@ public: @@ -123,7 +125,7 @@ public:
123 SrsStatisticClient(); 125 SrsStatisticClient();
124 virtual ~SrsStatisticClient(); 126 virtual ~SrsStatisticClient();
125 public: 127 public:
126 - virtual int dumps(std::stringstream& ss); 128 + virtual int dumps(SrsAmf0Object* obj);
127 }; 129 };
128 130
129 class SrsStatistic 131 class SrsStatistic
@@ -217,19 +219,19 @@ public: @@ -217,19 +219,19 @@ public:
217 */ 219 */
218 virtual int64_t server_id(); 220 virtual int64_t server_id();
219 /** 221 /**
220 - * dumps the vhosts to sstream in json. 222 + * dumps the vhosts to amf0 array.
221 */ 223 */
222 - virtual int dumps_vhosts(std::stringstream& ss); 224 + virtual int dumps_vhosts(SrsAmf0StrictArray* arr);
223 /** 225 /**
224 - * dumps the streams to sstream in json. 226 + * dumps the streams to amf0 array.
225 */ 227 */
226 - virtual int dumps_streams(std::stringstream& ss); 228 + virtual int dumps_streams(SrsAmf0StrictArray* arr);
227 /** 229 /**
228 - * dumps the clients to sstream in json. 230 + * dumps the clients to amf0 array
229 * @param start the start index, from 0. 231 * @param start the start index, from 0.
230 * @param count the max count of clients to dump. 232 * @param count the max count of clients to dump.
231 */ 233 */
232 - virtual int dumps_clients(std::stringstream& ss, int start, int count); 234 + virtual int dumps_clients(SrsAmf0StrictArray* arr, int start, int count);
233 private: 235 private:
234 virtual SrsStatisticVhost* create_vhost(SrsRequest* req); 236 virtual SrsStatisticVhost* create_vhost(SrsRequest* req);
235 virtual SrsStatisticStream* create_stream(SrsStatisticVhost* vhost, SrsRequest* req); 237 virtual SrsStatisticStream* create_stream(SrsStatisticVhost* vhost, SrsRequest* req);