DNS over HTTPS (DoH)

Hi,

Today Firefox switched over to using ‘DNS over HTTPS (DoH)’ by default.

https://blog.mozilla.org/netpolicy/2020/02/25/the-facts-mozillas-dns-over-https-doh/

We can do this in Pharo as well, even out of the box (minus the interpretation of the results, but still).

First, what is this ? A good description is:

https://developers.cloudflare.com/1.1.1.1/dns-over-https/

Using the Cloudflare server, we can do the following in Pharo, using the JSON wire format.

ZnClient new
url: ‘https://cloudflare-dns.com/dns-query‘;
accept: ‘application/dns-json’;
queryAt: #name put: ‘pharo.org‘;
queryAt: #type put: ‘A’;
contentReader: [ :entity | STONJSON fromString: entity contents ];
get.

The actual address can be accessed inside the returned result.

SocketAddress fromDottedString: (((ZnClient new
url: ‘https://cloudflare-dns.com/dns-query‘;
accept: ‘application/dns-json’;
queryAt: #name put: ‘pharo.org‘;
queryAt: #type put: ‘A’;
contentReader: [ :entity | STONJSON fromString: entity contents ];
get) at: #Answer) first at: #data).

If you load the following code,

https://github.com/svenvc/NeoDNS

it is just as easy to use the binary UDP wire format.

ZnClient new
url: ‘https://cloudflare-dns.com/dns-query‘;
accept: ‘application/dns-message’;
contentWriter: [ :message |
ZnEntity with: message asByteArray type: ‘application/dns-message’ ];
contentReader: [ :entity |
DNSMessage readFrom: entity readStream ];
contents: (DNSMessage addressByName: ‘pharo.org‘);
post.

Again, the actual address can be accessed inside the returned object.

(ZnClient new
url: ‘https://cloudflare-dns.com/dns-query‘;
accept: ‘application/dns-message’;
contentWriter: [ :message |
ZnEntity with: message asByteArray type: ‘application/dns-message’ ];
contentReader: [ :entity |
DNSMessage readFrom: entity readStream ];
contents: (DNSMessage addressByName: ‘pharo.org‘);
post) answers first address.

Incidentally, a more robust answer can be got as follows:

NeoSimplifiedDNSClient default addressForName: ‘pharo.org‘.

Sven

%d bloggers like this: