Index: head/dns/powerdns-recursor/Makefile =================================================================== --- head/dns/powerdns-recursor/Makefile (revision 467585) +++ head/dns/powerdns-recursor/Makefile (revision 467586) @@ -1,63 +1,63 @@ # Created by: sten@blinkenlights.nl # $FreeBSD$ PORTNAME= recursor DISTVERSION= 4.1.2 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= dns ipv6 MASTER_SITES= http://downloads.powerdns.com/releases/ PKGNAMEPREFIX= powerdns- DISTNAME= pdns-${PORTNAME}-${DISTVERSION} MAINTAINER= tremere@cainites.net COMMENT= Advanced DNS recursor LICENSE= GPLv2 BROKEN_armv6= fails to compile: use of overloaded operator << is ambiguous BROKEN_armv7= fails to compile: use of overloaded operator << is ambiguous BROKEN_sparc64= fails to compile: json11.cpp: undefined reference to std::__throw_out_of_range_fmt BROKEN_powerpc64= fails to compile: dnslabeltext.cc: undefined reference to std::__cxx11::basic_string BUILD_DEPENDS= ${LOCALBASE}/include/boost/shared_ptr.hpp:devel/boost-libs LIB_DEPENDS= libboost_context.so:devel/boost-libs \ libprotobuf.so:devel/protobuf CONFLICTS_INSTALL= powerdns-recursor40 USES= compiler:c++11-lib cpe gmake localbase:ldflags pkgconfig ssl tar:bzip2 GNU_CONFIGURE= YES CXXFLAGS+= -D_GLIBCXX_USE_C99 CONFIGURE_ARGS= --sysconfdir=${PREFIX}/etc/pdns \ --with-protobuf CPE_VENDOR= powerdns USE_RC_SUBR= pdns-recursor OPTIONS_DEFINE= LUAJIT OPTALGO SETUID OPTIONS_DEFAULT= SETUID LUAJIT_CONFIGURE_WITH= luajit LUAJIT_DESC= Use LuaJIT instead of Lua LUAJIT_LIB_DEPENDS= libluajit-5.1.so.2:lang/luajit LUAJIT_USES_OFF= lua OPTALGO_CONFIGURE_ON= --enable-botan \ --enable-libdecaf \ --enable-libsodium OPTALGO_DESC= Enable optional algorithms (12, 15 & 16) OPTALGO_LIB_DEPENDS= libbotan-2.so:security/botan2 \ libdecaf.so:security/libdecaf \ libsodium.so:security/libsodium SETUID_DESC= Run as pdns_recursor user SETUID_EXTRA_PATCHES= ${PATCHDIR}/extrapatch-setuid SETUID_VARS= USERS=pdns_recursor GROUPS=pdns SUB_FILES= pkg-message .include .if ${OSVERSION} < 1003506 IGNORE= no _cxa_thread_atexit() support in FreeBSD libc < 10.4 .endif .include Index: head/dns/powerdns-recursor/files/patch-boost-1.67 =================================================================== --- head/dns/powerdns-recursor/files/patch-boost-1.67 (nonexistent) +++ head/dns/powerdns-recursor/files/patch-boost-1.67 (revision 467586) @@ -0,0 +1,2429 @@ +https://github.com/PowerDNS/pdns/commit/e6a9dde524b5 + +--- arguments.cc.orig 2018-03-29 13:04:45 UTC ++++ arguments.cc +@@ -443,7 +443,7 @@ bool ArgvMap::file(const char *fname, bool lax, bool i + set("include-dir","Directory to include configuration files from"); + + if(!parseFile(fname, "", lax)) { +- L << Logger::Warning << "Unable to open " << fname << std::endl; ++ g_log << Logger::Warning << "Unable to open " << fname << std::endl; + return false; + } + +@@ -453,7 +453,7 @@ bool ArgvMap::file(const char *fname, bool lax, bool i + gatherIncludes(extraConfigs); + for(const std::string& fn : extraConfigs) { + if (!file(fn.c_str(), lax, true)) { +- L << Logger::Error << fn << " could not be parsed" << std::endl; ++ g_log << Logger::Error << fn << " could not be parsed" << std::endl; + throw ArgException(fn + " could not be parsed"); + } + } +@@ -471,18 +471,18 @@ void ArgvMap::gatherIncludes(std::vector + + // stat + if (stat(params["include-dir"].c_str(), &st)) { +- L << Logger::Error << params["include-dir"] << " does not exist!" << std::endl; ++ g_log << Logger::Error << params["include-dir"] << " does not exist!" << std::endl; + throw ArgException(params["include-dir"] + " does not exist!"); + } + + // wonder if it's accessible directory + if (!S_ISDIR(st.st_mode)) { +- L << Logger::Error << params["include-dir"] << " is not a directory" << std::endl; ++ g_log << Logger::Error << params["include-dir"] << " is not a directory" << std::endl; + throw ArgException(params["include-dir"] + " is not a directory"); + } + + if (!(dir = opendir(params["include-dir"].c_str()))) { +- L << Logger::Error << params["include-dir"] << " is not accessible" << std::endl; ++ g_log << Logger::Error << params["include-dir"] << " is not accessible" << std::endl; + throw ArgException(params["include-dir"] + " is not accessible"); + } + +@@ -494,7 +494,7 @@ void ArgvMap::gatherIncludes(std::vector + namebuf << params["include-dir"].c_str() << "/" << ent->d_name; // FIXME: Use some path separator + // ensure it's readable file + if (stat(namebuf.str().c_str(), &st) || !S_ISREG(st.st_mode)) { +- L << Logger::Error << namebuf.str() << " is not a file" << std::endl; ++ g_log << Logger::Error << namebuf.str() << " is not a file" << std::endl; + closedir(dir); + throw ArgException(namebuf.str() + " does not exist!"); + } +--- dns.hh.orig 2018-03-29 13:04:45 UTC ++++ dns.hh +@@ -225,7 +225,6 @@ inline uint16_t * getFlagsFromDNSHeader(struct dnshead + #define FLAGS_CD_OFFSET (12) + #endif + +-#define L theL() + extern time_t s_starttime; + + uint32_t hashQuestion(const char* packet, uint16_t len, uint32_t init); +--- gss_context.cc.orig 2018-03-29 13:04:45 UTC ++++ gss_context.cc +@@ -456,17 +456,17 @@ bool gss_add_signature(const DNSName& context, const s + string tmp_mac; + GssContext gssctx(context); + if (!gssctx.valid()) { +- L<(in)); + } + } +- catch(std::exception& e) { theL() <registerFunction("check",[](const cas_t& cas, const ComboAddress&ca) { +@@ -451,7 +451,7 @@ RecursorLua4::RecursorLua4(const std::string& fname) + } + } + catch(std::exception& e) { +- theL() <writeFunction("pdnslog", [](const std::string& msg, boost::optional loglevel) { +- theL() << (Logger::Urgency)loglevel.get_value_or(Logger::Warning) << msg< > in_t; + vector > > pd{ +@@ -719,7 +719,7 @@ loop:; + dq.udpAnswer = GenUDPQueryResponse(dq.udpQueryDest, dq.udpQuery); + auto cbFunc = d_lw->readVariable>(dq.udpCallback).get_value_or(0); + if(!cbFunc) { +- theL()<d_rcode = RCode::FormErr; + g_stats.serverParseError++; + #ifdef HAVE_PROTOBUF +@@ -287,7 +287,7 @@ int asyncresolve(const ComboAddress& ip, const DNSName + return 1; // success - oddly enough + } + catch(...) { +- L< size) { +- L< *nearMissLimit) { +- L< "<<*nearMissLimit<<") bogus answers for '"< "<<*nearMissLimit<<") bogus answers for '"<count(d_remote) && !(*t_tcpClientCounts)[d_remote]--) +@@ -858,12 +858,12 @@ static void startDoResolve(void *p) + + + if(!g_quiet || tracedQuery) { +- L<getTid()<<"/"<numProcesses()<<"] " << (dc->d_tcp ? "TCP " : "") << "question for '"<d_mdp.d_qname<<"|" ++ g_log<getTid()<<"/"<numProcesses()<<"] " << (dc->d_tcp ? "TCP " : "") << "question for '"<d_mdp.d_qname<<"|" + <d_mdp.d_qtype)<<"' from "<getRemote(); + if(!dc->d_ednssubnet.source.empty()) { +- L<<" (ecs "<d_ednssubnet.source.toString()<<")"; ++ g_log<<" (ecs "<d_ednssubnet.source.toString()<<")"; + } +- L<getTid()); +@@ -926,7 +926,7 @@ static void startDoResolve(void *p) + } + catch(ImmediateServFailException &e) { + if(g_logCommonErrors) +- L<getRemote()<<" during resolve of '"<d_mdp.d_qname<<"' because: "<getRemote()<<" during resolve of '"<d_mdp.d_qname<<"' because: "<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<<" validates correctly"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<<" validates correctly"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<<" validates as Insecure"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<<" validates as Insecure"<ad=0; + } + else if(state == Bogus) { + if(g_dnssecLogBogus || sr.doLog() || g_dnssecmode == DNSSECMode::ValidateForLog) { +- L<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<<" validates as Bogus"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" for "<d_remote.toStringWithPort()<<" validates as Bogus"<cd && (g_dnssecmode == DNSSECMode::ValidateAll || dc->d_mdp.d_header.ad || DNSSECOK)) { + if(sr.doLog()) { +- L<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" because recursor or query demands it for Bogus results"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" because recursor or query demands it for Bogus results"<rcode=RCode::ServFail; + goto sendit; + } else { + if(sr.doLog()) { +- L<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" Bogus validation since neither config nor query demands this"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<" Bogus validation since neither config nor query demands this"<getRemote()<<" during validation of '"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<"' because: "<getRemote()<<" during validation of '"<d_mdp.d_qname<<"|"<d_mdp.d_qtype).getName()<<"' because: "<rcode=RCode::ServFail; + goto sendit; + } +@@ -1195,7 +1195,7 @@ static void startDoResolve(void *p) + addCMsgSrcAddr(&msgh, cbuf, &dc->d_local, 0); + } + if(sendmsg(dc->d_socket, &msgh, 0) < 0 && g_logCommonErrors) +- L<d_remote.toStringWithPort()<<" failed with: "<d_remote.toStringWithPort()<<" failed with: "<insertResponsePacket(dc->d_tag, dc->d_qhash, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_mdp.d_qclass, +@@ -1221,11 +1221,11 @@ static void startDoResolve(void *p) + bool hadError=true; + + if(wret == 0) +- L<getRemote()<getRemote()<getRemote()<<": "<< strerror(errno) <getRemote()<<": "<< strerror(errno) <getRemote()<<" for "<d_mdp.d_qname<<" (size="<< (2 + packet.size()) <<", sent "<getRemote()<<" for "<d_mdp.d_qname<<" (size="<< (2 + packet.size()) <<", sent "<d_now); + if(!g_quiet) { +- L<getTid()<<"/"<numProcesses()<<"] answer to "<<(dc->d_mdp.d_header.rd?"":"non-rd ")<<"question '"<d_mdp.d_qname<<"|"<d_mdp.d_qtype); +- L<<"': "<ancount)<<" answers, "<arcount)<<" additional, took "<getTid()<<"/"<numProcesses()<<"] answer to "<<(dc->d_mdp.d_header.rd?"":"non-rd ")<<"question '"<d_mdp.d_qname<<"|"<d_mdp.d_qtype); ++ g_log<<"': "<ancount)<<" answers, "<arcount)<<" additional, took "<d_mdp.d_qname<<", "<d_mdp.d_qname<<", "<getMaxStackUsage(), g_stats.maxMThreadStackUsage); +@@ -1436,7 +1436,7 @@ static void handleRunningTCPQuestion(int fd, FDMultipl + } + if(!bytes || bytes < 0) { + if(g_logCommonErrors) +- L<d_remote.toString() <<" disconnected after first byte"<d_remote.toString() <<" disconnected after first byte"<removeReadFD(fd); + return; + } +@@ -1444,7 +1444,7 @@ static void handleRunningTCPQuestion(int fd, FDMultipl + else if(conn->state==TCPConnection::GETQUESTION) { + ssize_t bytes=recv(conn->getFD(), conn->data + conn->bytesread, conn->qlen - conn->bytesread, 0); + if(!bytes || bytes < 0 || bytes > std::numeric_limits::max()) { +- L<d_remote.toString() <<" disconnected while reading question body"<d_remote.toString() <<" disconnected while reading question body"<removeReadFD(fd); + return; + } +@@ -1459,7 +1459,7 @@ static void handleRunningTCPQuestion(int fd, FDMultipl + catch(MOADNSException &mde) { + g_stats.clientParseError++; + if(g_logCommonErrors) +- L<d_remote.toString() <d_remote.toString() <d_tcpConnection = conn; // carry the torch +@@ -1503,14 +1503,14 @@ static void handleRunningTCPQuestion(int fd, FDMultipl + } + catch(const std::exception& e) { + if(g_logCommonErrors) +- L<d_mdp.d_header.qr) { + delete dc; + g_stats.ignoredCount++; +- L<d_remote.toString() <<" on server socket!"<d_remote.toString() <<" on server socket!"<d_mdp.d_header.opcode) { + delete dc; + g_stats.ignoredCount++; +- L<d_remote.toString() <<" on server socket!"<d_remote.toString() <<" on server socket!"<push_back(addr); + if(t_allowFrom && !t_allowFrom->match(&addr)) { + if(!g_quiet) +- L<getTid()<<"] dropping TCP query from "<getTid()<<"] dropping TCP query from "<= sizeof(struct dnsheader)) { + struct dnsheader tmpdh; +@@ -1760,14 +1760,14 @@ static string* doProcessUDPQuestion(const std::string& + } + } + catch(std::exception& e) { +- L<ipfilter(fromaddr, destaddr, *dh)) { + if(!g_quiet) +- L<getTid()<<"/"<numProcesses()<<"] DROPPED question from "<getTid()<<"/"<numProcesses()<<"] DROPPED question from "<numProcesses() > g_maxMThreads) { + if(!g_quiet) +- L<getTid()<<"/"<numProcesses()<<"] DROPPED question from "<getTid()<<"/"<numProcesses()<<"] DROPPED question from "<match(&fromaddr)) { + if(!g_quiet) +- L<getTid()<<"] dropping UDP query from "<getTid()<<"] dropping UDP query from "<getTid()<<"] dropping UDP query from "<getTid()<<"] dropping UDP query from "<qr) { + g_stats.ignoredCount++; + if(g_logCommonErrors) +- L<opcode) { + g_stats.ignoredCount++; + if(g_logCommonErrors) +- L<opcode<<" from "<opcode<<" from "<= 0) { + if(i==locals.begin()) +- L<(pleaseGetCacheMisses); + + if(g_stats.qcounter && (cacheHits + cacheMisses) && SyncRes::s_queries && SyncRes::s_outqueries) { +- L<(pleaseGetCacheSize)<< " cache entries, "<< + broadcastAccFunction(pleaseGetNegCacheSize)<<" negative entries, "<< + (int)((cacheHits*100.0)/(cacheHits+cacheMisses))<<"% cache hits"<(pleaseGetThrottleSize) <<", ns speeds: " + << broadcastAccFunction(pleaseGetNsSpeedsSize)<(pleaseGetConcurrentQueries)<<" queries running, "<(pleaseGetPacketCacheSize) << ++ g_log<(pleaseGetPacketCacheSize) << + " packet cache entries, "<<(int)(100.0*broadcastAccFunction(pleaseGetPacketCacheHits)/SyncRes::s_queries) << "% packet cache hits"<wantAnswer) { + if(write(g_pipes[t_id].writeFromThread, &resp, sizeof(resp)) != sizeof(resp)) { +@@ -2406,10 +2406,10 @@ static void handleRCC(int fd, FDMultiplexer::funcparam + command(); + } + catch(std::exception& e) { +- L<" : pident.domain.toString())<<", "<d_waiters.size()<<" waiters"<" : pident.domain.toString())<<", "<d_waiters.size()<<" waiters"<= 0) { +@@ -2585,13 +2585,13 @@ FDMultiplexer* getMultiplexer() + return ret; + } + catch(FDMultiplexerException &fe) { +- L<= wantFDs) { + setFilenumLimit(wantFDs); +- L<addMask(line); + } +- L<size() <<" allow-from ranges from file '"<<::arg()["allow-from-file"]<<"' - overriding 'allow-from' setting"<size() <<" allow-from ranges from file '"<<::arg()["allow-from-file"]<<"' - overriding 'allow-from' setting"< ips; + stringtok(ips, ::arg()["allow-from"], ", "); + +- L<::const_iterator i = ips.begin(); i!= ips.end(); ++i) { + allowFrom->addMask(*i); + if(i!=ips.begin()) +- L< > parseCPU + const std::string value = ::arg()["cpu-map"]; + + if (!value.empty() && !isSettingThreadCPUAffinitySupported()) { +- L< > parseCPU + } + } + catch(const std::exception& e) { +- L<second); + if (rc == 0) { +- L<second) { +- L<second) { +- L<= 0) +- theL().setFacility(val); ++ g_log.setFacility(val); + else +- L< addrs; + if(!::arg()["query-local-address6"].empty()) { + SyncRes::s_doIPv6=true; +- L<::const_iterator i = ips.begin(); i!= ips.end(); ++i) { + SyncRes::addDontQuery(*i); + if(i!=ips.begin()) +- L<(new boost::uuids::random_generator()); + #endif +- L<(::arg()["lua-dns-script"]); +- L<getName() << "' multiplexer"<getName() << "' multiplexer"<addReadFD(g_pipes[t_id].readToThread, handlePipeRequest); +@@ -3268,7 +3268,7 @@ try + for(expired_t::iterator i=expired.begin() ; i != expired.end(); ++i) { + shared_ptr conn=any_cast >(i->second); + if(g_logCommonErrors) +- L<d_remote.toString() <d_remote.toString() <removeReadFD(i->first); + } + } +@@ -3308,15 +3308,15 @@ try + } + } + catch(PDNSException &ae) { +- L<reserve(zoneSizeHint); + } + } +- theL()<setName(polName); + loadRPZFromFile(filename, zone, defpol, maxTTL); + lci.dfe.addZone(zone); +- theL()<toString()<toString()<toString()<toString()<(dynamic_cast(DSRecordContent::make(what))); + lci.dsAnchors[who].insert(*ds); + }); + broadcastAccFunction(boost::bind(pleaseWipePacketCache, who, true)); +- L< + #include "dnsrecords.hh" + #include +-#undef L + #include + #include + #include +@@ -42,7 +41,6 @@ + #include "validate.hh" + #undef max + +-#define L theL() + #include "namespaces.hh" + using namespace ::boost::multi_index; + +--- reczones.cc.orig 2018-03-29 13:04:45 UTC ++++ reczones.cc +@@ -119,10 +119,10 @@ static void makeNameToIPZone(std::shared_ptrcount(dr.d_name)) { +- L<count(dr.d_name)) { +- L<::const_iterator iter = servers.begin(); iter != servers.end(); ++iter) { + if(verbose && iter != servers.begin()) +- L<<", "; ++ g_log<<", "; + + ComboAddress addr=parseIPAndPort(*iter, 53); + if(verbose) +- L< original=SyncRes::getDomainMap(); + + try { +- L< parseAuthAndForw + // headers.first=toCanonic("", headers.first); + if(n==0) { + ad.d_rdForward = false; +- L< parseAuthAndForw + } + } + else { +- L< parseAuthAndForw + } + + if(!::arg()["forward-zones-file"].empty()) { +- L< parseAuthAndForw + ad.d_name = DNSName(domain); + (*newMap)[ad.d_name]=ad; + } +- L<size() - before<<" forwarding instructions from file '"<<::arg()["forward-zones-file"]<<"'"<size() - before<<" forwarding instructions from file '"<<::arg()["forward-zones-file"]<<"'"< parseAuthAndForw + + ifstream ifs(fname.c_str()); + if(!ifs) { +- L< parseAuthAndForw + } + } + if(::arg().mustDo("serve-rfc1918")) { +- L< loadRPZFromServer(const ComboAddress& master, const DNSName& zoneName, std::shared_ptr zone, boost::optional defpol, uint32_t maxTTL, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, uint16_t axfrTimeout) + { +- L< loadRPZFromServer(const C + throw PDNSException("Total AXFR time exceeded!"); + } + if(last != time(0)) { +- L<getZoneRepresentation()<getZoneRepresentation()<d_st.serial, zone->size(), true); + } + catch(const std::exception& e) { +- theL()<(dr)->d_st.serial<(dr)->d_st.serial<, vector > > deltas; + + ComboAddress local(localAddress); +@@ -333,13 +333,13 @@ void RPZIXFRTracker(const ComboAddress& master, boost: + try { + deltas = getIXFRDeltas(master, zoneName, dr, tt, &local, maxReceivedBytes); + } catch(std::runtime_error& e ){ +- L< oldZone = luaconfsLocal->dfe.getZone(zoneIdx); +@@ -352,7 +352,7 @@ void RPZIXFRTracker(const ComboAddress& master, boost: + const auto& remove = delta.first; + const auto& add = delta.second; + if(remove.empty()) { +- L<clear(); + fullUpdate = true; + } +@@ -365,11 +365,11 @@ void RPZIXFRTracker(const ComboAddress& master, boost: + // cout<<"Got good removal of SOA serial "<d_st.serial<(rr); +- // L<d_st.serial<d_st.serial<d_st.serial<d_st.serial<setSerial(sr->d_st.serial); + setRPZZoneNewState(polName, sr->d_st.serial, newZone->size(), fullUpdate); + +--- secpoll-recursor.cc.orig 2018-03-29 13:04:45 UTC ++++ secpoll-recursor.cc +@@ -55,7 +55,7 @@ void doSecPoll(time_t* last_secpoll) + } + + if(state == Bogus) { +- L<pw_name, gid)<0) { +- theL()<gr_gid; +@@ -204,7 +204,7 @@ int Utility::makeUidNumeric(const string &username) + if(!(newuid=atoi(username.c_str()))) { + struct passwd *pw=getpwnam(username.c_str()); + if(!pw) { +- theL()<pw_uid; +--- validate-recursor.cc.orig 2018-03-29 13:04:45 UTC ++++ validate-recursor.cc +@@ -13,7 +13,7 @@ bool checkDNSSECDisabled() { + bool warnIfDNSSECDisabled(const string& msg) { + if(g_dnssecmode == DNSSECMode::Off) { + if (!msg.empty()) +- L<body.empty()) { +- L<body, err); + if (doc.is_null()) { +- L<headers["access-control-allow-origin"] = "*"; + + if (api_key.empty()) { +- L<url.path << "\": Authentication failed, API Key missing in config" << endl; ++ g_log<url.path << "\": Authentication failed, API Key missing in config" << endl; + throw HttpUnauthorizedException("X-API-Key"); + } + bool auth_ok = req->compareHeader("x-api-key", api_key) || req->getvars["api-key"]==api_key; + + if (!auth_ok) { +- L<url.path << "\": Authentication by API Key failed" << endl; ++ g_log<url.path << "\": Authentication by API Key failed" << endl; + throw HttpUnauthorizedException("X-API-Key"); + } + +@@ -181,7 +181,7 @@ static void webWrapper(WebServer::HandlerFunction hand + if (!web_password.empty()) { + bool auth_ok = req->compareAuthorization(web_password); + if (!auth_ok) { +- L<url.path << "\": Web Authentication failed" << endl; ++ g_log<url.path << "\": Web Authentication failed" << endl; + throw HttpUnauthorizedException("Basic"); + } + } +@@ -206,11 +206,11 @@ void WebServer::handleRequest(HttpRequest& req, HttpRe + + try { + if (!req.complete) { +- L<writenWithTimeout(reply.c_str(), reply.size(), timeout); + } + catch(PDNSException &e) { +- L<d_local.toStringWithPort()<d_local.toStringWithPort()<getRemote(remote)) +- L<