ctyun.query_remote
函数信息详见下表:
项目 | 描述 |
---|---|
语法 | res, err = ctyun.query_remote(url, req_info, timeout?, direct2client?) |
作用 | 利用cosocket访问第三方网站,得到响应内容。支持简单的单次请求得到响应并处理、响应内容直接发送至客户端两种模式。 |
入参 | url:访问第三方服务的url。示例:"http://xy.ctyun.cn:80/session?type=1" req_info:请求信息,包括request_method,request body(POST时候需要),request headers,是否打开ssl认证。示例: { method = "POST", body = "hello world", headers = {}, ssl_verify = true } timeout: 超时时间,单位为毫秒。示例:30000,表示超时时间为30s。 direct2client: 是否直接发送至客户端,布尔型。示例:true,标识直接发送至客户端。注:开启时请求第三方的request_method需要跟客户端请求一致。 |
返回值 | res:响应结果,lua-table类型,{ status, headers, body }。当开启direct2client时此项为字符串done。 err:错误信息。 |
示例:
简单的单次请求
local res, err = ctyun.query_remote("http://xy.ctyun.cn/session", {
method = "POST",
body = "a=1&b=2",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
},
}, 30000)
if err then
return
end
-- At this point, the entire request / response is complete and the connection
-- will be closed or back on the connection pool.
local status = res.status
local length = res.headers["Content-Length"]
local body = res.body
响应直接发送客户端
local res, err = ctyun.query_remote("http://xy.ctyun.cn/session", {
method = "GET",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
},
}, 30000, true)
if err then
return
end
ctyun.query_get_cache
函数信息详见下表:
项目 | 描述 |
---|---|
语法 | res, err = ctyun.query_get_cache(cache_host, cache_url, cache_mode, ttl, uri?, args?, timeouts?) |
作用 | 回源拉取文件并缓存,得到响应内容可编辑。如m3u8改写,请求得到响应体,使用Lua脚本对响应体进行编辑后,重新计算Content-Length头部,调用ngx.print() 响应客户端经过处理后的响应。 |
入参 | cache_host: 缓存host。示例:ctyun.cn。 cache_url: 缓存url。示例:/static/origin.m3u8。 cache_mode: 固定缓存时间/跟随源站缓存(定值 "fixed" / “follow”)。默认为fixed, 非合法输入初始化为默认值。 ttl: 缓存时间,单位秒。如果是固定缓存,设置缓存多久; 如果跟随源站也可以设置默认值(秒)。 uri:请求uri,缺省为当前的请求uri。示例:/static/origin.m3u8。 args:请求参数,缺省为当前的请求参数,支持lua-string和lua-table两种格式。示例:a=1&b=2或者{a=1,b=2}。 timeouts:超时时间,array table格式。分别为connect_timeout、send_timeout、read_timout,单位ms。缺省为15000 60000 60000。示例:{15000, 15000, 15000}。 |
返回值 | res:响应结果,lua-table类型,{ status, headers, body }。 err:错误信息。 |
示例:
local res, err = ctyun.query_get_cache("ctyun.cn", "/static/origin.m3u8", "fixed", 86400, "/static/origin.m3u8", "a=1&b=2", {15000, 15000, 15000})
if err then
return
end
-- headers
for k, v in pairs(res.headers) do
ctyun.resp.set_header(k, v)
end
-- status
ctyun.resp.set_code(res.status)
local status = res.status
if status > 299 or status < 200 then
ctyun.resp.set_output(res.body)
end
-- process body
local body = res.body
if body then
-- 对响应的处理, process_body仅用于说明
-- body = process_body(body)
-- 重写Content-Length响应头,输出响应
ctyun.resp.set_header("Content-Length", #body)
ctyun.resp.set_output(res.body)
end