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
可以接受的形式:阻塞读写指定的字节数、网络错误以异常形式抛出。
httpc
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