Skip to content

Commit

Permalink
implement resolveSoa
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig committed Dec 5, 2024
1 parent 69ac56c commit c8ca389
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 4 deletions.
3 changes: 1 addition & 2 deletions src/node/dns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import {
resolve6,
resolveAny,
resolveNaptr,
resolveSoa,
setDefaultResultOrder,
getDefaultResultOrder,
setServers,
Expand All @@ -31,7 +30,6 @@ export {
resolve6,
resolveAny,
resolveNaptr,
resolveSoa,
setDefaultResultOrder,
getDefaultResultOrder,
setServers,
Expand All @@ -45,6 +43,7 @@ export const resolveCname = callbackify(dns.resolveCname.bind(dns));
export const resolveNs = callbackify(dns.resolveNs.bind(dns));
export const resolvePtr = callbackify(dns.resolvePtr.bind(dns));
export const resolveSrv = callbackify(dns.resolveSrv.bind(dns));
export const resolveSoa = callbackify(dns.resolveSoa.bind(dns));

export default {
getServers,
Expand Down
3 changes: 3 additions & 0 deletions src/node/dns/promises.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
resolveNs,
resolvePtr,
resolveSrv,
resolveSoa,
} from 'node-internal:internal_dns';

export * from 'node-internal:internal_dns_constants';
Expand All @@ -20,6 +21,7 @@ export {
resolveNs,
resolvePtr,
resolveSrv,
resolveSoa,
} from 'node-internal:internal_dns';

export default {
Expand All @@ -31,5 +33,6 @@ export default {
resolveNs,
resolvePtr,
resolveSrv,
resolveSoa,
...errorCodes,
};
41 changes: 39 additions & 2 deletions src/node/internal/internal_dns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,45 @@ export function resolvePtr(name: string): Promise<string[]> {
});
}

export function resolveSoa(): void {
throw new Error('Not implemented');
export function resolveSoa(name: string): Promise<{
nsname: string;
hostmaster: string;
serial: number;
refresh: number;
retry: number;
expire: number;
minttl: number;
}> {
validateString(name, 'name');

// Validation errors needs to be sync.
// Return a promise rather than using async qualifier.
return sendDnsRequest(name, 'SOA').then((json) => {
if (!('Answer' in json) || json.Answer.length === 0) {
// DNS request should contain an "Answer" attribute, but it didn't.
throw new DnsError(name, errorCodes.NOTFOUND, 'querySoa');
}

// Cloudflare DNS returns ""meera.ns.cloudflare.com. dns.cloudflare.com. 2357999196 10000 2400 604800 1800""
const [nsname, hostmaster, serial, refresh, retry, expire, minttl] =
json.Answer.at(0)?.data.split(' ') ?? [];
validateString(nsname, 'nsname');
validateString(hostmaster, 'hostmaster');
validateString(serial, 'serial');
validateString(refresh, 'refresh');
validateString(retry, 'retry');
validateString(expire, 'expire');
validateString(minttl, 'minttl');
return {
nsname,
hostmaster,
serial: parseInt(serial, 10),
refresh: parseInt(refresh, 10),
retry: parseInt(retry, 10),
expire: parseInt(expire, 10),
minttl: parseInt(minttl, 10),
};
});
}

export function resolveSrv(name: string): Promise<
Expand Down
26 changes: 26 additions & 0 deletions src/workerd/api/node/tests/dns-nodejs-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,29 @@ export const resolveSrv = {
validateResult(await dnsPromises.resolveSrv(addresses.SRV_HOST));
},
};

// Tests are taken from
// https://github.com/nodejs/node/blob/d7fdbb994cda8b2e1da4240eb97270c6abbaa9dd/test/internet/test-dns.js#L353
export const resolveSoa = {
async test() {
function validateResult(result) {
strictEqual(typeof result, 'object');
strictEqual(typeof result.nsname, 'string');
ok(result.nsname.length > 0);
strictEqual(typeof result.hostmaster, 'string');
ok(result.hostmaster.length > 0);
strictEqual(typeof result.serial, 'number');
ok(result.serial > 0 && result.serial < 4294967295);
strictEqual(typeof result.refresh, 'number');
ok(result.refresh > 0 && result.refresh < 2147483647);
strictEqual(typeof result.retry, 'number');
ok(result.retry > 0 && result.retry < 2147483647);
strictEqual(typeof result.expire, 'number');
ok(result.expire > 0 && result.expire < 2147483647);
strictEqual(typeof result.minttl, 'number');
ok(result.minttl >= 0 && result.minttl < 2147483647);
}

validateResult(await dnsPromises.resolveSoa(addresses.SOA_HOST));
},
};

0 comments on commit c8ca389

Please sign in to comment.