#include "statbag.hh"
#include <boost/array.hpp>
#include "ednssubnet.hh"
+#include "minicurl.hh"
StatBag S;
bool hidettl=false;
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)
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;
}
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;
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");
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)));