一、自定义解析函数介绍
各执行阶段自定义解析函数功能说明如下:
| 阶段名 | 说明 |
| BEFORE_WRITE_CACHE | 1. 在写入缓存前,修改递归解析的结果。2. 根据上下文,替换默认缓存的 key 值。 |
| BEFORE_WRITE_RESPONSE | 在最终返回响应前,最后一次修改响应内容。注意:此阶段无论是否命中缓存,一定会被执行。 |
二、云函数输入与输出
移动解析 HTTPDNS 会将运行时上下文输入给 云函数 SCF(Serverless)服务 中的函数,允许自定义函数逻辑来处理这些数据,并将处理后的结果合并后返回至移动解析 HTTPDNS 的解析流程中。详情如下:
1. 获取客户端出口 IP 及其访问信息。
2. 修改域名解析结果及 TTL 值。
3. 添加自定义的数据输出,与解析结果一起返回。
三、示例代码
'use strict';exports.main_handler = async (event, context, callback) => { const body=event['body'] var params = null // 底层的类型是string if(typeof body === 'string') params = JSON.parse(body) else params = body var {domainName, clientIp, hookType, ttl, ips} = params //打印客户端出口IP的具体信息 //此处为示例代码,可以根据具体使用场景进行调整 var request = require('request'); const getIpInfo_url = 'http://cip.cc/' + params.clientIp; var IpInfo = null; request.post({url:getIpInfo_url , headers: {"User-Agent": "curl"}}, function(error, response, body) { if(!error && response.statusCode == 200){ IpInfo = body; } console.log(IpInfo); }) var response = { ttl: ttl, ips: ips }; // 当解析一个不存在的域名或者解析失败时,默认为0或空串, // 而通过自定义解析功能,可将0排除,获取自定义的解析记录 response.ips = response.ips.filter(ip=>ip!=0); if (hookType=="BEFORE_WRITE_CACHE") { response.ttl=100 response.ips.push('1.1.1.1') } if (hookType=="BEFORE_WRITE_RESPONSE") { response.ttl=200 response.ips.push('2.2.2.2') } return response}
四、输入参数格式
移动解析 HTTPDNS 会将运行时上下文通过一个固定的 JSON 结构传给函数中的 event 参数。具体字段如下:
| 字段名 | 含义 |
| domainName | 当前正在解析的域名。 |
| clientIp | 客户端出口 IP 地址。 |
| hookType | 当前函数的运行阶段,阶段名请参考上文 各执行阶段自定义解析函数功能说明。 |
| ttl | 解析结果过期时间,仅限 BEFORE_WRITE_CACHE、BEFORE_WRITE_RESPONS 阶段。 |
| ips[] | 解析结果 IP 列表,仅限 BEFORE_WRITE_CACHE、BEFORE_WRITE_RESPONSE 阶段。 |
五、输入参数示例
{ "value": "test", "text": "HTTPDNS 测试模板", "context": { "body": { "domainName": "a.tencent.com", "clientIp": "58.60.10.100", "ttl": 498, "queryType": 28, "hookType": "BEFORE_WRITE_CACHE", "ips": [ "2402:4e00:1::" ] } }}
六、输出参数格式
云函数中的函数需要将处理的结果按照如下格式返回给移动解析 HTTPDNS,以便移动解析 HTTPDNS 进行解析。
注意:说明:
注意:所有字段均为可选。当字段未返回,或返回为 null 时,移动解析 HTTPDNS 将认为自定义解析函数无需修改该字段。
| 字段名 | 含义 |
| ips[] | 解析结果 IP 列表。 |
| ttl | 解析结果过期时间(秒),30<TTL<3600。 |
七、输出参数示例
{ "ips": ["2402:4e00:1::", '2.2.2.2'], "ttl": 200 }