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:
parent
1e83da7812
commit
191b07668d
7 changed files with 26 additions and 25 deletions
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue