糖果实验室杂货铺

Candy Lab

Lua Curl的一般应用

3 years ago 0

作者:糖果

Curl是一个WEB开发常用的工具,直接用官网的翻译

curl是一个开源的命令行工具,也是一个库,用于传输URL语法的工具,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMTP, SMTPS, Telnet and TFTP等。

在lua中,curl就是以库的形式存在的,安装过程比较简单:

1
sudo luarocks install luacurl

另外,curl还是支持代理的方式访问主机,这个很有用,之后会用一个模拟DDOS攻击程序说明他的用处。

这一次,我们用一个和SAE云平台相关的机能,说明pycurl的使用。

简单的说明一下,SAE云平台是国内较早的云开开放平台之一,经过多年的积累,有广大的用户基础,提供便利的开发平台,最近开放了一个实时LOG查询功能。用户可以通过其对外开放的REST API,查询自己运行在云平台上的APP产出的LOG。

文档说明:

接入流程概述:

1.计算取得安全签名 。

2.向指定URL发送HTTP的GET请求,请求之前要根据官网的文档要求,填充HTTP header信息,如果没有准备的填充信息,会被视为无效请求。

3.取得返回的LOG信息,如果需要还可以对,返回LOG进行显示格式化。

技术栈:

依赖关联,此模块使用了几个常用的LUA库:

crypto:加密包,用于sha256运算。

base64:base64格式的转换处理。

crypto,base64在之前的章节有过介绍。

luacurl:HTTP工具包,此处用于向服务器发送HTTP请求。

socket:luasocket是调用socket api的,但此程序只是用于取得系统时间,用作当时间戳。

另外,国内的云风老师,因为觉得luasocket过于大了,不是很喜欢(QQ群里他自己说的...),他又写了一个lsocket,可以在github中找到,lsocket有一个sample,是使用lsocket实现了一个Http Server。

多说一句,Lua的库不像python或是php等语言,Lua的很多库都是第三方个人实现的,需要一个寻找和甄别的过程,使用之前,确认一下也很必要。

下面是具体的代码:

None
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
local crypto = require("crypto")
local hmac = require("crypto.hmac")
local curl = require("luacurl")
local socket = require("socket")
require('base64')
ALOG = {}
TIME_STAMP = nil
LOG_PATH = nil
SAE_LOG_HOST = 'g.sae.sina.com.cn'
SAE_ACCESSKEY = 'XXXXXXXX'
SAE_SECRETKEY = 'XXXXXXXXXXXXXXXXXXXXXXXXX'

function ALOG.request()
    local auth_info = ALOG.get_sec_token()
    local header_info = {
         'Host: '..SAE_LOG_HOST,
         'Accept: text/plain',
         'x-sae-accesskey: '..SAE_ACCESSKEY,
         'x-sae-timestamp: '..TIME_STAMP,
         'Authorization: '..auth_info
     }

    local url = 'http://'..SAE_LOG_HOST..LOG_PATH
    local c = curl.new()
    c:setopt(curl.OPT_URL, url)
    c:setopt(curl.OPT_HEADER, false)
    c:setopt(curl.OPT_HTTPHEADER,     table.concat(header_info,"\n"))

    local t = {}
    c:setopt(curl.OPT_WRITEFUNCTION, function(param, buf)
    table.insert(t, buf)
    return #buf
    end)
    assert(c:perform())
    return table.concat(t)
end

function ALOG.get_sec_token()
    local header = {
     'GET',
        LOG_PATH,
     'x-sae-accesskey:'..SAE_ACCESSKEY,
     'x-sae-timestamp:'..TIME_STAMP,
    }

    data_str = table.concat(header, '\n')
    local ret = 'SAEV1_HMAC_SHA256 '..to_base64(hmac.digest("sha256", data_str,SAE_SECRETKEY,rawequal))
    return ret
end

function ALOG.get_log_info(service, date, ident, fop, format)

    LOG_PATH = '/log/'..service..'/'..date..'/'..ident..'.log'..'?'..fop

    TIME_STAMP = math.ceil(socket.gettime())
    local log_info = ALOG.request()
    return log_info
end

local service = 'http'
local date = '2015-07-31'
local ident='1-access'
local meta = ALOG.get_log_info(service, date, ident, 'head/0/1', true)
print(meta)
return meta

在云平台上可以运行,python,php,python的脚本。目前是不支持lua的,以后是否支持不得而知。

因为将一个系统,分解成不同的子系统,一部分的功能是用lua实现,一部分的功能是用python实现,而系统之间的通信使用RPC通信,由lua端向python发送RPC,服务器端再接收RPC接收,必然会产生LOG。我们就在log端将实时的log取出,分析执行过程,这就是这段代码的意义。

关于Pycurl使用代理的案例,之后单起一篇说明,另外会将C实现代码的关键截取出来说明上层LUA与底层代码的功能。

1
2
3
4
5
6
7
POST /auth HTTP/1.1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 29\r\n
Host: localhost:9000\r\n
Connection: close\r\n
\r\n
userName=Ganesh&password=pass

PS:转载到其它平台请注明作者姓名及原文链接。

点击查看Lua FAQ


糖果实验室

Openresty中文编程网
IKBC经典机械键盘
机械键盘领券优惠购买

Write a Comment