自定义解析函数介绍
自定义解析运行机制分为以下几个阶段,自定义解析允许您在这些执行阶段之间插入由您编写的云函数 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// 底层的类型是stringif(typeof body === 'string') params = JSON.parse(body)else params = bodyvar {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=100response.ips.push('1.1.1.1')}if (hookType=="BEFORE_WRITE_RESPONSE") {response.ttl=200response.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}