编写自定义解析

最近更新时间:2023-07-20 16:24:12

我的收藏

自定义解析函数介绍

自定义解析运行机制分为以下几个阶段,自定义解析允许您在这些执行阶段之间插入由您编写的云函数 SCF(Serverless)的函数逻辑,改变移动解析 HTTPDNS 的运行逻辑,进而实现自定义解析功能。如下图所示:



各执行阶段自定义
解析函数功能说明如下:
阶段名
说明
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
}