mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2025-10-12 02:41:28 +08:00
50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
import $ from '@/core/app';
|
|
import dnsPacket from 'dns-packet';
|
|
import { Buffer } from 'buffer';
|
|
|
|
export async function doh({ url, domain, type = 'A', timeout, edns }) {
|
|
const buf = dnsPacket.encode({
|
|
type: 'query',
|
|
id: 0,
|
|
flags: dnsPacket.RECURSION_DESIRED,
|
|
questions: [
|
|
{
|
|
type,
|
|
name: domain,
|
|
},
|
|
],
|
|
additionals: [
|
|
{
|
|
type: 'OPT',
|
|
name: '.',
|
|
udpPayloadSize: 4096,
|
|
flags: 0,
|
|
options: [
|
|
{
|
|
code: 'CLIENT_SUBNET',
|
|
ip: edns,
|
|
sourcePrefixLength: 24,
|
|
scopePrefixLength: 0,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|
|
const res = await $.http.get({
|
|
url: `${url}?dns=${buf
|
|
.toString('base64')
|
|
.toString('utf-8')
|
|
.replace(/=/g, '')}`,
|
|
headers: {
|
|
Accept: 'application/dns-message',
|
|
// 'Content-Type': 'application/dns-message',
|
|
},
|
|
// body: buf,
|
|
'binary-mode': true,
|
|
encoding: null, // 使用 null 编码以确保响应是原始二进制数据
|
|
timeout,
|
|
});
|
|
|
|
return dnsPacket.decode(Buffer.from($.env.isQX ? res.bodyBytes : res.body));
|
|
}
|