HTTP API support JSONP by specifies the query string callback=xxx.
正在显示
6 个修改的文件
包含
148 行增加
和
74 行删除
| @@ -342,6 +342,7 @@ Remark: | @@ -342,6 +342,7 @@ Remark: | ||
| 342 | 342 | ||
| 343 | ## History | 343 | ## History |
| 344 | 344 | ||
| 345 | +* v2.0, 2015-08-22, HTTP API support JSONP by specifies the query string callback=xxx. | ||
| 345 | * v2.0, 2015-08-20, fix [#380](https://github.com/simple-rtmp-server/srs/issues/380), srs-librtmp send sequence header when sps or pps changed. | 346 | * v2.0, 2015-08-20, fix [#380](https://github.com/simple-rtmp-server/srs/issues/380), srs-librtmp send sequence header when sps or pps changed. |
| 346 | * v2.0, 2015-08-18, close [#454](https://github.com/simple-rtmp-server/srs/issues/454), support obs restart publish. 2.0.184 | 347 | * v2.0, 2015-08-18, close [#454](https://github.com/simple-rtmp-server/srs/issues/454), support obs restart publish. 2.0.184 |
| 347 | * v2.0, 2015-08-14, use reduce_sequence_header for stream control. | 348 | * v2.0, 2015-08-14, use reduce_sequence_header for stream control. |
| @@ -43,6 +43,95 @@ using namespace std; | @@ -43,6 +43,95 @@ using namespace std; | ||
| 43 | #include <srs_app_source.hpp> | 43 | #include <srs_app_source.hpp> |
| 44 | #include <srs_app_http_conn.hpp> | 44 | #include <srs_app_http_conn.hpp> |
| 45 | 45 | ||
| 46 | +int srs_api_response_jsonp(ISrsHttpResponseWriter* w, string callback, string data) | ||
| 47 | +{ | ||
| 48 | + int ret = ERROR_SUCCESS; | ||
| 49 | + | ||
| 50 | + SrsHttpHeader* h = w->header(); | ||
| 51 | + | ||
| 52 | + h->set_content_length(data.length() + callback.length() + 2); | ||
| 53 | + h->set_content_type("text/javascript"); | ||
| 54 | + | ||
| 55 | + if (!callback.empty() && (ret = w->write((char*)callback.data(), (int)callback.length())) != ERROR_SUCCESS) { | ||
| 56 | + return ret; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + static char* c0 = (char*)"("; | ||
| 60 | + if ((ret = w->write(c0, 1)) != ERROR_SUCCESS) { | ||
| 61 | + return ret; | ||
| 62 | + } | ||
| 63 | + if ((ret = w->write((char*)data.data(), (int)data.length())) != ERROR_SUCCESS) { | ||
| 64 | + return ret; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + static char* c1 = (char*)")"; | ||
| 68 | + if ((ret = w->write(c1, 1)) != ERROR_SUCCESS) { | ||
| 69 | + return ret; | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + return ret; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +int srs_api_response_jsonp_code(ISrsHttpResponseWriter* w, string callback, int code) | ||
| 76 | +{ | ||
| 77 | + std::stringstream ss; | ||
| 78 | + | ||
| 79 | + ss << SRS_JOBJECT_START | ||
| 80 | + << SRS_JFIELD_ERROR(code) | ||
| 81 | + << SRS_JOBJECT_END; | ||
| 82 | + | ||
| 83 | + return srs_api_response_jsonp(w, callback, ss.str()); | ||
| 84 | +} | ||
| 85 | + | ||
| 86 | +int srs_api_response_json(ISrsHttpResponseWriter* w, string data) | ||
| 87 | +{ | ||
| 88 | + SrsHttpHeader* h = w->header(); | ||
| 89 | + | ||
| 90 | + h->set_content_length(data.length()); | ||
| 91 | + h->set_content_type("application/json"); | ||
| 92 | + | ||
| 93 | + return w->write((char*)data.data(), (int)data.length()); | ||
| 94 | +} | ||
| 95 | + | ||
| 96 | +int srs_api_response_json_code(ISrsHttpResponseWriter* w, int code) | ||
| 97 | +{ | ||
| 98 | + std::stringstream ss; | ||
| 99 | + | ||
| 100 | + ss << SRS_JOBJECT_START | ||
| 101 | + << SRS_JFIELD_ERROR(code) | ||
| 102 | + << SRS_JOBJECT_END; | ||
| 103 | + | ||
| 104 | + return srs_api_response_json(w, ss.str()); | ||
| 105 | +} | ||
| 106 | + | ||
| 107 | +int srs_api_response(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string json) | ||
| 108 | +{ | ||
| 109 | + string callback = r->query_get("callback"); | ||
| 110 | + bool jsonp = !callback.empty(); | ||
| 111 | + | ||
| 112 | + // no jsonp, directly response. | ||
| 113 | + if (!jsonp) { | ||
| 114 | + return srs_api_response_json(w, json); | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + // jsonp, get function name from query("callback") | ||
| 118 | + return srs_api_response_jsonp(w, callback, json); | ||
| 119 | +} | ||
| 120 | + | ||
| 121 | +int srs_api_response_code(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, int code) | ||
| 122 | +{ | ||
| 123 | + string callback = r->query_get("callback"); | ||
| 124 | + bool jsonp = !callback.empty(); | ||
| 125 | + | ||
| 126 | + // no jsonp, directly response. | ||
| 127 | + if (!jsonp) { | ||
| 128 | + return srs_api_response_json_code(w, code); | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + // jsonp, get function name from query("callback") | ||
| 132 | + return srs_api_response_jsonp_code(w, callback, code); | ||
| 133 | +} | ||
| 134 | + | ||
| 46 | SrsGoApiRoot::SrsGoApiRoot() | 135 | SrsGoApiRoot::SrsGoApiRoot() |
| 47 | { | 136 | { |
| 48 | } | 137 | } |
| @@ -64,7 +153,7 @@ int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -64,7 +153,7 @@ int SrsGoApiRoot::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 64 | << SRS_JOBJECT_END | 153 | << SRS_JOBJECT_END |
| 65 | << SRS_JOBJECT_END; | 154 | << SRS_JOBJECT_END; |
| 66 | 155 | ||
| 67 | - return srs_http_response_json(w, ss.str()); | 156 | + return srs_api_response(w, r, ss.str()); |
| 68 | } | 157 | } |
| 69 | 158 | ||
| 70 | SrsGoApiApi::SrsGoApiApi() | 159 | SrsGoApiApi::SrsGoApiApi() |
| @@ -88,7 +177,7 @@ int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -88,7 +177,7 @@ int SrsGoApiApi::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 88 | << SRS_JOBJECT_END | 177 | << SRS_JOBJECT_END |
| 89 | << SRS_JOBJECT_END; | 178 | << SRS_JOBJECT_END; |
| 90 | 179 | ||
| 91 | - return srs_http_response_json(w, ss.str()); | 180 | + return srs_api_response(w, r, ss.str()); |
| 92 | } | 181 | } |
| 93 | 182 | ||
| 94 | SrsGoApiV1::SrsGoApiV1() | 183 | SrsGoApiV1::SrsGoApiV1() |
| @@ -129,7 +218,7 @@ int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -129,7 +218,7 @@ int SrsGoApiV1::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 129 | << SRS_JOBJECT_END | 218 | << SRS_JOBJECT_END |
| 130 | << SRS_JOBJECT_END; | 219 | << SRS_JOBJECT_END; |
| 131 | 220 | ||
| 132 | - return srs_http_response_json(w, ss.str()); | 221 | + return srs_api_response(w, r, ss.str()); |
| 133 | } | 222 | } |
| 134 | 223 | ||
| 135 | SrsGoApiVersion::SrsGoApiVersion() | 224 | SrsGoApiVersion::SrsGoApiVersion() |
| @@ -156,7 +245,7 @@ int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -156,7 +245,7 @@ int SrsGoApiVersion::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 156 | << SRS_JOBJECT_END | 245 | << SRS_JOBJECT_END |
| 157 | << SRS_JOBJECT_END; | 246 | << SRS_JOBJECT_END; |
| 158 | 247 | ||
| 159 | - return srs_http_response_json(w, ss.str()); | 248 | + return srs_api_response(w, r, ss.str()); |
| 160 | } | 249 | } |
| 161 | 250 | ||
| 162 | SrsGoApiSummaries::SrsGoApiSummaries() | 251 | SrsGoApiSummaries::SrsGoApiSummaries() |
| @@ -171,7 +260,7 @@ int SrsGoApiSummaries::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -171,7 +260,7 @@ int SrsGoApiSummaries::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 171 | { | 260 | { |
| 172 | std::stringstream ss; | 261 | std::stringstream ss; |
| 173 | srs_api_dump_summaries(ss); | 262 | srs_api_dump_summaries(ss); |
| 174 | - return srs_http_response_json(w, ss.str()); | 263 | + return srs_api_response(w, r, ss.str()); |
| 175 | } | 264 | } |
| 176 | 265 | ||
| 177 | SrsGoApiRusages::SrsGoApiRusages() | 266 | SrsGoApiRusages::SrsGoApiRusages() |
| @@ -182,39 +271,39 @@ SrsGoApiRusages::~SrsGoApiRusages() | @@ -182,39 +271,39 @@ SrsGoApiRusages::~SrsGoApiRusages() | ||
| 182 | { | 271 | { |
| 183 | } | 272 | } |
| 184 | 273 | ||
| 185 | -int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* req) | 274 | +int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) |
| 186 | { | 275 | { |
| 187 | SrsStatistic* stat = SrsStatistic::instance(); | 276 | SrsStatistic* stat = SrsStatistic::instance(); |
| 188 | std::stringstream ss; | 277 | std::stringstream ss; |
| 189 | 278 | ||
| 190 | - SrsRusage* r = srs_get_system_rusage(); | 279 | + SrsRusage* ru = srs_get_system_rusage(); |
| 191 | 280 | ||
| 192 | ss << SRS_JOBJECT_START | 281 | ss << SRS_JOBJECT_START |
| 193 | << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT | 282 | << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT |
| 194 | << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT | 283 | << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT |
| 195 | << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) | 284 | << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) |
| 196 | - << SRS_JFIELD_ORG("ok", (r->ok? "true":"false")) << SRS_JFIELD_CONT | ||
| 197 | - << SRS_JFIELD_ORG("sample_time", r->sample_time) << SRS_JFIELD_CONT | ||
| 198 | - << SRS_JFIELD_ORG("ru_utime", r->r.ru_utime.tv_sec) << SRS_JFIELD_CONT | ||
| 199 | - << SRS_JFIELD_ORG("ru_stime", r->r.ru_stime.tv_sec) << SRS_JFIELD_CONT | ||
| 200 | - << SRS_JFIELD_ORG("ru_maxrss", r->r.ru_maxrss) << SRS_JFIELD_CONT | ||
| 201 | - << SRS_JFIELD_ORG("ru_ixrss", r->r.ru_ixrss) << SRS_JFIELD_CONT | ||
| 202 | - << SRS_JFIELD_ORG("ru_idrss", r->r.ru_idrss) << SRS_JFIELD_CONT | ||
| 203 | - << SRS_JFIELD_ORG("ru_isrss", r->r.ru_isrss) << SRS_JFIELD_CONT | ||
| 204 | - << SRS_JFIELD_ORG("ru_minflt", r->r.ru_minflt) << SRS_JFIELD_CONT | ||
| 205 | - << SRS_JFIELD_ORG("ru_majflt", r->r.ru_majflt) << SRS_JFIELD_CONT | ||
| 206 | - << SRS_JFIELD_ORG("ru_nswap", r->r.ru_nswap) << SRS_JFIELD_CONT | ||
| 207 | - << SRS_JFIELD_ORG("ru_inblock", r->r.ru_inblock) << SRS_JFIELD_CONT | ||
| 208 | - << SRS_JFIELD_ORG("ru_oublock", r->r.ru_oublock) << SRS_JFIELD_CONT | ||
| 209 | - << SRS_JFIELD_ORG("ru_msgsnd", r->r.ru_msgsnd) << SRS_JFIELD_CONT | ||
| 210 | - << SRS_JFIELD_ORG("ru_msgrcv", r->r.ru_msgrcv) << SRS_JFIELD_CONT | ||
| 211 | - << SRS_JFIELD_ORG("ru_nsignals", r->r.ru_nsignals) << SRS_JFIELD_CONT | ||
| 212 | - << SRS_JFIELD_ORG("ru_nvcsw", r->r.ru_nvcsw) << SRS_JFIELD_CONT | ||
| 213 | - << SRS_JFIELD_ORG("ru_nivcsw", r->r.ru_nivcsw) | 285 | + << SRS_JFIELD_ORG("ok", (ru->ok? "true":"false")) << SRS_JFIELD_CONT |
| 286 | + << SRS_JFIELD_ORG("sample_time", ru->sample_time) << SRS_JFIELD_CONT | ||
| 287 | + << SRS_JFIELD_ORG("ru_utime", ru->r.ru_utime.tv_sec) << SRS_JFIELD_CONT | ||
| 288 | + << SRS_JFIELD_ORG("ru_stime", ru->r.ru_stime.tv_sec) << SRS_JFIELD_CONT | ||
| 289 | + << SRS_JFIELD_ORG("ru_maxrss", ru->r.ru_maxrss) << SRS_JFIELD_CONT | ||
| 290 | + << SRS_JFIELD_ORG("ru_ixrss", ru->r.ru_ixrss) << SRS_JFIELD_CONT | ||
| 291 | + << SRS_JFIELD_ORG("ru_idrss", ru->r.ru_idrss) << SRS_JFIELD_CONT | ||
| 292 | + << SRS_JFIELD_ORG("ru_isrss", ru->r.ru_isrss) << SRS_JFIELD_CONT | ||
| 293 | + << SRS_JFIELD_ORG("ru_minflt", ru->r.ru_minflt) << SRS_JFIELD_CONT | ||
| 294 | + << SRS_JFIELD_ORG("ru_majflt", ru->r.ru_majflt) << SRS_JFIELD_CONT | ||
| 295 | + << SRS_JFIELD_ORG("ru_nswap", ru->r.ru_nswap) << SRS_JFIELD_CONT | ||
| 296 | + << SRS_JFIELD_ORG("ru_inblock", ru->r.ru_inblock) << SRS_JFIELD_CONT | ||
| 297 | + << SRS_JFIELD_ORG("ru_oublock", ru->r.ru_oublock) << SRS_JFIELD_CONT | ||
| 298 | + << SRS_JFIELD_ORG("ru_msgsnd", ru->r.ru_msgsnd) << SRS_JFIELD_CONT | ||
| 299 | + << SRS_JFIELD_ORG("ru_msgrcv", ru->r.ru_msgrcv) << SRS_JFIELD_CONT | ||
| 300 | + << SRS_JFIELD_ORG("ru_nsignals", ru->r.ru_nsignals) << SRS_JFIELD_CONT | ||
| 301 | + << SRS_JFIELD_ORG("ru_nvcsw", ru->r.ru_nvcsw) << SRS_JFIELD_CONT | ||
| 302 | + << SRS_JFIELD_ORG("ru_nivcsw", ru->r.ru_nivcsw) | ||
| 214 | << SRS_JOBJECT_END | 303 | << SRS_JOBJECT_END |
| 215 | << SRS_JOBJECT_END; | 304 | << SRS_JOBJECT_END; |
| 216 | 305 | ||
| 217 | - return srs_http_response_json(w, ss.str()); | 306 | + return srs_api_response(w, r, ss.str()); |
| 218 | } | 307 | } |
| 219 | 308 | ||
| 220 | SrsGoApiSelfProcStats::SrsGoApiSelfProcStats() | 309 | SrsGoApiSelfProcStats::SrsGoApiSelfProcStats() |
| @@ -286,7 +375,7 @@ int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage | @@ -286,7 +375,7 @@ int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage | ||
| 286 | << SRS_JOBJECT_END | 375 | << SRS_JOBJECT_END |
| 287 | << SRS_JOBJECT_END; | 376 | << SRS_JOBJECT_END; |
| 288 | 377 | ||
| 289 | - return srs_http_response_json(w, ss.str()); | 378 | + return srs_api_response(w, r, ss.str()); |
| 290 | } | 379 | } |
| 291 | 380 | ||
| 292 | SrsGoApiSystemProcStats::SrsGoApiSystemProcStats() | 381 | SrsGoApiSystemProcStats::SrsGoApiSystemProcStats() |
| @@ -323,7 +412,7 @@ int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa | @@ -323,7 +412,7 @@ int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa | ||
| 323 | << SRS_JOBJECT_END | 412 | << SRS_JOBJECT_END |
| 324 | << SRS_JOBJECT_END; | 413 | << SRS_JOBJECT_END; |
| 325 | 414 | ||
| 326 | - return srs_http_response_json(w, ss.str()); | 415 | + return srs_api_response(w, r, ss.str()); |
| 327 | } | 416 | } |
| 328 | 417 | ||
| 329 | SrsGoApiMemInfos::SrsGoApiMemInfos() | 418 | SrsGoApiMemInfos::SrsGoApiMemInfos() |
| @@ -361,7 +450,7 @@ int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -361,7 +450,7 @@ int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 361 | << SRS_JOBJECT_END | 450 | << SRS_JOBJECT_END |
| 362 | << SRS_JOBJECT_END; | 451 | << SRS_JOBJECT_END; |
| 363 | 452 | ||
| 364 | - return srs_http_response_json(w, ss.str()); | 453 | + return srs_api_response(w, r, ss.str()); |
| 365 | } | 454 | } |
| 366 | 455 | ||
| 367 | SrsGoApiAuthors::SrsGoApiAuthors() | 456 | SrsGoApiAuthors::SrsGoApiAuthors() |
| @@ -390,7 +479,7 @@ int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -390,7 +479,7 @@ int SrsGoApiAuthors::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 390 | << SRS_JOBJECT_END | 479 | << SRS_JOBJECT_END |
| 391 | << SRS_JOBJECT_END; | 480 | << SRS_JOBJECT_END; |
| 392 | 481 | ||
| 393 | - return srs_http_response_json(w, ss.str()); | 482 | + return srs_api_response(w, r, ss.str()); |
| 394 | } | 483 | } |
| 395 | 484 | ||
| 396 | SrsGoApiFeatures::SrsGoApiFeatures() | 485 | SrsGoApiFeatures::SrsGoApiFeatures() |
| @@ -516,7 +605,7 @@ int SrsGoApiFeatures::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -516,7 +605,7 @@ int SrsGoApiFeatures::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 516 | << SRS_JOBJECT_END | 605 | << SRS_JOBJECT_END |
| 517 | << SRS_JOBJECT_END; | 606 | << SRS_JOBJECT_END; |
| 518 | 607 | ||
| 519 | - return srs_http_response_json(w, ss.str()); | 608 | + return srs_api_response(w, r, ss.str()); |
| 520 | } | 609 | } |
| 521 | 610 | ||
| 522 | SrsGoApiRequests::SrsGoApiRequests() | 611 | SrsGoApiRequests::SrsGoApiRequests() |
| @@ -579,7 +668,7 @@ int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -579,7 +668,7 @@ int SrsGoApiRequests::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 579 | << SRS_JOBJECT_END | 668 | << SRS_JOBJECT_END |
| 580 | << SRS_JOBJECT_END; | 669 | << SRS_JOBJECT_END; |
| 581 | 670 | ||
| 582 | - return srs_http_response_json(w, ss.str()); | 671 | + return srs_api_response(w, r, ss.str()); |
| 583 | } | 672 | } |
| 584 | 673 | ||
| 585 | SrsGoApiVhosts::SrsGoApiVhosts() | 674 | SrsGoApiVhosts::SrsGoApiVhosts() |
| @@ -605,7 +694,7 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -605,7 +694,7 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 605 | if (vid > 0 && (vhost = stat->find_vhost(vid)) == NULL) { | 694 | if (vid > 0 && (vhost = stat->find_vhost(vid)) == NULL) { |
| 606 | ret = ERROR_RTMP_STREAM_NOT_FOUND; | 695 | ret = ERROR_RTMP_STREAM_NOT_FOUND; |
| 607 | srs_error("vhost id=%d not found. ret=%d", vid, ret); | 696 | srs_error("vhost id=%d not found. ret=%d", vid, ret); |
| 608 | - return srs_http_response_code(w, ret); | 697 | + return srs_api_response_code(w, r, ret); |
| 609 | } | 698 | } |
| 610 | 699 | ||
| 611 | if (r->is_http_get()) { | 700 | if (r->is_http_get()) { |
| @@ -629,10 +718,10 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -629,10 +718,10 @@ int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 629 | << SRS_JOBJECT_END; | 718 | << SRS_JOBJECT_END; |
| 630 | } | 719 | } |
| 631 | 720 | ||
| 632 | - return srs_http_response_json(w, ss.str()); | 721 | + return srs_api_response(w, r, ss.str()); |
| 633 | } | 722 | } |
| 634 | 723 | ||
| 635 | - return srs_http_response_json(w, ss.str()); | 724 | + return srs_api_response(w, r, ss.str()); |
| 636 | } | 725 | } |
| 637 | 726 | ||
| 638 | SrsGoApiStreams::SrsGoApiStreams() | 727 | SrsGoApiStreams::SrsGoApiStreams() |
| @@ -658,7 +747,7 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -658,7 +747,7 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 658 | if (sid >= 0 && (stream = stat->find_stream(sid)) == NULL) { | 747 | if (sid >= 0 && (stream = stat->find_stream(sid)) == NULL) { |
| 659 | ret = ERROR_RTMP_STREAM_NOT_FOUND; | 748 | ret = ERROR_RTMP_STREAM_NOT_FOUND; |
| 660 | srs_error("stream stream_id=%d not found. ret=%d", sid, ret); | 749 | srs_error("stream stream_id=%d not found. ret=%d", sid, ret); |
| 661 | - return srs_http_response_code(w, ret); | 750 | + return srs_api_response_code(w, r, ret); |
| 662 | } | 751 | } |
| 663 | 752 | ||
| 664 | if (r->is_http_get()) { | 753 | if (r->is_http_get()) { |
| @@ -682,7 +771,7 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -682,7 +771,7 @@ int SrsGoApiStreams::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 682 | << SRS_JOBJECT_END; | 771 | << SRS_JOBJECT_END; |
| 683 | } | 772 | } |
| 684 | 773 | ||
| 685 | - return srs_http_response_json(w, ss.str()); | 774 | + return srs_api_response(w, r, ss.str()); |
| 686 | } | 775 | } |
| 687 | 776 | ||
| 688 | return ret; | 777 | return ret; |
| @@ -711,7 +800,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -711,7 +800,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 711 | if (cid >= 0 && (client = stat->find_client(cid)) == NULL) { | 800 | if (cid >= 0 && (client = stat->find_client(cid)) == NULL) { |
| 712 | ret = ERROR_RTMP_STREAM_NOT_FOUND; | 801 | ret = ERROR_RTMP_STREAM_NOT_FOUND; |
| 713 | srs_error("stream client_id=%d not found. ret=%d", cid, ret); | 802 | srs_error("stream client_id=%d not found. ret=%d", cid, ret); |
| 714 | - return srs_http_response_code(w, ret); | 803 | + return srs_api_response_code(w, r, ret); |
| 715 | } | 804 | } |
| 716 | 805 | ||
| 717 | if (r->is_http_delete()) { | 806 | if (r->is_http_delete()) { |
| @@ -719,7 +808,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -719,7 +808,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 719 | 808 | ||
| 720 | client->conn->expire(); | 809 | client->conn->expire(); |
| 721 | srs_warn("delete client=%d ok", cid); | 810 | srs_warn("delete client=%d ok", cid); |
| 722 | - return srs_http_response_code(w, ret); | 811 | + return srs_api_response_code(w, r, ret); |
| 723 | } else if (r->is_http_get()) { | 812 | } else if (r->is_http_get()) { |
| 724 | std::stringstream data; | 813 | std::stringstream data; |
| 725 | 814 | ||
| @@ -741,7 +830,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -741,7 +830,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
| 741 | << SRS_JOBJECT_END; | 830 | << SRS_JOBJECT_END; |
| 742 | } | 831 | } |
| 743 | 832 | ||
| 744 | - return srs_http_response_json(w, ss.str()); | 833 | + return srs_api_response(w, r, ss.str()); |
| 745 | } else { | 834 | } else { |
| 746 | return srs_go_http_error(w, SRS_CONSTS_HTTP_MethodNotAllowed); | 835 | return srs_go_http_error(w, SRS_CONSTS_HTTP_MethodNotAllowed); |
| 747 | } | 836 | } |
| @@ -759,7 +848,7 @@ SrsGoApiError::~SrsGoApiError() | @@ -759,7 +848,7 @@ SrsGoApiError::~SrsGoApiError() | ||
| 759 | 848 | ||
| 760 | int SrsGoApiError::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | 849 | int SrsGoApiError::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) |
| 761 | { | 850 | { |
| 762 | - return srs_http_response_code(w, 100); | 851 | + return srs_api_response_code(w, r, 100); |
| 763 | } | 852 | } |
| 764 | 853 | ||
| 765 | 854 |
| @@ -673,6 +673,11 @@ string SrsHttpMessage::path() | @@ -673,6 +673,11 @@ string SrsHttpMessage::path() | ||
| 673 | return _uri->get_path(); | 673 | return _uri->get_path(); |
| 674 | } | 674 | } |
| 675 | 675 | ||
| 676 | +string SrsHttpMessage::query() | ||
| 677 | +{ | ||
| 678 | + return _uri->get_query(); | ||
| 679 | +} | ||
| 680 | + | ||
| 676 | string SrsHttpMessage::ext() | 681 | string SrsHttpMessage::ext() |
| 677 | { | 682 | { |
| 678 | return _ext; | 683 | return _ext; |
| @@ -245,6 +245,7 @@ public: | @@ -245,6 +245,7 @@ public: | ||
| 245 | virtual std::string url(); | 245 | virtual std::string url(); |
| 246 | virtual std::string host(); | 246 | virtual std::string host(); |
| 247 | virtual std::string path(); | 247 | virtual std::string path(); |
| 248 | + virtual std::string query(); | ||
| 248 | virtual std::string ext(); | 249 | virtual std::string ext(); |
| 249 | /** | 250 | /** |
| 250 | * get the RESTful matched id. | 251 | * get the RESTful matched id. |
| @@ -137,27 +137,6 @@ int srs_go_http_error(ISrsHttpResponseWriter* w, int code, string error) | @@ -137,27 +137,6 @@ int srs_go_http_error(ISrsHttpResponseWriter* w, int code, string error) | ||
| 137 | return ret; | 137 | return ret; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | -int srs_http_response_json(ISrsHttpResponseWriter* w, string data) | ||
| 141 | -{ | ||
| 142 | - SrsHttpHeader* h = w->header(); | ||
| 143 | - | ||
| 144 | - h->set_content_length(data.length()); | ||
| 145 | - h->set_content_type("application/json"); | ||
| 146 | - | ||
| 147 | - return w->write((char*)data.data(), (int)data.length()); | ||
| 148 | -} | ||
| 149 | - | ||
| 150 | -int srs_http_response_code(ISrsHttpResponseWriter* w, int code) | ||
| 151 | -{ | ||
| 152 | - std::stringstream ss; | ||
| 153 | - | ||
| 154 | - ss << SRS_JOBJECT_START | ||
| 155 | - << SRS_JFIELD_ERROR(code) | ||
| 156 | - << SRS_JOBJECT_END; | ||
| 157 | - | ||
| 158 | - return srs_http_response_json(w, ss.str()); | ||
| 159 | -} | ||
| 160 | - | ||
| 161 | SrsHttpHeader::SrsHttpHeader() | 140 | SrsHttpHeader::SrsHttpHeader() |
| 162 | { | 141 | { |
| 163 | } | 142 | } |
| @@ -261,17 +240,23 @@ SrsHttpRedirectHandler::~SrsHttpRedirectHandler() | @@ -261,17 +240,23 @@ SrsHttpRedirectHandler::~SrsHttpRedirectHandler() | ||
| 261 | int SrsHttpRedirectHandler::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | 240 | int SrsHttpRedirectHandler::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) |
| 262 | { | 241 | { |
| 263 | int ret = ERROR_SUCCESS; | 242 | int ret = ERROR_SUCCESS; |
| 264 | - string msg = "Moved Permsanently"; | 243 | + |
| 244 | + string location = url; | ||
| 245 | + if (!r->query().empty()) { | ||
| 246 | + location += "?" + r->query(); | ||
| 247 | + } | ||
| 248 | + | ||
| 249 | + string msg = "Redirect to" + location; | ||
| 265 | 250 | ||
| 266 | w->header()->set_content_type("text/plain; charset=utf-8"); | 251 | w->header()->set_content_type("text/plain; charset=utf-8"); |
| 267 | w->header()->set_content_length(msg.length()); | 252 | w->header()->set_content_length(msg.length()); |
| 268 | - w->header()->set("Location", url); | 253 | + w->header()->set("Location", location); |
| 269 | w->write_header(code); | 254 | w->write_header(code); |
| 270 | 255 | ||
| 271 | w->write((char*)msg.data(), (int)msg.length()); | 256 | w->write((char*)msg.data(), (int)msg.length()); |
| 272 | w->final_request(); | 257 | w->final_request(); |
| 273 | 258 | ||
| 274 | - srs_info("redirect to %s.", url.c_str()); | 259 | + srs_info("redirect to %s.", location.c_str()); |
| 275 | return ret; | 260 | return ret; |
| 276 | } | 261 | } |
| 277 | 262 | ||
| @@ -636,7 +621,7 @@ int SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler* handler) | @@ -636,7 +621,7 @@ int SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler* handler) | ||
| 636 | 621 | ||
| 637 | entry = new SrsHttpMuxEntry(); | 622 | entry = new SrsHttpMuxEntry(); |
| 638 | entry->explicit_match = false; | 623 | entry->explicit_match = false; |
| 639 | - entry->handler = new SrsHttpRedirectHandler(pattern, SRS_CONSTS_HTTP_MovedPermanently); | 624 | + entry->handler = new SrsHttpRedirectHandler(pattern, SRS_CONSTS_HTTP_Found); |
| 640 | entry->pattern = pattern; | 625 | entry->pattern = pattern; |
| 641 | entry->handler->entry = entry; | 626 | entry->handler->entry = entry; |
| 642 | 627 |
| @@ -81,14 +81,6 @@ class ISrsHttpResponseWriter; | @@ -81,14 +81,6 @@ class ISrsHttpResponseWriter; | ||
| 81 | extern int srs_go_http_error(ISrsHttpResponseWriter* w, int code); | 81 | extern int srs_go_http_error(ISrsHttpResponseWriter* w, int code); |
| 82 | extern int srs_go_http_error(ISrsHttpResponseWriter* w, int code, std::string error); | 82 | extern int srs_go_http_error(ISrsHttpResponseWriter* w, int code, std::string error); |
| 83 | 83 | ||
| 84 | -// helper function: response in json format. | ||
| 85 | -extern int srs_http_response_json(ISrsHttpResponseWriter* w, std::string data); | ||
| 86 | -/** | ||
| 87 | - * response a typical code object, for example: | ||
| 88 | - * {code : 100} | ||
| 89 | - */ | ||
| 90 | -extern int srs_http_response_code(ISrsHttpResponseWriter* w, int code); | ||
| 91 | - | ||
| 92 | // get the status text of code. | 84 | // get the status text of code. |
| 93 | extern std::string srs_generate_http_status_text(int status); | 85 | extern std::string srs_generate_http_status_text(int status); |
| 94 | 86 | ||
| @@ -497,6 +489,7 @@ public: | @@ -497,6 +489,7 @@ public: | ||
| 497 | virtual std::string url() = 0; | 489 | virtual std::string url() = 0; |
| 498 | virtual std::string host() = 0; | 490 | virtual std::string host() = 0; |
| 499 | virtual std::string path() = 0; | 491 | virtual std::string path() = 0; |
| 492 | + virtual std::string query() = 0; | ||
| 500 | virtual std::string ext() = 0; | 493 | virtual std::string ext() = 0; |
| 501 | /** | 494 | /** |
| 502 | * get the RESTful id, | 495 | * get the RESTful id, |
-
请 注册 或 登录 后发表评论