srs提供http相关功能。包括http_server http_api查询功能和http_heartbeat ,http_callback等。
首先分析http_api,这个提供一系列的http的接口,可以用来查询服务器的状态,但它的重要性并不只限于http查询,更重要的是在将来上线运营中,随着机器部署的增加。在需要在线修改机器配置的时候,也可以用这个接口。
下面来分析下一个http请求到来到回复出去所有的流程过程。
首先是http_api的配置如图
三个参数 开关 监听端口号 和跨域开关。
http_api的监听过程和我们在srs代码学习(1)中的流程是一样的,都是主线程创建一个监听线程,在连接上来以后,经srever的中转,把连接交给对应的connect类中,具体看看代码
首先是开始监听的代码
int SrsServer::listen_http_api()
{
int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_API
close_listeners(SrsListenerHttpApi);
if (_srs_config->get_http_api_enabled()) {
SrsListener* listener = new SrsStreamListener(this, SrsListenerHttpApi);
listeners.push_back(listener);
std::string ep = _srs_config->get_http_api_listen();
std::string ip;
int port;
srs_parse_endpoint(ep, ip, port);
if ((ret = listener->listen(ip, port)) != ERROR_SUCCESS) {
srs_error("HTTP api listen at %s:%d failed. ret=%d", ip.c_str(), port, ret);
return ret;
}
}
#endif
return ret;
}
同样是建立一个SrsStreamListener的实例,这个实例中有一个线程在运转,监听是否有连接上来。
在一个http client连接到后,通过int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd),来建立对应的连接,
if (type == SrsListenerHttpApi) {
#ifdef SRS_AUTO_HTTP_API
conn = new SrsHttpApi(this, client_stfd, http_api_mux);
#else
srs_warn("close http client for server not support http-api");
srs_close_stfd(client_stfd);
return ret;
#endif
}
这个列是继承与SrsConnection类中的,上次我们分析这类中有一个线程在跑。主要的循环函数是do_cycle。这个是个虚函数,要由派生类来觉得具体动作。看看它的实现
int SrsHttpApi::do_cycle()
{
int ret = ERROR_SUCCESS;
srs_trace("api get peer ip success. ip=%s", ip.c_str());
// initialize parser
if ((ret = parser->initialize(HTTP_REQUEST)) != ERROR_SUCCESS) {
srs_error("api initialize http parser failed. ret=%d", ret);
return ret;
}
// underlayer socket
SrsStSocket skt(stfd);
// set the recv timeout, for some clients never disconnect the connection.
// @see https://github.com/ossrs/srs/issues/398
skt.set_recv_timeout(SRS_HTTP_RECV_TIMEOUT_US);