1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Refactor HTTP stream to disconnect client when unpublish

This commit is contained in:
winlin 2019-12-17 16:54:06 +08:00
parent 1e83da7812
commit 191b07668d
7 changed files with 26 additions and 25 deletions

View file

@ -181,10 +181,12 @@ srs_error_t SrsConnection::cycle()
// client close peer. // client close peer.
// TODO: FIXME: Only reset the error when client closed it. // TODO: FIXME: Only reset the error when client closed it.
if (srs_is_client_gracefully_close(srs_error_code(err))) { if (srs_is_client_gracefully_close(err)) {
srs_warn("client disconnect peer. ret=%d", srs_error_code(err)); srs_warn("client disconnect peer. ret=%d", srs_error_code(err));
} else if (srs_is_server_gracefully_close(err)) {
srs_warn("server disconnect. ret=%d", srs_error_code(err));
} else { } else {
srs_error("connect error %s", srs_error_desc(err).c_str()); srs_error("serve error %s", srs_error_desc(err).c_str());
} }
srs_freep(err); srs_freep(err);

View file

@ -661,7 +661,9 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess
} }
} }
return err; // Here, the entry is disabled by encoder un-publishing or reloading,
// so we must return a io.EOF error to disconnect the client, or the client will never quit.
return srs_error_new(ERROR_HTTP_STREAM_EOF, "Stream EOF");
} }
srs_error_t SrsLiveStream::http_hooks_on_play(ISrsHttpMessage* r) srs_error_t SrsLiveStream::http_hooks_on_play(ISrsHttpMessage* r)

View file

@ -390,8 +390,8 @@ srs_error_t SrsRtmpConn::service_cycle()
// stream service must terminated with error, never success. // stream service must terminated with error, never success.
// when terminated with success, it's user required to stop. // when terminated with success, it's user required to stop.
if (srs_error_code(err) == ERROR_SUCCESS) { // TODO: FIXME: Support RTMP client timeout, https://github.com/ossrs/srs/issues/1134
srs_freep(err); if (err == srs_success) {
continue; continue;
} }

View file

@ -387,10 +387,9 @@ srs_error_t SrsRtspConn::cycle()
if (err == srs_success) { if (err == srs_success) {
srs_trace("client finished."); srs_trace("client finished.");
} else if (srs_is_client_gracefully_close(srs_error_code(err))) { } else if (srs_is_client_gracefully_close(err)) {
srs_warn("client disconnect peer. code=%d", srs_error_code(err)); srs_warn("client disconnect peer. code=%d", srs_error_code(err));
srs_freep(err); srs_freep(err);
err = srs_success;
} }
if (video_rtp) { if (video_rtp) {

View file

@ -30,30 +30,26 @@
#include <stdarg.h> #include <stdarg.h>
using namespace std; using namespace std;
bool srs_is_system_control_error(int error_code) bool srs_is_system_control_error(srs_error_t err)
{ {
int error_code = srs_error_code(err);
return error_code == ERROR_CONTROL_RTMP_CLOSE return error_code == ERROR_CONTROL_RTMP_CLOSE
|| error_code == ERROR_CONTROL_REPUBLISH || error_code == ERROR_CONTROL_REPUBLISH
|| error_code == ERROR_CONTROL_REDIRECT; || error_code == ERROR_CONTROL_REDIRECT;
} }
bool srs_is_system_control_error(srs_error_t err) bool srs_is_client_gracefully_close(srs_error_t err)
{ {
int error_code = srs_error_code(err); int error_code = srs_error_code(err);
return srs_is_system_control_error(error_code);
}
bool srs_is_client_gracefully_close(int error_code)
{
return error_code == ERROR_SOCKET_READ return error_code == ERROR_SOCKET_READ
|| error_code == ERROR_SOCKET_READ_FULLY || error_code == ERROR_SOCKET_READ_FULLY
|| error_code == ERROR_SOCKET_WRITE; || error_code == ERROR_SOCKET_WRITE;
} }
bool srs_is_client_gracefully_close(srs_error_t err) bool srs_is_server_gracefully_close(srs_error_t err)
{ {
int error_code = srs_error_code(err); int code = srs_error_code(err);
return srs_is_client_gracefully_close(error_code); return code == ERROR_HTTP_STREAM_EOF;
} }
SrsCplxError::SrsCplxError() SrsCplxError::SrsCplxError()

View file

@ -320,6 +320,7 @@
#define ERROR_HTTP_REQUEST_EOF 4029 #define ERROR_HTTP_REQUEST_EOF 4029
#define ERROR_HTTP_302_INVALID 4038 #define ERROR_HTTP_302_INVALID 4038
#define ERROR_BASE64_DECODE 4039 #define ERROR_BASE64_DECODE 4039
#define ERROR_HTTP_STREAM_EOF 4040
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// HTTP API error. // HTTP API error.
@ -336,10 +337,11 @@
// Whether the error code is an system control error. // Whether the error code is an system control error.
// TODO: FIXME: Remove it from underlayer for confused with error and logger. // TODO: FIXME: Remove it from underlayer for confused with error and logger.
extern bool srs_is_system_control_error(int error_code);
extern bool srs_is_system_control_error(srs_error_t err); extern bool srs_is_system_control_error(srs_error_t err);
extern bool srs_is_client_gracefully_close(int error_code); // It's closed by client.
extern bool srs_is_client_gracefully_close(srs_error_t err); extern bool srs_is_client_gracefully_close(srs_error_t err);
// It's closed by server, such as streaming EOF.
extern bool srs_is_server_gracefully_close(srs_error_t err);
// The complex error carries code, message, callstack and instant variables, // The complex error carries code, message, callstack and instant variables,
// which is more strong and easy to locate problem by log, // which is more strong and easy to locate problem by log,

View file

@ -2641,9 +2641,9 @@ VOID TEST(KernelUtility, RTMPUtils2)
VOID TEST(KernelErrorTest, CoverAll) VOID TEST(KernelErrorTest, CoverAll)
{ {
if (true) { if (true) {
EXPECT_TRUE(srs_is_system_control_error(ERROR_CONTROL_RTMP_CLOSE)); EXPECT_TRUE(srs_is_system_control_error(srs_error_new(ERROR_CONTROL_RTMP_CLOSE, "err")));
EXPECT_TRUE(srs_is_system_control_error(ERROR_CONTROL_REPUBLISH)); EXPECT_TRUE(srs_is_system_control_error(srs_error_new(ERROR_CONTROL_REPUBLISH, "err")));
EXPECT_TRUE(srs_is_system_control_error(ERROR_CONTROL_REDIRECT)); EXPECT_TRUE(srs_is_system_control_error(srs_error_new(ERROR_CONTROL_REDIRECT, "err")));
} }
if (true) { if (true) {
@ -2653,9 +2653,9 @@ VOID TEST(KernelErrorTest, CoverAll)
} }
if (true) { if (true) {
EXPECT_TRUE(srs_is_client_gracefully_close(ERROR_SOCKET_READ)); EXPECT_TRUE(srs_is_client_gracefully_close(srs_error_new(ERROR_SOCKET_READ, "err")));
EXPECT_TRUE(srs_is_client_gracefully_close(ERROR_SOCKET_READ_FULLY)); EXPECT_TRUE(srs_is_client_gracefully_close(srs_error_new(ERROR_SOCKET_READ_FULLY, "err")));
EXPECT_TRUE(srs_is_client_gracefully_close(ERROR_SOCKET_WRITE)); EXPECT_TRUE(srs_is_client_gracefully_close(srs_error_new(ERROR_SOCKET_WRITE, "err")));
} }
if (true) { if (true) {