HTTP: Rename HTTP hijack to dynamic match for better clarity. v7.0.71 (#4462)

This PR refactors the HTTP routing system by renaming "hijack"
terminology to "dynamic match" for improved code clarity and better
semantic meaning.

Interface and Class Renaming
* ISrsHttpMatchHijacker → ISrsHttpDynamicMatcher
* hijack() method → dynamic_match() method
* hijackers member variables → dynamic_matchers_

Method Renaming
* SrsHttpServeMux::hijack() → SrsHttpServeMux::add_dynamic_matcher()
* SrsHttpServeMux::unhijack() →
SrsHttpServeMux::remove_dynamic_matcher()

The new "dynamic match" terminology better reflects that this is a
legitimate routing mechanism, not a security bypass or interception.
This commit is contained in:
Winlin 2025-09-01 08:33:31 -04:00 committed by GitHub
parent 728828e1dd
commit 0d6d36d1fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 86 additions and 78 deletions

View File

@ -7,6 +7,7 @@ The changelog for SRS.
<a name="v7-changes"></a> <a name="v7-changes"></a>
## SRS 7.0 Changelog ## SRS 7.0 Changelog
* v7.0, 2025-09-01, Merge [#4462](https://github.com/ossrs/srs/pull/4462): HTTP: Rename HTTP hijack to dynamic match for better clarity. v7.0.71 (#4462)
* v7.0, 2025-08-31, Merge [#4461](https://github.com/ossrs/srs/pull/4461): AI: Extract shared components and improve SRS server architecture. v7.0.70 (#4461) * v7.0, 2025-08-31, Merge [#4461](https://github.com/ossrs/srs/pull/4461): AI: Extract shared components and improve SRS server architecture. v7.0.70 (#4461)
* v7.0, 2025-08-31, Merge [#4460](https://github.com/ossrs/srs/pull/4460): AI: Always enable SRT protocol. v7.0.69 (#4460) * v7.0, 2025-08-31, Merge [#4460](https://github.com/ossrs/srs/pull/4460): AI: Always enable SRT protocol. v7.0.69 (#4460)
* v7.0, 2025-08-31, Merge [#4459](https://github.com/ossrs/srs/pull/4459): AI: Merge SRT and RTC servers into unified SrsServer. v7.0.68 (#4459) * v7.0, 2025-08-31, Merge [#4459](https://github.com/ossrs/srs/pull/4459): AI: Merge SRT and RTC servers into unified SrsServer. v7.0.68 (#4459)

View File

@ -1020,13 +1020,13 @@ SrsHttpStreamServer::SrsHttpStreamServer(SrsServer *svr)
server = svr; server = svr;
async_ = new SrsAsyncCallWorker(); async_ = new SrsAsyncCallWorker();
mux.hijack(this); mux.add_dynamic_matcher(this);
_srs_config->subscribe(this); _srs_config->subscribe(this);
} }
SrsHttpStreamServer::~SrsHttpStreamServer() SrsHttpStreamServer::~SrsHttpStreamServer()
{ {
mux.unhijack(this); mux.remove_dynamic_matcher(this);
_srs_config->unsubscribe(this); _srs_config->unsubscribe(this);
async_->stop(); async_->stop();
@ -1168,7 +1168,7 @@ void SrsHttpStreamServer::http_unmount(ISrsRequest *r)
} }
} }
srs_error_t SrsHttpStreamServer::hijack(ISrsHttpMessage *request, ISrsHttpHandler **ph) srs_error_t SrsHttpStreamServer::dynamic_match(ISrsHttpMessage *request, ISrsHttpHandler **ph)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -1178,7 +1178,7 @@ srs_error_t SrsHttpStreamServer::hijack(ISrsHttpMessage *request, ISrsHttpHandle
return err; return err;
} }
// only hijack for http streaming, http-flv/ts/mp3/aac. // only match for http streaming, http-flv/ts/mp3/aac.
std::string ext = request->ext(); std::string ext = request->ext();
if (ext.empty()) { if (ext.empty()) {
return err; return err;
@ -1203,7 +1203,7 @@ srs_error_t SrsHttpStreamServer::hijack(ISrsHttpMessage *request, ISrsHttpHandle
// for origin, the http stream will be mount already when publish, // for origin, the http stream will be mount already when publish,
// so it must never enter this line for stream already mounted. // so it must never enter this line for stream already mounted.
// for edge, the http stream is trigger by hstrs and mount by it, // for edge, the http stream is trigger by hstrs and mount by it,
// so we only hijack when only edge and hstrs is on. // so we only match when only edge and hstrs is on.
entry = it->second; entry = it->second;
// check entry and request extension. // check entry and request extension.
@ -1244,7 +1244,7 @@ srs_error_t SrsHttpStreamServer::hijack(ISrsHttpMessage *request, ISrsHttpHandle
SrsHttpMessage *hreq = dynamic_cast<SrsHttpMessage *>(request); SrsHttpMessage *hreq = dynamic_cast<SrsHttpMessage *>(request);
srs_assert(hreq); srs_assert(hreq);
// hijack for entry. // match for entry.
SrsUniquePtr<ISrsRequest> r(hreq->to_request(vhost->arg0())); SrsUniquePtr<ISrsRequest> r(hreq->to_request(vhost->arg0()));
std::string sid = r->get_stream_url(); std::string sid = r->get_stream_url();
@ -1254,10 +1254,10 @@ srs_error_t SrsHttpStreamServer::hijack(ISrsHttpMessage *request, ISrsHttpHandle
SrsLiveEntry *s_entry = streamHandlers[sid]; SrsLiveEntry *s_entry = streamHandlers[sid];
if (!s_entry->stream->entry->enabled) { if (!s_entry->stream->entry->enabled) {
// only when the http entry is disabled, check the config whether http flv disable, // only when the http entry is disabled, check the config whether http flv disable,
// for the http flv edge use hijack to trigger the edge ingester, we always mount it // for the http flv edge use match to trigger the edge ingester, we always mount it
// eventhough the origin does not exists the specified stream. // eventhough the origin does not exists the specified stream.
if (!_srs_config->get_vhost_http_remux_enabled(r->vhost)) { if (!_srs_config->get_vhost_http_remux_enabled(r->vhost)) {
return srs_error_new(ERROR_HTTP_HIJACK, "stream disabled"); return srs_error_new(ERROR_HTTP_DYNAMIC_MATCH, "stream disabled");
} }
} }
} }
@ -1273,7 +1273,7 @@ srs_error_t SrsHttpStreamServer::hijack(ISrsHttpMessage *request, ISrsHttpHandle
*ph = entry->stream; *ph = entry->stream;
} }
srs_trace("flv: hijack %s ok", upath.c_str()); srs_trace("flv: dynamic match %s ok", upath.c_str());
return err; return err;
} }

View File

@ -276,7 +276,7 @@ public:
// The HTTP Live Streaming Server, to serve FLV/TS/MP3/AAC stream. // The HTTP Live Streaming Server, to serve FLV/TS/MP3/AAC stream.
// TODO: Support multiple stream. // TODO: Support multiple stream.
class SrsHttpStreamServer : public ISrsReloadHandler, public ISrsHttpMatchHijacker class SrsHttpStreamServer : public ISrsReloadHandler, public ISrsHttpDynamicMatcher
{ {
private: private:
SrsServer *server; SrsServer *server;
@ -300,9 +300,10 @@ public:
// HTTP flv/ts/mp3/aac stream // HTTP flv/ts/mp3/aac stream
virtual srs_error_t http_mount(ISrsRequest *r); virtual srs_error_t http_mount(ISrsRequest *r);
virtual void http_unmount(ISrsRequest *r); virtual void http_unmount(ISrsRequest *r);
// Interface ISrsHttpMatchHijacker
// Interface ISrsHttpDynamicMatcher
public: public:
virtual srs_error_t hijack(ISrsHttpMessage *request, ISrsHttpHandler **ph); virtual srs_error_t dynamic_match(ISrsHttpMessage *request, ISrsHttpHandler **ph);
private: private:
virtual srs_error_t initialize_flv_streaming(); virtual srs_error_t initialize_flv_streaming();

View File

@ -9,6 +9,6 @@
#define VERSION_MAJOR 7 #define VERSION_MAJOR 7
#define VERSION_MINOR 0 #define VERSION_MINOR 0
#define VERSION_REVISION 70 #define VERSION_REVISION 71
#endif #endif

View File

@ -161,7 +161,7 @@
XX(ERROR_RTMP_CLIENT_NOT_FOUND, 2049, "ClientNotFound", "Request client is not found") \ XX(ERROR_RTMP_CLIENT_NOT_FOUND, 2049, "ClientNotFound", "Request client is not found") \
XX(ERROR_OpenSslCreateHMAC, 2050, "SslCreateHmac", "Failed to create HMAC for SSL") \ XX(ERROR_OpenSslCreateHMAC, 2050, "SslCreateHmac", "Failed to create HMAC for SSL") \
XX(ERROR_RTMP_STREAM_NAME_EMPTY, 2051, "StreamNameEmpty", "Invalid stream for name is empty") \ XX(ERROR_RTMP_STREAM_NAME_EMPTY, 2051, "StreamNameEmpty", "Invalid stream for name is empty") \
XX(ERROR_HTTP_HIJACK, 2052, "HttpHijack", "Failed to hijack HTTP handler") \ XX(ERROR_HTTP_DYNAMIC_MATCH, 2052, "HttpDynamicMatch", "Failed to dynamic match HTTP handler") \
XX(ERROR_RTMP_MESSAGE_CREATE, 2053, "MessageCreate", "Failed to create shared pointer message") \ XX(ERROR_RTMP_MESSAGE_CREATE, 2053, "MessageCreate", "Failed to create shared pointer message") \
XX(ERROR_RTMP_PROXY_EXCEED, 2054, "RtmpProxy", "Failed to decode message of RTMP proxy") \ XX(ERROR_RTMP_PROXY_EXCEED, 2054, "RtmpProxy", "Failed to decode message of RTMP proxy") \
XX(ERROR_RTMP_CREATE_STREAM_DEPTH, 2055, "RtmpIdentify", "Failed to identify RTMP client") \ XX(ERROR_RTMP_CREATE_STREAM_DEPTH, 2055, "RtmpIdentify", "Failed to identify RTMP client") \

View File

@ -785,11 +785,11 @@ SrsHttpMuxEntry::~SrsHttpMuxEntry()
srs_freep(handler); srs_freep(handler);
} }
ISrsHttpMatchHijacker::ISrsHttpMatchHijacker() ISrsHttpDynamicMatcher::ISrsHttpDynamicMatcher()
{ {
} }
ISrsHttpMatchHijacker::~ISrsHttpMatchHijacker() ISrsHttpDynamicMatcher::~ISrsHttpDynamicMatcher()
{ {
} }
@ -808,14 +808,14 @@ SrsHttpServeMux::SrsHttpServeMux()
SrsHttpServeMux::~SrsHttpServeMux() SrsHttpServeMux::~SrsHttpServeMux()
{ {
std::map<std::string, SrsHttpMuxEntry *>::iterator it; std::map<std::string, SrsHttpMuxEntry *>::iterator it;
for (it = entries.begin(); it != entries.end(); ++it) { for (it = static_matchers_.begin(); it != static_matchers_.end(); ++it) {
SrsHttpMuxEntry *entry = it->second; SrsHttpMuxEntry *entry = it->second;
srs_freep(entry); srs_freep(entry);
} }
entries.clear(); static_matchers_.clear();
vhosts.clear(); vhosts_.clear();
hijackers.clear(); dynamic_matchers_.clear();
} }
srs_error_t SrsHttpServeMux::initialize() srs_error_t SrsHttpServeMux::initialize()
@ -827,22 +827,24 @@ srs_error_t SrsHttpServeMux::initialize()
return err; return err;
} }
void SrsHttpServeMux::hijack(ISrsHttpMatchHijacker *h) void SrsHttpServeMux::add_dynamic_matcher(ISrsHttpDynamicMatcher *h)
{ {
std::vector<ISrsHttpMatchHijacker *>::iterator it = std::find(hijackers.begin(), hijackers.end(), h); std::vector<ISrsHttpDynamicMatcher *>::iterator it;
if (it != hijackers.end()) { it = std::find(dynamic_matchers_.begin(), dynamic_matchers_.end(), h);
if (it != dynamic_matchers_.end()) {
return; return;
} }
hijackers.push_back(h); dynamic_matchers_.push_back(h);
} }
void SrsHttpServeMux::unhijack(ISrsHttpMatchHijacker *h) void SrsHttpServeMux::remove_dynamic_matcher(ISrsHttpDynamicMatcher *h)
{ {
std::vector<ISrsHttpMatchHijacker *>::iterator it = std::find(hijackers.begin(), hijackers.end(), h); std::vector<ISrsHttpDynamicMatcher *>::iterator it;
if (it == hijackers.end()) { it = std::find(dynamic_matchers_.begin(), dynamic_matchers_.end(), h);
if (it == dynamic_matchers_.end()) {
return; return;
} }
it = hijackers.erase(it); it = dynamic_matchers_.erase(it);
} }
srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handler) srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handler)
@ -853,8 +855,8 @@ srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handle
return srs_error_new(ERROR_HTTP_PATTERN_EMPTY, "empty pattern"); return srs_error_new(ERROR_HTTP_PATTERN_EMPTY, "empty pattern");
} }
if (entries.find(pattern) != entries.end()) { if (static_matchers_.find(pattern) != static_matchers_.end()) {
SrsHttpMuxEntry *exists = entries[pattern]; SrsHttpMuxEntry *exists = static_matchers_[pattern];
if (exists->explicit_match) { if (exists->explicit_match) {
return srs_error_new(ERROR_HTTP_PATTERN_DUPLICATED, "pattern=%s exists", pattern.c_str()); return srs_error_new(ERROR_HTTP_PATTERN_DUPLICATED, "pattern=%s exists", pattern.c_str());
} }
@ -865,7 +867,7 @@ srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handle
if (pattern.find("/") != string::npos) { if (pattern.find("/") != string::npos) {
vhost = pattern.substr(0, pattern.find("/")); vhost = pattern.substr(0, pattern.find("/"));
} }
vhosts[vhost] = handler; vhosts_[vhost] = handler;
} }
if (true) { if (true) {
@ -875,11 +877,11 @@ srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handle
entry->pattern = pattern; entry->pattern = pattern;
entry->handler->entry = entry; entry->handler->entry = entry;
if (entries.find(pattern) != entries.end()) { if (static_matchers_.find(pattern) != static_matchers_.end()) {
SrsHttpMuxEntry *exists = entries[pattern]; SrsHttpMuxEntry *exists = static_matchers_[pattern];
srs_freep(exists); srs_freep(exists);
} }
entries[pattern] = entry; static_matchers_[pattern] = entry;
} }
// Helpful behavior: // Helpful behavior:
@ -890,8 +892,8 @@ srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handle
SrsHttpMuxEntry *entry = NULL; SrsHttpMuxEntry *entry = NULL;
// free the exists implicit entry // free the exists implicit entry
if (entries.find(rpattern) != entries.end()) { if (static_matchers_.find(rpattern) != static_matchers_.end()) {
entry = entries[rpattern]; entry = static_matchers_[rpattern];
} }
// create implicit redirect. // create implicit redirect.
@ -904,7 +906,7 @@ srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handle
entry->pattern = pattern; entry->pattern = pattern;
entry->handler->entry = entry; entry->handler->entry = entry;
entries[rpattern] = entry; static_matchers_[rpattern] = entry;
} }
} }
@ -914,10 +916,10 @@ srs_error_t SrsHttpServeMux::handle(std::string pattern, ISrsHttpHandler *handle
void SrsHttpServeMux::unhandle(std::string pattern, ISrsHttpHandler *handler) void SrsHttpServeMux::unhandle(std::string pattern, ISrsHttpHandler *handler)
{ {
if (true) { if (true) {
std::map<std::string, SrsHttpMuxEntry *>::iterator it = entries.find(pattern); std::map<std::string, SrsHttpMuxEntry *>::iterator it = static_matchers_.find(pattern);
if (it != entries.end()) { if (it != static_matchers_.end()) {
SrsHttpMuxEntry *entry = it->second; SrsHttpMuxEntry *entry = it->second;
entries.erase(it); static_matchers_.erase(it);
// We don't free the handler, because user should free it. // We don't free the handler, because user should free it.
if (entry->handler == handler) { if (entry->handler == handler) {
@ -935,9 +937,9 @@ void SrsHttpServeMux::unhandle(std::string pattern, ISrsHttpHandler *handler)
vhost = pattern.substr(0, pattern.find("/")); vhost = pattern.substr(0, pattern.find("/"));
} }
std::map<std::string, ISrsHttpHandler *>::iterator it = vhosts.find(vhost); std::map<std::string, ISrsHttpHandler *>::iterator it = vhosts_.find(vhost);
if (it != vhosts.end()) if (it != vhosts_.end())
vhosts.erase(it); vhosts_.erase(it);
} }
} }
@ -971,14 +973,14 @@ srs_error_t SrsHttpServeMux::find_handler(ISrsHttpMessage *r, ISrsHttpHandler **
return srs_error_wrap(err, "http match"); return srs_error_wrap(err, "http match");
} }
// always hijack. // always try to handle by dynamic matchers.
if (!hijackers.empty()) { if (!dynamic_matchers_.empty()) {
// notify all hijackers unless matching failed. // notify all dynamic matchers unless matching failed.
std::vector<ISrsHttpMatchHijacker *>::iterator it; std::vector<ISrsHttpDynamicMatcher *>::iterator it;
for (it = hijackers.begin(); it != hijackers.end(); ++it) { for (it = dynamic_matchers_.begin(); it != dynamic_matchers_.end(); ++it) {
ISrsHttpMatchHijacker *hijacker = *it; ISrsHttpDynamicMatcher *matcher = *it;
if ((err = hijacker->hijack(r, ph)) != srs_success) { if ((err = matcher->dynamic_match(r, ph)) != srs_success) {
return srs_error_wrap(err, "http hijack"); return srs_error_wrap(err, "http dynamic match");
} }
} }
} }
@ -996,7 +998,7 @@ srs_error_t SrsHttpServeMux::match(ISrsHttpMessage *r, ISrsHttpHandler **ph)
std::string path = r->path(); std::string path = r->path();
// Host-specific pattern takes precedence over generic ones // Host-specific pattern takes precedence over generic ones
if (!vhosts.empty() && vhosts.find(r->host()) != vhosts.end()) { if (!vhosts_.empty() && vhosts_.find(r->host()) != vhosts_.end()) {
path = r->host() + path; path = r->host() + path;
} }
@ -1004,7 +1006,7 @@ srs_error_t SrsHttpServeMux::match(ISrsHttpMessage *r, ISrsHttpHandler **ph)
ISrsHttpHandler *h = NULL; ISrsHttpHandler *h = NULL;
std::map<std::string, SrsHttpMuxEntry *>::iterator it; std::map<std::string, SrsHttpMuxEntry *>::iterator it;
for (it = entries.begin(); it != entries.end(); ++it) { for (it = static_matchers_.begin(); it != static_matchers_.end(); ++it) {
std::string pattern = it->first; std::string pattern = it->first;
SrsHttpMuxEntry *entry = it->second; SrsHttpMuxEntry *entry = it->second;

View File

@ -409,18 +409,18 @@ public:
virtual ~SrsHttpMuxEntry(); virtual ~SrsHttpMuxEntry();
}; };
// The hijacker for http pattern match. // The dynamic matcher for http pattern match.
class ISrsHttpMatchHijacker class ISrsHttpDynamicMatcher
{ {
public: public:
ISrsHttpMatchHijacker(); ISrsHttpDynamicMatcher();
virtual ~ISrsHttpMatchHijacker(); virtual ~ISrsHttpDynamicMatcher();
public: public:
// When match the request failed, no handler to process request. // When match the request failed, no handler to process request.
// @param request the http request message to match the handler. // @param request the http request message to match the handler.
// @param ph the already matched handler, hijack can rewrite it. // @param ph the already matched handler, dynamic matcher can rewrite it.
virtual srs_error_t hijack(ISrsHttpMessage *request, ISrsHttpHandler **ph) = 0; virtual srs_error_t dynamic_match(ISrsHttpMessage *request, ISrsHttpHandler **ph) = 0;
}; };
// The server mux, all http server should implements it. // The server mux, all http server should implements it.
@ -466,17 +466,19 @@ class SrsHttpServeMux : public ISrsHttpServeMux
{ {
private: private:
// The pattern handler, to handle the http request. // The pattern handler, to handle the http request.
std::map<std::string, SrsHttpMuxEntry *> entries; std::map<std::string, SrsHttpMuxEntry *> static_matchers_;
// The vhost handler. // The vhost handler.
// When find the handler to process the request, // When find the handler to process the request,
// append the matched vhost when pattern not starts with /, // append the matched vhost when pattern not starts with /,
// For example, for pattern /live/livestream.flv of vhost ossrs.net, // For example, for pattern /live/livestream.flv of vhost ossrs.net,
// The path will rewrite to ossrs.net/live/livestream.flv // The path will rewrite to ossrs.net/live/livestream.flv
std::map<std::string, ISrsHttpHandler *> vhosts; std::map<std::string, ISrsHttpHandler *> vhosts_;
// all hijackers for http match.
private:
// all dynamic matcher for http match.
// For example, the hstrs(http stream trigger rtmp source) // For example, the hstrs(http stream trigger rtmp source)
// can hijack and install handler when request incoming and no handler. // can dynamic match and install handler when request incoming and no handler.
std::vector<ISrsHttpMatchHijacker *> hijackers; std::vector<ISrsHttpDynamicMatcher *> dynamic_matchers_;
public: public:
SrsHttpServeMux(); SrsHttpServeMux();
@ -485,9 +487,11 @@ public:
public: public:
// Initialize the http serve mux. // Initialize the http serve mux.
virtual srs_error_t initialize(); virtual srs_error_t initialize();
// hijack the http match.
virtual void hijack(ISrsHttpMatchHijacker *h); public:
virtual void unhijack(ISrsHttpMatchHijacker *h); // Add a dynamic matcher for the http match.
virtual void add_dynamic_matcher(ISrsHttpDynamicMatcher *h);
virtual void remove_dynamic_matcher(ISrsHttpDynamicMatcher *h);
public: public:
// Handle registers the handler for the given pattern. // Handle registers the handler for the given pattern.

View File

@ -178,7 +178,7 @@ public:
} }
}; };
class MockHttpHandler : public ISrsHttpHandler, public ISrsHttpMatchHijacker class MockHttpHandler : public ISrsHttpHandler, public ISrsHttpDynamicMatcher
{ {
public: public:
string bytes; string bytes;
@ -193,7 +193,7 @@ public:
{ {
return w->write((char *)bytes.data(), (int)bytes.length()); return w->write((char *)bytes.data(), (int)bytes.length());
} }
virtual srs_error_t hijack(ISrsHttpMessage * /*r*/, ISrsHttpHandler **ph) virtual srs_error_t dynamic_match(ISrsHttpMessage * /*r*/, ISrsHttpHandler **ph)
{ {
if (ph) { if (ph) {
*ph = this; *ph = this;
@ -840,10 +840,10 @@ VOID TEST(ProtocolHTTPTest, HTTPServerMuxerHijack)
HELPER_ASSERT_SUCCESS(s.initialize()); HELPER_ASSERT_SUCCESS(s.initialize());
MockHttpHandler h1("Done"); MockHttpHandler h1("Done");
s.hijack(&h1); s.add_dynamic_matcher(&h1);
MockHttpHandler h0("Hello, world!"); MockHttpHandler h0("Hello, world!");
s.hijack(&h0); s.add_dynamic_matcher(&h0);
MockResponseWriter w; MockResponseWriter w;
SrsHttpMessage r(NULL, NULL); SrsHttpMessage r(NULL, NULL);
@ -859,10 +859,10 @@ VOID TEST(ProtocolHTTPTest, HTTPServerMuxerHijack)
HELPER_ASSERT_SUCCESS(s.initialize()); HELPER_ASSERT_SUCCESS(s.initialize());
MockHttpHandler h0("Hello, world!"); MockHttpHandler h0("Hello, world!");
s.hijack(&h0); s.add_dynamic_matcher(&h0);
MockHttpHandler h1("Done"); MockHttpHandler h1("Done");
s.hijack(&h1); s.add_dynamic_matcher(&h1);
MockResponseWriter w; MockResponseWriter w;
SrsHttpMessage r(NULL, NULL); SrsHttpMessage r(NULL, NULL);
@ -877,8 +877,8 @@ VOID TEST(ProtocolHTTPTest, HTTPServerMuxerHijack)
HELPER_ASSERT_SUCCESS(s.initialize()); HELPER_ASSERT_SUCCESS(s.initialize());
MockHttpHandler hroot("Hello, world!"); MockHttpHandler hroot("Hello, world!");
s.hijack(&hroot); s.add_dynamic_matcher(&hroot);
s.unhijack(&hroot); s.remove_dynamic_matcher(&hroot);
MockResponseWriter w; MockResponseWriter w;
SrsHttpMessage r(NULL, NULL); SrsHttpMessage r(NULL, NULL);
@ -893,7 +893,7 @@ VOID TEST(ProtocolHTTPTest, HTTPServerMuxerHijack)
HELPER_ASSERT_SUCCESS(s.initialize()); HELPER_ASSERT_SUCCESS(s.initialize());
MockHttpHandler hroot("Hello, world!"); MockHttpHandler hroot("Hello, world!");
s.hijack(&hroot); s.add_dynamic_matcher(&hroot);
MockResponseWriter w; MockResponseWriter w;
SrsHttpMessage r(NULL, NULL); SrsHttpMessage r(NULL, NULL);

View File

@ -26,9 +26,9 @@ VOID TEST(StTest, StUtimeInMicroseconds)
EXPECT_GT(st_time_1, 0); EXPECT_GT(st_time_1, 0);
EXPECT_GT(st_time_2, 0); EXPECT_GT(st_time_2, 0);
EXPECT_GE(st_time_2, st_time_1); EXPECT_GE(st_time_2, st_time_1);
// st_time_2 - st_time_1 should be in range of [1, 150] microseconds // st_time_2 - st_time_1 should be in range of [1, 300] microseconds
EXPECT_GE(st_time_2 - st_time_1, 0); EXPECT_GE(st_time_2 - st_time_1, 0);
EXPECT_LE(st_time_2 - st_time_1, 150); EXPECT_LE(st_time_2 - st_time_1, 300);
} }
static inline st_utime_t time_gettimeofday() static inline st_utime_t time_gettimeofday()