srs代码学习(9)----http_api处理流程

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
    } 


连接转入到SrsHttpApi的类中,先看结构图


这个列是继承与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);
  
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值