diff --git a/.gitignore b/.gitignore index 5d1abdd98..b831ab327 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ # Apple-specific garbage files. .AppleDouble + +.idea diff --git a/README.md b/README.md index 1d3c13a44..41523f98b 100755 --- a/README.md +++ b/README.md @@ -213,6 +213,7 @@ Please select according to languages: ### V2 changes +* v2.0, 2019-04-05, Merge [#1339][bug #1339], Support HTTP-FLV params. 2.0.262 * v2.0, 2018-12-01, Merge [#1274][bug #1274], Upgrade to FFMPEG 4.1 and X264 157. 2.0.261 * v2.0, 2018-11-11, Merge [#1261][bug #1261], Support `_definst_` for Wowza. 2.0.260 * v2.0, 2018-11-11, Merge [#1263][bug #1263], Fix string trim bug. 2.0.259 @@ -1446,6 +1447,7 @@ Winlin [bug #1263]: https://github.com/ossrs/srs/issues/1263 [bug #1261]: https://github.com/ossrs/srs/issues/1261 [bug #1274]: https://github.com/ossrs/srs/pull/1274 +[bug #1339]: https://github.com/ossrs/srs/pull/1339 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [bug #735]: https://github.com/ossrs/srs/issues/735 diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index d5f33961f..a291a0bd6 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -489,13 +489,13 @@ srs_error_t SrsLiveStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage { srs_error_t err = srs_success; - if ((err = http_hooks_on_play()) != srs_success) { + if ((err = http_hooks_on_play(r)) != srs_success) { return srs_error_wrap(err, "http hook"); } err = do_serve_http(w, r); - http_hooks_on_stop(); + http_hooks_on_stop(r); return err; } @@ -658,13 +658,18 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess return err; } -srs_error_t SrsLiveStream::http_hooks_on_play() +srs_error_t SrsLiveStream::http_hooks_on_play(ISrsHttpMessage* r) { srs_error_t err = srs_success; if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return err; } + + // Create request to report for the specified connection. + SrsHttpMessage* hr = dynamic_cast(r); + SrsRequest* nreq = hr->to_request(req->vhost); + SrsAutoFree(SrsRequest, nreq); // the http hooks will cause context switch, // so we must copy all hooks for the on_connect may freed. @@ -672,7 +677,7 @@ srs_error_t SrsLiveStream::http_hooks_on_play() vector hooks; if (true) { - SrsConfDirective* conf = _srs_config->get_vhost_on_play(req->vhost); + SrsConfDirective* conf = _srs_config->get_vhost_on_play(nreq->vhost); if (!conf) { return err; @@ -683,19 +688,24 @@ srs_error_t SrsLiveStream::http_hooks_on_play() for (int i = 0; i < (int)hooks.size(); i++) { std::string url = hooks.at(i); - if ((err = SrsHttpHooks::on_play(url, req)) != srs_success) { - return srs_error_wrap(err, "rtmp on_play %s", url.c_str()); + if ((err = SrsHttpHooks::on_play(url, nreq)) != srs_success) { + return srs_error_wrap(err, "http on_play %s", url.c_str()); } } return err; } -void SrsLiveStream::http_hooks_on_stop() +void SrsLiveStream::http_hooks_on_stop(ISrsHttpMessage* r) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return; } + + // Create request to report for the specified connection. + SrsHttpMessage* hr = dynamic_cast(r); + SrsRequest* nreq = hr->to_request(req->vhost); + SrsAutoFree(SrsRequest, nreq); // the http hooks will cause context switch, // so we must copy all hooks for the on_connect may freed. @@ -703,7 +713,7 @@ void SrsLiveStream::http_hooks_on_stop() vector hooks; if (true) { - SrsConfDirective* conf = _srs_config->get_vhost_on_stop(req->vhost); + SrsConfDirective* conf = _srs_config->get_vhost_on_stop(nreq->vhost); if (!conf) { srs_info("ignore the empty http callback: on_stop"); @@ -715,7 +725,7 @@ void SrsLiveStream::http_hooks_on_stop() for (int i = 0; i < (int)hooks.size(); i++) { std::string url = hooks.at(i); - SrsHttpHooks::on_stop(url, req); + SrsHttpHooks::on_stop(url, nreq); } return; diff --git a/trunk/src/app/srs_app_http_stream.hpp b/trunk/src/app/srs_app_http_stream.hpp index fd6a96322..24658d299 100755 --- a/trunk/src/app/srs_app_http_stream.hpp +++ b/trunk/src/app/srs_app_http_stream.hpp @@ -229,8 +229,8 @@ public: virtual srs_error_t serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r); private: virtual srs_error_t do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r); - virtual srs_error_t http_hooks_on_play(); - virtual void http_hooks_on_stop(); + virtual srs_error_t http_hooks_on_play(ISrsHttpMessage* r); + virtual void http_hooks_on_stop(ISrsHttpMessage* r); virtual srs_error_t streaming_send_messages(ISrsBufferEncoder* enc, SrsSharedPtrMessage** msgs, int nb_msgs); }; diff --git a/trunk/src/service/srs_service_http_conn.cpp b/trunk/src/service/srs_service_http_conn.cpp index 9d8f3e1ed..ba556fe80 100644 --- a/trunk/src/service/srs_service_http_conn.cpp +++ b/trunk/src/service/srs_service_http_conn.cpp @@ -593,6 +593,11 @@ SrsRequest* SrsHttpMessage::to_request(string vhost) req->tcUrl = "rtmp://" + vhost + "/" + req->app; req->pageUrl = get_request_header("Referer"); req->objectEncoding = 0; + + std::string query = _uri->get_query(); + if (!query.empty()) { + req->tcUrl = req->tcUrl + "?" + query; + } srs_discovery_tc_url(req->tcUrl, req->schema, req->host, req->vhost, req->app, req->stream, req->port, req->param); req->strip();