diff --git a/trunk/src/app/srs_app_caster_flv.cpp b/trunk/src/app/srs_app_caster_flv.cpp index 4335cb4c5..4de4bb50a 100644 --- a/trunk/src/app/srs_app_caster_flv.cpp +++ b/trunk/src/app/srs_app_caster_flv.cpp @@ -269,11 +269,13 @@ srs_error_t SrsDynamicHttpConn::on_http_message(ISrsHttpMessage* r, SrsHttpRespo return srs_success; } -void SrsDynamicHttpConn::on_conn_done() +srs_error_t SrsDynamicHttpConn::on_conn_done(srs_error_t r0) { // Because we use manager to manage this object, // not the http connection object, so we must remove it here. manager->remove(this); + + return r0; } std::string SrsDynamicHttpConn::desc() diff --git a/trunk/src/app/srs_app_caster_flv.hpp b/trunk/src/app/srs_app_caster_flv.hpp index 521eff7e7..cdba880ee 100644 --- a/trunk/src/app/srs_app_caster_flv.hpp +++ b/trunk/src/app/srs_app_caster_flv.hpp @@ -101,7 +101,7 @@ public: public: virtual srs_error_t on_start(); virtual srs_error_t on_http_message(ISrsHttpMessage* r, SrsHttpResponseWriter* w); - virtual void on_conn_done(); + virtual srs_error_t on_conn_done(srs_error_t r0); // Interface ISrsResource. public: virtual std::string desc(); diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 76eda84b0..85a2d48f9 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -1720,11 +1720,20 @@ srs_error_t SrsHttpApi::on_http_message(ISrsHttpMessage* r, SrsHttpResponseWrite return err; } -void SrsHttpApi::on_conn_done() +srs_error_t SrsHttpApi::on_conn_done(srs_error_t r0) { // Because we use manager to manage this object, // not the http connection object, so we must remove it here. manager->remove(this); + + // For HTTP-API timeout, we think it's done successfully, + // because there may be no request or response for HTTP-API. + if (srs_error_code(r0) == ERROR_SOCKET_TIMEOUT) { + srs_freep(r0); + return srs_success; + } + + return r0; } std::string SrsHttpApi::desc() diff --git a/trunk/src/app/srs_app_http_api.hpp b/trunk/src/app/srs_app_http_api.hpp index 3bf8d648f..7c61bd803 100644 --- a/trunk/src/app/srs_app_http_api.hpp +++ b/trunk/src/app/srs_app_http_api.hpp @@ -270,7 +270,7 @@ public: public: virtual srs_error_t on_start(); virtual srs_error_t on_http_message(ISrsHttpMessage* r, SrsHttpResponseWriter* w); - virtual void on_conn_done(); + virtual srs_error_t on_conn_done(srs_error_t r0); // Interface ISrsResource. public: virtual std::string desc(); diff --git a/trunk/src/app/srs_app_http_conn.cpp b/trunk/src/app/srs_app_http_conn.cpp index 1942602b4..47c41f2a8 100644 --- a/trunk/src/app/srs_app_http_conn.cpp +++ b/trunk/src/app/srs_app_http_conn.cpp @@ -127,7 +127,8 @@ srs_error_t SrsHttpConn::cycle() srs_error_t err = do_cycle(); // Notify handler to handle it. - handler_->on_conn_done(); + // @remark The error may be transformed by handler. + err = handler_->on_conn_done(err); // success. if (err == srs_success) { @@ -179,9 +180,6 @@ srs_error_t SrsHttpConn::do_cycle() // process http messages. for (int req_id = 0; (err = trd->pull()) == srs_success; req_id++) { - // Try to receive a message from http. - srs_trace("HTTP client ip=%s:%d, request=%d, to=%dms", ip.c_str(), port, req_id, srsu2ms(SRS_HTTP_RECV_TIMEOUT)); - // get a http message ISrsHttpMessage* req = NULL; if ((err = parser->parse_message(skt, &req)) != srs_success) { @@ -388,11 +386,13 @@ srs_error_t SrsResponseOnlyHttpConn::on_http_message(ISrsHttpMessage* r, SrsHttp return err; } -void SrsResponseOnlyHttpConn::on_conn_done() +srs_error_t SrsResponseOnlyHttpConn::on_conn_done(srs_error_t r0) { // Because we use manager to manage this object, // not the http connection object, so we must remove it here. manager->remove(this); + + return r0; } srs_error_t SrsResponseOnlyHttpConn::set_tcp_nodelay(bool v) diff --git a/trunk/src/app/srs_app_http_conn.hpp b/trunk/src/app/srs_app_http_conn.hpp index 35e3bab03..344eece26 100644 --- a/trunk/src/app/srs_app_http_conn.hpp +++ b/trunk/src/app/srs_app_http_conn.hpp @@ -68,7 +68,8 @@ public: // For the stream caster, for instance, http flv streaming, may discard the flv header or not. virtual srs_error_t on_http_message(ISrsHttpMessage* r, SrsHttpResponseWriter* w) = 0; // When connection is destroy, should use manager to dispose it. - virtual void on_conn_done() = 0; + // The r0 is the original error, we will use the returned new error. + virtual srs_error_t on_conn_done(srs_error_t r0) = 0; }; // The http connection which request the static or stream content. @@ -170,7 +171,7 @@ public: public: virtual srs_error_t on_start(); virtual srs_error_t on_http_message(ISrsHttpMessage* r, SrsHttpResponseWriter* w); - virtual void on_conn_done(); + virtual srs_error_t on_conn_done(srs_error_t r0); // Extract APIs from SrsTcpConnection. public: // Set socket option TCP_NODELAY.