源代码解读 [EOS 源码分析] 11 - cleos 的 HTTP 客户端 (httpc) 源码分析

Admin · 2019年12月21日 · 23 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

上一篇文章介绍了cleos get info在EOS源码中是如何实现的,cleos是一个命令行客户端,通过httpc向nodeos发送HTTP请求来获取EOS区块链上的数据,这篇文章来介绍httpc在源码中的实现。

eos/programs/cleos的主要源文件如下:

img

除去内容比较简单的localize.hpp、help_text.hpp,cleos的源码主要分为三部分:

  • main.cpp:cleos主要业务逻辑代码;

  • httpc.hpp & httpc.cpp:cleos的HTTP客户端工具;

  • CLI11.hpp:命令行客户端。

其中httpc是http client的简称,cleos和nodeos的交互就是通过httpc实现的。

httpc.hpp

httpc.hpp是http的头文件,位于eos/programs/cleos/httpc.hpp,头文件中定义的结构或变量都位于eosio::client::http命名空间下,包含下列声明:

1、HTTP上下文(http_context)

img

2、解析URL(parsed_url、resolved_url)

img

parsed_url重载了“+”操作符,使用scheme+server+port+path可以拼接出完整的API访问路径。

resolved_url继承自parsed_url:

img

resolve_url相对于parsed_url,增加了http_context

3、连接参数(connection_param)

img

包括HTTP上下文、解析后的url、证书、请求头。

4、发起HTTP请求的函数(do_http_call)

img

5、API访问路径列表

包括chain、history、net、wallet几大类,每个类别都有许多具体的API:

const string chain_func_base = "/v1/chain";    
const string history_func_base = "/v1/history";
const string net_func_base = "/v1/net";
const string wallet_func_base = "/v1/wallet";

6、连接异常(connection_exception)

FC_DECLARE_EXCEPTION( connection_exception, 1100000, "Connection Exception" );

FC_DECLARE_EXCEPTIONfc库中(eos/libraries/fc/include/fc/exception/exception.hpp)定义的宏:

#define FC_DECLARE_EXCEPTION( TYPE, CODE, WHAT ) \
  FC_DECLARE_DERIVED_EXCEPTION( TYPE, fc::exception, CODE, WHAT )

表示基于fc::exception的异常。

httpc.cpp

httpc.cpp是httpc.hpp的实现代码,下面列出一些主要实现:

1、HTTP上下文(http_context_impl)

img

img

网络请求是耗时操作,http_context_impl的内部使用了boost::asio::io_service,会新起一个线程向nodeos发出HTTP Request。

2、主要函数实现

  • do_connect:建立TCP连接;

  • do_txrx:发送/接收数据(tx=transmit,rx=receive);

  • parse_url:解析URL;

  • resolve_url:HTTP上下文中解析URL;

  • format_host_header:格式化URL字符串中的server和port;

  • do_http_call:发送HTTP Request,并接收和处理HTTP Response。

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 16:21
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册