skynet源码分析:http

skynet中有http server和http client的代码,用来支持http访问。在分析http之前,要先看一下url库。文件位于skyet/lualib/http/url.lua。

skynet 从 v0.5.0 开始提供了简单的 http 服务器的支持。skynet.httpd 是一个独立于 skynet 的,用于 http 协议解析的库,它本身依赖 socket api 的注入。使用它,你需要把读写 socket 的 API 封装好,注入到里面就可以工作。

skynet.sockethelper 模块将 skynet 的 Socket API 封装成 skynet.httpd 可以接受的形式:阻塞读写指定的字节数、网络错误以异常形式抛出。


skynet 提供了一个非常简单的 http 客户端模块。你可以用:

httpc.request(method, host, uri, recvheader, header, content)

来提交一个 http 请求,其中

  • method 是 "GET" "POST" 等。
  • host 为目标机的地址
  • uri 为请求的 URI
  • recvheader 可以是 nil 或一张空表,用于接收回应的 http 协议头。
  • header 是自定义的 http 请求头。注:如果 header 中没有给出 host ,那么将用前面的 host 参数自动补上。
  • content 为请求的内容。

它返回状态码和内容。如果网络出错,则抛出 error 。

httpc.dns(server, port)

可以用来设置一个异步查询 dns 的服务器地址。如果你不给出地址,那么将从 /etc/resolv.conf查找地址。如果你没有调用它设置异步 dns 查询,那么 skynet 将在网络底层做同步查询。这很有可能阻塞住整个 skynet 的网络消息处理(不仅仅阻塞单个 skynet 服务)。

另外,httpc 还提供了简单的 httpc.get 以及 httpc.post 的封装,具体可以参考源代码。

如果有https的需求,可使用 lua-webclient 它是libcurl multi interface的简单封装,支持单线程,非阻塞的大量http、https请求。

httpc 可以通过设置 httpc.timeout 的值来控制超时时间。时间单位为 1/100 秒。

https://github.com/cloudwu/skynet/wiki/Http