about summary refs log tree commit diff
path: root/lisp/dns/resolver.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/dns/resolver.lisp')
-rw-r--r--lisp/dns/resolver.lisp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lisp/dns/resolver.lisp b/lisp/dns/resolver.lisp
new file mode 100644
index 000000000000..774be525cb20
--- /dev/null
+++ b/lisp/dns/resolver.lisp
@@ -0,0 +1,29 @@
+;; Initial implementation is a simple client for
+;; https://developers.google.com/speed/public-dns/docs/doh/json
+
+(defpackage #:dns
+  (:documentation "Simple DNS resolver in Common Lisp")
+  (:use #:cl)
+  (:export #:lookup-txt #:lookup-mx))
+
+(defvar *doh-base-url* "https://dns.google/resolve"
+  "Base URL of the service providing DNS-over-HTTP(S). Defaults to the
+  Google-hosted API.")
+
+(defun lookup-generic (name type)
+  (multiple-value-bind (body)
+      (drakma:http-request *doh-base-url*
+                           :decode-content t
+                           :want-stream t
+                           :parameters `(("type" . ,type)
+                                         ("name" . ,name)
+                                         ("ct" . "application/x-javascript")))
+    (cl-json:decode-json body)))
+
+(defun lookup-txt (name)
+  "Look up the TXT records at NAME."
+  (lookup-generic name "TXT"))
+
+(defun lookup-mx (name)
+  "Look up the MX records at NAME."
+  (lookup-generic name "MX"))