]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
add DoH support to sdig
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Sat, 18 May 2019 21:20:37 +0000 (23:20 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Tue, 4 Jun 2019 13:46:14 +0000 (15:46 +0200)
pdns/Makefile.am
pdns/sdig.cc

index b479d4f4db8db4121ec7852d5c69ef1aa0313699..b8ef5d4973763a67f921f8f59cb745fe2be7f8b8 100644 (file)
@@ -498,9 +498,10 @@ sdig_SOURCES = \
        sillyrecords.cc \
        sstuff.hh \
        statbag.cc \
-       unix_utility.cc
+       unix_utility.cc \
+       minicurl.cc minicurl.hh
 
-sdig_LDADD = $(LIBCRYPTO_LIBS)
+sdig_LDADD = $(LIBCRYPTO_LIBS) $(LIBCURL)
 sdig_LDFLAGS = $(AM_LDFLAGS) $(LIBCRYPTO_LDFLAGS)
 
 calidns_SOURCES = \
index 34828442d3bdb5fd694c77ef02e363b6a1b76b59..7fc65f7f317b9a867f5189d75641327e79f08a0a 100644 (file)
@@ -10,6 +10,7 @@
 #include "statbag.hh"
 #include <boost/array.hpp>
 #include "ednssubnet.hh"
+#include "minicurl.hh"
 StatBag S;
 
 bool hidettl=false;
@@ -24,7 +25,7 @@ string ttl(uint32_t ttl)
 
 void usage() {
   cerr<<"sdig"<<endl;
-  cerr<<"Syntax: sdig IP-ADDRESS PORT QUESTION QUESTION-TYPE [dnssec] [recurse] [showflags] [hidesoadetails] [hidettl] [tcp] [ednssubnet SUBNET/MASK] [xpf XPFDATA]"<<endl;
+  cerr<<"Syntax: sdig IP-ADDRESS-OR-DOH-URL PORT QUESTION QUESTION-TYPE [dnssec] [recurse] [showflags] [hidesoadetails] [hidettl] [tcp] [ednssubnet SUBNET/MASK] [xpf XPFDATA]"<<endl;
 }
 
 const string nameForClass(uint16_t qclass, uint16_t qtype)
@@ -48,6 +49,7 @@ try
   bool tcp=false;
   bool showflags=false;
   bool hidesoadetails=false;
+  bool doh=false;
   boost::optional<Netmask> ednsnm;
   uint16_t xpfcode = 0, xpfversion = 0, xpfproto = 0;
   char *xpfsrc = NULL, *xpfdst = NULL;
@@ -149,9 +151,21 @@ try
   }
 
   string reply;
-  ComboAddress dest(argv[1] + (*argv[1]=='@'), atoi(argv[2]));
+  string question(packet.begin(), packet.end());
+  ComboAddress dest;
+  if(*argv[1]=='h')
+    doh = true;
+  else
+    dest = ComboAddress(argv[1] + (*argv[1]=='@'), atoi(argv[2]));
 
-  if(tcp) {
+  if(doh) {
+    MiniCurl mc;
+    MiniCurl::MiniCurlHeaders mch;
+    mch.insert(std::make_pair("Content-Type", "application/dns-message"));
+    mch.insert(std::make_pair("Accept", "application/dns-message"));
+    reply = mc.postURL(argv[1], question, mch);
+  }
+  else if(tcp) {
     Socket sock(dest.sin4.sin_family, SOCK_STREAM);
     sock.connect(dest);
     uint16_t len;
@@ -159,7 +173,7 @@ try
     if(sock.write((char *) &len, 2) != 2)
       throw PDNSException("tcp write failed");
 
-    sock.writen(string(packet.begin(), packet.end()));
+    sock.writen(question);
     
     if(sock.read((char *) &len, 2) != 2)
       throw PDNSException("tcp read failed");
@@ -181,7 +195,7 @@ try
   else //udp
   {
     Socket sock(dest.sin4.sin_family, SOCK_DGRAM);
-    sock.sendTo(string(packet.begin(), packet.end()), dest);
+    sock.sendTo(question, dest);
     int result=waitForData(sock.getHandle(), 10);
     if(result < 0) 
       throw std::runtime_error("Error waiting for data: "+string(strerror(errno)));