Rdsn Http

2019-09-18

http请求:http://ip:port//

http_service:


  • 成员变量:std::map<std::string, http_callback> _cb_map,保存了method path和其处理函数http_callback之间的映射
  • 成员函数:
    • http_service::path返回该http_service的service path
    • http_service::register_handler,向_cb_map中添加method path和http_callback函数pair
    • http_service::call, 根据method path找到对应的http_callback, 并调用该http_callback

http_server:


  • 成员变量:std::map<std::string, std::unique_ptr<http_service» _service_map, 保存了http_service->path()和http_service之间的映射
  • 成员函数:
    • http_server::add_service(), 向_service_map中添加一个http_service
    • http_server::http_server()
      • register_rpc_handler,注册了RPC_HTTP_SERVICE类型的rpc调用的响应函数http_server::serve,http_servre::serve函数通过解析接收的msg–>http_request, 并根据http_request中的first(service)找到_service_map中保存的http_service,并通过http_service::call找到该service下的http_callback去处理请求
      • tools::register_message_header_parser<http_message_parser>(NET_HDR_HTTP, {“GET “, “POST”}), 注册了network_header_format为NET_HDR_HTTP的parser factory,用于生产http_message_parser类型的paser。可以通过NET_HDR_HTTP获取到该factory, 其signatures分别指定了“GET”和“POST”,在tools::register_message_header_parser内部将会建立signature和network_header_format内部建立映射(header_type::s_fmt_map),即“GET”和“POST”分别与NET_HDR_HTTP建立映射
      • add_service,添加了root_http_service和pprof_http_service

###parser factory注册流程:

  • register_message_header_parser–>register_component_provider–>message_parser_manager::register_factory在message_parser_manager::register_factory内部建立了signature和network_header_format之间的映射,这样便可以通过signature获取network_header_format了,进一步通过network_header_format获取到对应的parse factory例如对于http请求,可以通过数据包中的”GET”或者”POST” signature获取到network_header_format,进一步获取到parser factory
  • http_server在其构造函数里调用过register_message_header_parser,详见http_server::http_server()中的第2步

网络包处理流程asio_rpc_session


  • asio_network_provider::start
  • asio_network_provider::do_accept
  • start_read_next –> do_read:
    • 通过boost接口async_read_some读取一些数据存入_reader
    • 如果_parser为NULL, 则调用prepare_parser获取message parser, 该函数先根据网络包信息从header_type::s_fmt_map中获取相应的network_header_format, 然后根据network_header_format获取到对应的parser factory,创建一个parser
    • 然后通过_parser–>get_message_on_receive去解析, http解析的细节太多了,没仔细看

注册asio_network_provider的factory


    main–>dsn_run–>run–>dsn_core_init–>register_common_providers–>register_component_provider<asio_network_provider>(“dsn::tools::asio_network_provider”)