继续操作前请注册或者登录。
winlin

Merge branch '2.0release' into develop

@@ -53,10 +53,12 @@ SrsGoApiRoot::~SrsGoApiRoot() @@ -53,10 +53,12 @@ SrsGoApiRoot::~SrsGoApiRoot()
53 53
54 int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 54 int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
55 { 55 {
  56 + SrsStatistic* stat = SrsStatistic::instance();
56 std::stringstream ss; 57 std::stringstream ss;
57 58
58 ss << SRS_JOBJECT_START 59 ss << SRS_JOBJECT_START
59 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 60 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  61 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
60 << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START) 62 << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)
61 << SRS_JFIELD_STR("api", "the api root") 63 << SRS_JFIELD_STR("api", "the api root")
62 << SRS_JOBJECT_END 64 << SRS_JOBJECT_END
@@ -75,10 +77,12 @@ SrsGoApiApi::~SrsGoApiApi() @@ -75,10 +77,12 @@ SrsGoApiApi::~SrsGoApiApi()
75 77
76 int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 78 int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
77 { 79 {
  80 + SrsStatistic* stat = SrsStatistic::instance();
78 std::stringstream ss; 81 std::stringstream ss;
79 82
80 ss << SRS_JOBJECT_START 83 ss << SRS_JOBJECT_START
81 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 84 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  85 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
82 << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START) 86 << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)
83 << SRS_JFIELD_STR("v1", "the api version 1.0") 87 << SRS_JFIELD_STR("v1", "the api version 1.0")
84 << SRS_JOBJECT_END 88 << SRS_JOBJECT_END
@@ -97,10 +101,12 @@ SrsGoApiV1::~SrsGoApiV1() @@ -97,10 +101,12 @@ SrsGoApiV1::~SrsGoApiV1()
97 101
98 int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 102 int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
99 { 103 {
  104 + SrsStatistic* stat = SrsStatistic::instance();
100 std::stringstream ss; 105 std::stringstream ss;
101 106
102 ss << SRS_JOBJECT_START 107 ss << SRS_JOBJECT_START
103 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 108 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  109 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
104 << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START) 110 << SRS_JFIELD_ORG("urls", SRS_JOBJECT_START)
105 << SRS_JFIELD_STR("versions", "the version of SRS") << SRS_JFIELD_CONT 111 << SRS_JFIELD_STR("versions", "the version of SRS") << SRS_JFIELD_CONT
106 << SRS_JFIELD_STR("summaries", "the summary(pid, argv, pwd, cpu, mem) of SRS") << SRS_JFIELD_CONT 112 << SRS_JFIELD_STR("summaries", "the summary(pid, argv, pwd, cpu, mem) of SRS") << SRS_JFIELD_CONT
@@ -108,16 +114,17 @@ int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -108,16 +114,17 @@ int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
108 << SRS_JFIELD_STR("self_proc_stats", "the self process stats") << SRS_JFIELD_CONT 114 << SRS_JFIELD_STR("self_proc_stats", "the self process stats") << SRS_JFIELD_CONT
109 << SRS_JFIELD_STR("system_proc_stats", "the system process stats") << SRS_JFIELD_CONT 115 << SRS_JFIELD_STR("system_proc_stats", "the system process stats") << SRS_JFIELD_CONT
110 << SRS_JFIELD_STR("meminfos", "the meminfo of system") << SRS_JFIELD_CONT 116 << SRS_JFIELD_STR("meminfos", "the meminfo of system") << SRS_JFIELD_CONT
111 - << SRS_JFIELD_STR("authors", "the primary authors and contributors") << SRS_JFIELD_CONT 117 + << SRS_JFIELD_STR("authors", "the license, copyright, authors and contributors") << SRS_JFIELD_CONT
  118 + << SRS_JFIELD_STR("features", "the supported features of SRS") << SRS_JFIELD_CONT
112 << SRS_JFIELD_STR("requests", "the request itself, for http debug") << SRS_JFIELD_CONT 119 << SRS_JFIELD_STR("requests", "the request itself, for http debug") << SRS_JFIELD_CONT
113 - << SRS_JFIELD_STR("vhosts", "dumps vhost to json") << SRS_JFIELD_CONT  
114 - << SRS_JFIELD_STR("streams", "dumps streams to json") << SRS_JFIELD_CONT  
115 - << SRS_JFIELD_STR("clients", "dumps clients to json") << SRS_JFIELD_CONT  
116 - << SRS_JFIELD_ORG("test", SRS_JOBJECT_START) 120 + << SRS_JFIELD_STR("vhosts", "manage all vhosts or specified vhost") << SRS_JFIELD_CONT
  121 + << SRS_JFIELD_STR("streams", "manage all streams or specified stream") << SRS_JFIELD_CONT
  122 + << SRS_JFIELD_STR("clients", "manage all clients or specified client, default query top 10 clients") << SRS_JFIELD_CONT
  123 + << SRS_JFIELD_ORG("tests", SRS_JOBJECT_START)
117 << SRS_JFIELD_STR("requests", "show the request info") << SRS_JFIELD_CONT 124 << SRS_JFIELD_STR("requests", "show the request info") << SRS_JFIELD_CONT
118 << SRS_JFIELD_STR("errors", "always return an error 100") << SRS_JFIELD_CONT 125 << SRS_JFIELD_STR("errors", "always return an error 100") << SRS_JFIELD_CONT
119 << SRS_JFIELD_STR("redirects", "always redirect to /api/v1/test/errors") << SRS_JFIELD_CONT 126 << SRS_JFIELD_STR("redirects", "always redirect to /api/v1/test/errors") << SRS_JFIELD_CONT
120 - << SRS_JFIELD_STR(".vhost.", "http vhost for error.srs.com/api/v1/test/errors") 127 + << SRS_JFIELD_STR("[vhost]", "http vhost for http://error.srs.com:1985/api/v1/tests/errors")
121 << SRS_JOBJECT_END 128 << SRS_JOBJECT_END
122 << SRS_JOBJECT_END 129 << SRS_JOBJECT_END
123 << SRS_JOBJECT_END; 130 << SRS_JOBJECT_END;
@@ -135,10 +142,12 @@ SrsGoApiVersion::~SrsGoApiVersion() @@ -135,10 +142,12 @@ SrsGoApiVersion::~SrsGoApiVersion()
135 142
136 int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 143 int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
137 { 144 {
  145 + SrsStatistic* stat = SrsStatistic::instance();
138 std::stringstream ss; 146 std::stringstream ss;
139 147
140 ss << SRS_JOBJECT_START 148 ss << SRS_JOBJECT_START
141 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 149 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  150 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
142 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 151 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
143 << SRS_JFIELD_ORG("major", VERSION_MAJOR) << SRS_JFIELD_CONT 152 << SRS_JFIELD_ORG("major", VERSION_MAJOR) << SRS_JFIELD_CONT
144 << SRS_JFIELD_ORG("minor", VERSION_MINOR) << SRS_JFIELD_CONT 153 << SRS_JFIELD_ORG("minor", VERSION_MINOR) << SRS_JFIELD_CONT
@@ -175,12 +184,14 @@ SrsGoApiRusages::~SrsGoApiRusages() @@ -175,12 +184,14 @@ SrsGoApiRusages::~SrsGoApiRusages()
175 184
176 int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* req) 185 int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* req)
177 { 186 {
  187 + SrsStatistic* stat = SrsStatistic::instance();
178 std::stringstream ss; 188 std::stringstream ss;
179 189
180 SrsRusage* r = srs_get_system_rusage(); 190 SrsRusage* r = srs_get_system_rusage();
181 191
182 ss << SRS_JOBJECT_START 192 ss << SRS_JOBJECT_START
183 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 193 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  194 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
184 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 195 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
185 << SRS_JFIELD_ORG("ok", (r->ok? "true":"false")) << SRS_JFIELD_CONT 196 << SRS_JFIELD_ORG("ok", (r->ok? "true":"false")) << SRS_JFIELD_CONT
186 << SRS_JFIELD_ORG("sample_time", r->sample_time) << SRS_JFIELD_CONT 197 << SRS_JFIELD_ORG("sample_time", r->sample_time) << SRS_JFIELD_CONT
@@ -216,12 +227,14 @@ SrsGoApiSelfProcStats::~SrsGoApiSelfProcStats() @@ -216,12 +227,14 @@ SrsGoApiSelfProcStats::~SrsGoApiSelfProcStats()
216 227
217 int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 228 int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
218 { 229 {
  230 + SrsStatistic* stat = SrsStatistic::instance();
219 std::stringstream ss; 231 std::stringstream ss;
220 232
221 SrsProcSelfStat* u = srs_get_self_proc_stat(); 233 SrsProcSelfStat* u = srs_get_self_proc_stat();
222 234
223 ss << SRS_JOBJECT_START 235 ss << SRS_JOBJECT_START
224 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 236 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  237 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
225 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 238 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
226 << SRS_JFIELD_ORG("ok", (u->ok? "true":"false")) << SRS_JFIELD_CONT 239 << SRS_JFIELD_ORG("ok", (u->ok? "true":"false")) << SRS_JFIELD_CONT
227 << SRS_JFIELD_ORG("sample_time", u->sample_time) << SRS_JFIELD_CONT 240 << SRS_JFIELD_ORG("sample_time", u->sample_time) << SRS_JFIELD_CONT
@@ -286,12 +299,14 @@ SrsGoApiSystemProcStats::~SrsGoApiSystemProcStats() @@ -286,12 +299,14 @@ SrsGoApiSystemProcStats::~SrsGoApiSystemProcStats()
286 299
287 int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 300 int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
288 { 301 {
  302 + SrsStatistic* stat = SrsStatistic::instance();
289 std::stringstream ss; 303 std::stringstream ss;
290 304
291 SrsProcSystemStat* s = srs_get_system_proc_stat(); 305 SrsProcSystemStat* s = srs_get_system_proc_stat();
292 306
293 ss << SRS_JOBJECT_START 307 ss << SRS_JOBJECT_START
294 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 308 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  309 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
295 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 310 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
296 << SRS_JFIELD_ORG("ok", (s->ok? "true":"false")) << SRS_JFIELD_CONT 311 << SRS_JFIELD_ORG("ok", (s->ok? "true":"false")) << SRS_JFIELD_CONT
297 << SRS_JFIELD_ORG("sample_time", s->sample_time) << SRS_JFIELD_CONT 312 << SRS_JFIELD_ORG("sample_time", s->sample_time) << SRS_JFIELD_CONT
@@ -321,12 +336,14 @@ SrsGoApiMemInfos::~SrsGoApiMemInfos() @@ -321,12 +336,14 @@ SrsGoApiMemInfos::~SrsGoApiMemInfos()
321 336
322 int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 337 int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
323 { 338 {
  339 + SrsStatistic* stat = SrsStatistic::instance();
324 std::stringstream ss; 340 std::stringstream ss;
325 341
326 SrsMemInfo* m = srs_get_meminfo(); 342 SrsMemInfo* m = srs_get_meminfo();
327 343
328 ss << SRS_JOBJECT_START 344 ss << SRS_JOBJECT_START
329 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 345 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  346 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
330 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 347 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
331 << SRS_JFIELD_ORG("ok", (m->ok? "true":"false")) << SRS_JFIELD_CONT 348 << SRS_JFIELD_ORG("ok", (m->ok? "true":"false")) << SRS_JFIELD_CONT
332 << SRS_JFIELD_ORG("sample_time", m->sample_time) << SRS_JFIELD_CONT 349 << SRS_JFIELD_ORG("sample_time", m->sample_time) << SRS_JFIELD_CONT
@@ -357,12 +374,16 @@ SrsGoApiAuthors::~SrsGoApiAuthors() @@ -357,12 +374,16 @@ SrsGoApiAuthors::~SrsGoApiAuthors()
357 374
358 int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) 375 int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
359 { 376 {
  377 + SrsStatistic* stat = SrsStatistic::instance();
360 std::stringstream ss; 378 std::stringstream ss;
361 379
362 ss << SRS_JOBJECT_START 380 ss << SRS_JOBJECT_START
363 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 381 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  382 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
364 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 383 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
365 << SRS_JFIELD_STR("primary", RTMP_SIG_SRS_PRIMARY) << SRS_JFIELD_CONT 384 << SRS_JFIELD_STR("primary", RTMP_SIG_SRS_PRIMARY) << SRS_JFIELD_CONT
  385 + << SRS_JFIELD_STR("license", RTMP_SIG_SRS_LICENSE) << SRS_JFIELD_CONT
  386 + << SRS_JFIELD_STR("copyright", RTMP_SIG_SRS_COPYRIGHT) << SRS_JFIELD_CONT
366 << SRS_JFIELD_STR("authors", RTMP_SIG_SRS_AUTHROS) << SRS_JFIELD_CONT 387 << SRS_JFIELD_STR("authors", RTMP_SIG_SRS_AUTHROS) << SRS_JFIELD_CONT
367 << SRS_JFIELD_STR("contributors_link", RTMP_SIG_SRS_CONTRIBUTORS_URL) << SRS_JFIELD_CONT 388 << SRS_JFIELD_STR("contributors_link", RTMP_SIG_SRS_CONTRIBUTORS_URL) << SRS_JFIELD_CONT
368 << SRS_JFIELD_STR("contributors", SRS_AUTO_CONSTRIBUTORS) 389 << SRS_JFIELD_STR("contributors", SRS_AUTO_CONSTRIBUTORS)
@@ -372,6 +393,132 @@ int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -372,6 +393,132 @@ int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
372 return srs_http_response_json(w, ss.str()); 393 return srs_http_response_json(w, ss.str());
373 } 394 }
374 395
  396 +SrsGoApiFeatures::SrsGoApiFeatures()
  397 +{
  398 +}
  399 +
  400 +SrsGoApiFeatures::~SrsGoApiFeatures()
  401 +{
  402 +}
  403 +
  404 +int SrsGoApiFeatures::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
  405 +{
  406 + SrsStatistic* stat = SrsStatistic::instance();
  407 + std::stringstream ss;
  408 +
  409 +#ifdef SRS_AUTO_SSL
  410 + bool ssl = true;
  411 +#else
  412 + bool ssl = false;
  413 +#endif
  414 +#ifdef SRS_AUTO_HLS
  415 + bool hls = true;
  416 +#else
  417 + bool hls = false;
  418 +#endif
  419 +#ifdef SRS_AUTO_HDS
  420 + bool hds = true;
  421 +#else
  422 + bool hds = false;
  423 +#endif
  424 +#ifdef SRS_AUTO_HTTP_CALLBACK
  425 + bool callback = true;
  426 +#else
  427 + bool callback = false;
  428 +#endif
  429 +#ifdef SRS_AUTO_HTTP_API
  430 + bool api = true;
  431 +#else
  432 + bool api = false;
  433 +#endif
  434 +#ifdef SRS_AUTO_HTTP_SERVER
  435 + bool httpd = true;
  436 +#else
  437 + bool httpd = false;
  438 +#endif
  439 +#ifdef SRS_AUTO_DVR
  440 + bool dvr = true;
  441 +#else
  442 + bool dvr = false;
  443 +#endif
  444 +#ifdef SRS_AUTO_TRANSCODE
  445 + bool transcode = true;
  446 +#else
  447 + bool transcode = false;
  448 +#endif
  449 +#ifdef SRS_AUTO_INGEST
  450 + bool ingest = true;
  451 +#else
  452 + bool ingest = false;
  453 +#endif
  454 +#ifdef SRS_AUTO_STAT
  455 + bool _stat = true;
  456 +#else
  457 + bool _stat = false;
  458 +#endif
  459 +#ifdef SRS_AUTO_NGINX
  460 + bool nginx = true;
  461 +#else
  462 + bool nginx = false;
  463 +#endif
  464 +#ifdef SRS_AUTO_FFMPEG_TOOL
  465 + bool ffmpeg = true;
  466 +#else
  467 + bool ffmpeg = false;
  468 +#endif
  469 +#ifdef SRS_AUTO_STREAM_CASTER
  470 + bool caster = true;
  471 +#else
  472 + bool caster = false;
  473 +#endif
  474 +#ifdef SRS_PERF_COMPLEX_SEND
  475 + bool complex_send = true;
  476 +#else
  477 + bool complex_send = false;
  478 +#endif
  479 +#ifdef SRS_PERF_TCP_NODELAY
  480 + bool tcp_nodelay = true;
  481 +#else
  482 + bool tcp_nodelay = false;
  483 +#endif
  484 +#ifdef SRS_PERF_SO_SNDBUF_SIZE
  485 + bool so_sendbuf = true;
  486 +#else
  487 + bool so_sendbuf = false;
  488 +#endif
  489 +#ifdef SRS_PERF_MERGED_READ
  490 + bool mr = true;
  491 +#else
  492 + bool mr = false;
  493 +#endif
  494 +
  495 + ss << SRS_JOBJECT_START
  496 + << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  497 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
  498 + << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
  499 + << SRS_JFIELD_BOOL("ssl", ssl) << SRS_JFIELD_CONT
  500 + << SRS_JFIELD_BOOL("hls", hls) << SRS_JFIELD_CONT
  501 + << SRS_JFIELD_BOOL("hds", hds) << SRS_JFIELD_CONT
  502 + << SRS_JFIELD_BOOL("callback", callback) << SRS_JFIELD_CONT
  503 + << SRS_JFIELD_BOOL("api", api) << SRS_JFIELD_CONT
  504 + << SRS_JFIELD_BOOL("httpd", httpd) << SRS_JFIELD_CONT
  505 + << SRS_JFIELD_BOOL("dvr", dvr) << SRS_JFIELD_CONT
  506 + << SRS_JFIELD_BOOL("transcode", transcode) << SRS_JFIELD_CONT
  507 + << SRS_JFIELD_BOOL("ingest", ingest) << SRS_JFIELD_CONT
  508 + << SRS_JFIELD_BOOL("stat", _stat) << SRS_JFIELD_CONT
  509 + << SRS_JFIELD_BOOL("nginx", nginx) << SRS_JFIELD_CONT
  510 + << SRS_JFIELD_BOOL("ffmpeg", ffmpeg) << SRS_JFIELD_CONT
  511 + << SRS_JFIELD_BOOL("stream_caster", caster) << SRS_JFIELD_CONT
  512 + << SRS_JFIELD_BOOL("complex_send", complex_send) << SRS_JFIELD_CONT
  513 + << SRS_JFIELD_BOOL("tcp_nodelay", tcp_nodelay) << SRS_JFIELD_CONT
  514 + << SRS_JFIELD_BOOL("so_sendbuf", so_sendbuf) << SRS_JFIELD_CONT
  515 + << SRS_JFIELD_BOOL("mr", mr)
  516 + << SRS_JOBJECT_END
  517 + << SRS_JOBJECT_END;
  518 +
  519 + return srs_http_response_json(w, ss.str());
  520 +}
  521 +
375 SrsGoApiRequests::SrsGoApiRequests() 522 SrsGoApiRequests::SrsGoApiRequests()
376 { 523 {
377 } 524 }
@@ -384,10 +531,12 @@ int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -384,10 +531,12 @@ int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
384 { 531 {
385 ISrsHttpMessage* req = r; 532 ISrsHttpMessage* req = r;
386 533
  534 + SrsStatistic* stat = SrsStatistic::instance();
387 std::stringstream ss; 535 std::stringstream ss;
388 536
389 ss << SRS_JOBJECT_START 537 ss << SRS_JOBJECT_START
390 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT 538 << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT
  539 + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT
391 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) 540 << SRS_JFIELD_ORG("data", SRS_JOBJECT_START)
392 << SRS_JFIELD_STR("uri", req->uri()) << SRS_JFIELD_CONT 541 << SRS_JFIELD_STR("uri", req->uri()) << SRS_JFIELD_CONT
393 << SRS_JFIELD_STR("path", req->path()) << SRS_JFIELD_CONT; 542 << SRS_JFIELD_STR("path", req->path()) << SRS_JFIELD_CONT;
@@ -132,6 +132,15 @@ public: @@ -132,6 +132,15 @@ public:
132 virtual int serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r); 132 virtual int serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r);
133 }; 133 };
134 134
  135 +class SrsGoApiFeatures : public ISrsHttpHandler
  136 +{
  137 +public:
  138 + SrsGoApiFeatures();
  139 + virtual ~SrsGoApiFeatures();
  140 +public:
  141 + virtual int serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r);
  142 +};
  143 +
135 class SrsGoApiRequests : public ISrsHttpHandler 144 class SrsGoApiRequests : public ISrsHttpHandler
136 { 145 {
137 public: 146 public:
@@ -800,6 +800,9 @@ int SrsServer::http_handle() @@ -800,6 +800,9 @@ int SrsServer::http_handle()
800 if ((ret = http_api_mux->handle("/api/v1/authors", new SrsGoApiAuthors())) != ERROR_SUCCESS) { 800 if ((ret = http_api_mux->handle("/api/v1/authors", new SrsGoApiAuthors())) != ERROR_SUCCESS) {
801 return ret; 801 return ret;
802 } 802 }
  803 + if ((ret = http_api_mux->handle("/api/v1/features", new SrsGoApiFeatures())) != ERROR_SUCCESS) {
  804 + return ret;
  805 + }
803 if ((ret = http_api_mux->handle("/api/v1/vhosts/", new SrsGoApiVhosts())) != ERROR_SUCCESS) { 806 if ((ret = http_api_mux->handle("/api/v1/vhosts/", new SrsGoApiVhosts())) != ERROR_SUCCESS) {
804 return ret; 807 return ret;
805 } 808 }
@@ -811,19 +814,19 @@ int SrsServer::http_handle() @@ -811,19 +814,19 @@ int SrsServer::http_handle()
811 } 814 }
812 815
813 // test the request info. 816 // test the request info.
814 - if ((ret = http_api_mux->handle("/api/v1/test/requests", new SrsGoApiRequests())) != ERROR_SUCCESS) { 817 + if ((ret = http_api_mux->handle("/api/v1/tests/requests", new SrsGoApiRequests())) != ERROR_SUCCESS) {
815 return ret; 818 return ret;
816 } 819 }
817 // test the error code response. 820 // test the error code response.
818 - if ((ret = http_api_mux->handle("/api/v1/test/errors", new SrsGoApiError())) != ERROR_SUCCESS) { 821 + if ((ret = http_api_mux->handle("/api/v1/tests/errors", new SrsGoApiError())) != ERROR_SUCCESS) {
819 return ret; 822 return ret;
820 } 823 }
821 // test the redirect mechenism. 824 // test the redirect mechenism.
822 - if ((ret = http_api_mux->handle("/api/v1/test/redirects", new SrsHttpRedirectHandler("/api/v1/test/errors", SRS_CONSTS_HTTP_MovedPermanently))) != ERROR_SUCCESS) { 825 + if ((ret = http_api_mux->handle("/api/v1/tests/redirects", new SrsHttpRedirectHandler("/api/v1/tests/errors", SRS_CONSTS_HTTP_MovedPermanently))) != ERROR_SUCCESS) {
823 return ret; 826 return ret;
824 } 827 }
825 // test the http vhost. 828 // test the http vhost.
826 - if ((ret = http_api_mux->handle("error.srs.com/api/v1/test/errors", new SrsGoApiError())) != ERROR_SUCCESS) { 829 + if ((ret = http_api_mux->handle("error.srs.com/api/v1/tests/errors", new SrsGoApiError())) != ERROR_SUCCESS) {
827 return ret; 830 return ret;
828 } 831 }
829 832
@@ -71,6 +71,10 @@ int SrsStatisticVhost::dumps(stringstream& ss) @@ -71,6 +71,10 @@ int SrsStatisticVhost::dumps(stringstream& ss)
71 << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT 71 << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT
72 << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT 72 << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT
73 << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT 73 << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT
  74 + << SRS_JFIELD_OBJ("kbps")
  75 + << SRS_JFIELD_ORG("r30s", kbps->get_recv_kbps_30s()) << SRS_JFIELD_CONT
  76 + << SRS_JFIELD_ORG("s30s", kbps->get_send_kbps_30s())
  77 + << SRS_JOBJECT_END << SRS_JFIELD_CONT
74 << SRS_JFIELD_NAME("hls") << SRS_JOBJECT_START 78 << SRS_JFIELD_NAME("hls") << SRS_JOBJECT_START
75 << SRS_JFIELD_BOOL("enabled", hls_enabled); 79 << SRS_JFIELD_BOOL("enabled", hls_enabled);
76 if (hls_enabled) { 80 if (hls_enabled) {
@@ -123,6 +127,10 @@ int SrsStatisticStream::dumps(stringstream& ss) @@ -123,6 +127,10 @@ int SrsStatisticStream::dumps(stringstream& ss)
123 << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT 127 << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT
124 << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT 128 << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT
125 << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT 129 << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT
  130 + << SRS_JFIELD_OBJ("kbps")
  131 + << SRS_JFIELD_ORG("r30s", kbps->get_recv_kbps_30s()) << SRS_JFIELD_CONT
  132 + << SRS_JFIELD_ORG("s30s", kbps->get_send_kbps_30s())
  133 + << SRS_JOBJECT_END << SRS_JFIELD_CONT
126 << SRS_JFIELD_ORG("live_ms", srs_get_system_time_ms()) << SRS_JFIELD_CONT 134 << SRS_JFIELD_ORG("live_ms", srs_get_system_time_ms()) << SRS_JFIELD_CONT
127 << SRS_JFIELD_STR("status", status) << SRS_JFIELD_CONT; 135 << SRS_JFIELD_STR("status", status) << SRS_JFIELD_CONT;
128 136
@@ -162,7 +162,7 @@ void show_macro_features() @@ -162,7 +162,7 @@ void show_macro_features()
162 #endif 162 #endif
163 163
164 #ifdef SRS_PERF_TCP_NODELAY 164 #ifdef SRS_PERF_TCP_NODELAY
165 - srs_warn("TCP_NODELAY enabled, hurts performance."); 165 + srs_warn("TCP_NODELAY enabled, may hurts performance.");
166 #else 166 #else
167 srs_trace("TCP_NODELAY disabled."); 167 srs_trace("TCP_NODELAY disabled.");
168 #endif 168 #endif
@@ -276,8 +276,8 @@ int main(int argc, char** argv) @@ -276,8 +276,8 @@ int main(int argc, char** argv)
276 } 276 }
277 277
278 srs_trace("srs(simple-rtmp-server) "RTMP_SIG_SRS_VERSION); 278 srs_trace("srs(simple-rtmp-server) "RTMP_SIG_SRS_VERSION);
279 - srs_trace("license: "RTMP_SIG_SRS_LICENSE);  
280 - srs_trace("primary: "RTMP_SIG_SRS_PRIMARY); 279 + srs_trace("license: "RTMP_SIG_SRS_LICENSE", "RTMP_SIG_SRS_COPYRIGHT);
  280 + srs_trace("primary/master: "RTMP_SIG_SRS_PRIMARY);
281 srs_trace("authors: "RTMP_SIG_SRS_AUTHROS); 281 srs_trace("authors: "RTMP_SIG_SRS_AUTHROS);
282 srs_trace("contributors: "SRS_AUTO_CONSTRIBUTORS); 282 srs_trace("contributors: "SRS_AUTO_CONSTRIBUTORS);
283 srs_trace("uname: "SRS_AUTO_UNAME); 283 srs_trace("uname: "SRS_AUTO_UNAME);
@@ -215,10 +215,11 @@ that is: @@ -215,10 +215,11 @@ that is:
215 //////////////////////////////////////////////////////////////////////// 215 ////////////////////////////////////////////////////////////////////////
216 #define SRS_JOBJECT_START "{" 216 #define SRS_JOBJECT_START "{"
217 #define SRS_JFIELD_NAME(k) "\"" << k << "\":" 217 #define SRS_JFIELD_NAME(k) "\"" << k << "\":"
218 -#define SRS_JFIELD_STR(k, v) "\"" << k << "\":\"" << v << "\""  
219 -#define SRS_JFIELD_ORG(k, v) "\"" << k << "\":" << std::dec << v 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
220 #define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false")) 221 #define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false"))
221 -#define SRS_JFIELD_NULL(k) "\"" << k << "\":null" 222 +#define SRS_JFIELD_NULL(k) SRS_JFIELD_NAME(k) << "null"
222 #define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret 223 #define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret
223 #define SRS_JFIELD_CONT "," 224 #define SRS_JFIELD_CONT ","
224 #define SRS_JOBJECT_END "}" 225 #define SRS_JOBJECT_END "}"