<div dir="ltr"><div><span lang="en"><span>Finally</span> <span>I found the</span> <span>cause of the problem. PowerDNS Remote HTTP Backend works only with 'Content-Length' header.<br><br></span></span></div><div><span lang="en"><span>So, the following code works until</span></span><span lang="en"><span><span lang="en"><span> 'Content-Length' header exists.</span></span> </span></span></div><div><span lang="en"><span><br><br>import BaseHTTPServer<br><br>class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):<br>    def do_GET(self):<br>        if self.path == '/dns/lookup/<a href="http://example.com/SOA">example.com/SOA</a>':<br>             self.wfile.write('HTTP/1.1 200 OK\r\nContent-Length: 145\r\n\r\n{"result":[{"qtype":"SOA","qname":"<a href="http://example.com">example.com</a>","content":"<a href="http://dns1.icann.org">dns1.icann.org</a>. <a href="http://hostmaster.icann.org">hostmaster.icann.org</a>. 2012080849 7200 3600 1209600 3600","ttl":3600}]}')<br><br>if __name__ == '__main__':<br>    server = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), HTTPRequestHandler)<br>    server.serve_forever()<br></span></span></div><span lang="en"><span><br></span></span><div><div><span lang="en"><span><br></span></span></div><div><span lang="en"><span>I don't know whether this is bug in </span></span>YaHTTP client used by <span lang="en"><span>PowerDNS or </span></span><span lang="en"><span>expected behavior. But p</span></span><span lang="en"><span><span lang="en"><span>lease</span><span> add</span> <span>a note</span> <span>to the documentation.</span></span><br></span></span><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 8, 2016 at 11:25 PM, Aleksey Chudov <span dir="ltr"><<a href="mailto:aleksey.chudov@gmail.com" target="_blank">aleksey.chudov@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Some more information.<br></div><div><br>I have tested pdns-static_3.4.7-1_amd64.deb on Debian and pdns-3.4.7-1.el7.x86_64 + pdns-backend-remote-3.4.7-1.el7.x86_64 on CentOS 7.2 with no success.<br><br></div><div>Also I have tried manually reply to pdns request using netcat utility. As can be seen pdns sends next request just after headers + newline <span lang="en"><span>without waiting for</span> <span>the body.</span></span><br><br><br># grep -Ev '^$|^#' /etc/powerdns/pdns.conf              <br>launch=remote<br>remote-connection-string=http:url=<a href="http://127.0.0.1:8080/dns,timeout=60000" target="_blank">http://127.0.0.1:8080/dns,timeout=60000</a><br>cache-ttl=0<br>negquery-cache-ttl=0<br>query-cache-ttl=0<span><br><br><br># dig @<a href="http://127.0.0.1" target="_blank">127.0.0.1</a> <a href="http://example.com" target="_blank">example.com</a>. SOA         <br><br></span>; <<>> DiG 9.7.3 <<>> @<a href="http://127.0.0.1" target="_blank">127.0.0.1</a> <a href="http://example.com" target="_blank">example.com</a>. SOA<span><br>; (1 server found)<br>;; global options: +cmd<br>;; Got answer:<br></span>;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 59226<br>;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0<span><br>;; WARNING: recursion requested but not available<br><br></span><span>;; QUESTION SECTION:<br>;<a href="http://example.com" target="_blank">example.com</a>.                   IN      SOA<br><br></span>;; Query time: 0 msec<br>;; SERVER: 127.0.0.1#53(127.0.0.1)<br>;; WHEN: Fri Jan  8 23:22:47 2016<br>;; MSG SIZE  rcvd: 29<br><br><br># netcat -l 127.0.0.1 -p 8080<br>GET /dns/lookup/<a href="http://example.com/SOA" target="_blank">example.com/SOA</a> HTTP/1.1<br>Accept: application/json<br>Connection: Keep-Alive<br>Host: 127.0.0.1<br>User-Agent: YaHTTP v1.0<br>X-Remotebackend-Local: 0.0.0.0<br>X-Remotebackend-Real-Remote: <a href="http://127.0.0.1/32" target="_blank">127.0.0.1/32</a><br>X-Remotebackend-Remote: 127.0.0.1<br>X-Remotebackend-Zone-Id: -1<br><br>HTTP/1.1 200 OK<br>Content-Type: text/javascript; charset=utf-8<br><br>GET /dns/lookup/com/SOA HTTP/1.1<br>Accept: application/json<br>Connection: Keep-Alive<br>Host: 127.0.0.1<br>User-Agent: YaHTTP v1.0<br>X-Remotebackend-Local: 0.0.0.0<br>X-Remotebackend-Real-Remote: <a href="http://127.0.0.1/32" target="_blank">127.0.0.1/32</a><br>X-Remotebackend-Remote: 127.0.0.1<br>X-Remotebackend-Zone-Id: -1   <br></div><div><br><br></div><div><span lang="en"><span>Is this</span> <span>a bug</span> <span>or am I</span> <span>missing something</span><span>?</span></span><br></div><div><div><div><div><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 8, 2016 at 11:42 AM, Aleksey Chudov <span dir="ltr"><<a href="mailto:aleksey.chudov@gmail.com" target="_blank">aleksey.chudov@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div><div><div><div>Hi,<br><br></div>I'm trying to implement simple PowerDNS Remote HTTP Backend in Python. Below is test code just like <a href="https://doc.powerdns.com/md/authoritative/backend-remote/#scenario-soa-lookup-with-http-connector" target="_blank">https://doc.powerdns.com/md/authoritative/backend-remote/#scenario-soa-lookup-with-http-connector</a><br></div><br><br>import BaseHTTPServer<br><br>REPLY = """{<br>  "result":<br>   [<br>     { "qtype": "SOA",<br>       "qname": "<a href="http://example.com" target="_blank">example.com</a>",<br>       "content": "<a href="http://dns1.icann.org" target="_blank">dns1.icann.org</a>. <a href="http://hostmaster.icann.org" target="_blank">hostmaster.icann.org</a>. <a href="tel:2012080849" value="+12012080849" target="_blank">2012080849</a> 7200 3600 1209600 3600",<br>       "ttl": 3600,<br>       "domain_id": -1<br>     }<br>   ]<br>}"""<br><br>class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):<br>    def do_GET(self):<br>        if self.path == '/dns/lookup/<a href="http://example.com/SOA" target="_blank">example.com/SOA</a>':<br>            self.send_response(200)<br>            self.send_header('Content-Type', 'text/javascript; charset=utf-8')<br>            self.end_headers()<br>            self.wfile.write(REPLY + '\r\n')<br>        else:<br>            self.send_error(501)<br><br>if __name__ == '__main__':<br>    server = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), HTTPRequestHandler)<br>    server.serve_forever()<br><br><br></div>Looks pretty simple. And curl shows the result.<br><br><br># curl -i <a href="http://127.0.0.1:8080/dns/lookup/example.com/SOA" target="_blank">http://127.0.0.1:8080/dns/lookup/example.com/SOA</a><br>HTTP/1.0 200 OK<br>Server: BaseHTTP/0.3 Python/2.7.5<br>Date: Fri, 08 Jan 2016 09:24:54 GMT<br>Content-Type: text/javascript; charset=utf-8<br><br>{<br>  "result":<br>   [<br>     { "qtype": "SOA",<br>       "qname": "<a href="http://example.com" target="_blank">example.com</a>",<br>       "content": "<a href="http://dns1.icann.org" target="_blank">dns1.icann.org</a>. <a href="http://hostmaster.icann.org" target="_blank">hostmaster.icann.org</a>. <a href="tel:2012080849" value="+12012080849" target="_blank">2012080849</a> 7200 3600 1209600 3600",<br>       "ttl": 3600,<br>       "domain_id": -1<br>     }<br>   ]<br>}<br><br></div><div>And Python script prints<br><br>127.0.0.1 - - [08/Jan/2016 11:36:31] "GET /dns/lookup/<a href="http://example.com/SOA" target="_blank">example.com/SOA</a> HTTP/1.1" 200 -<br></div><div><br><br></div><div>So, I've installed PoweDNS from CentOS 7 Epel repository<br><br># rpm -qa pdns\*<br>pdns-3.4.7-1.el7.x86_64<br>pdns-backend-remote-3.4.7-1.el7.x86_64<br></div><div><br><br></div><div>And my configuration file contains only the following settings<br><br># grep -Ev '^#|^$' /etc/pdns/pdns.conf <br>setuid=pdns<br>setgid=pdns<br>launch=remote<br>remote-connection-string=http:url=<a href="http://127.0.0.1:8080/dns" target="_blank">http://127.0.0.1:8080/dns</a><br>cache-ttl=0<br>negquery-cache-ttl=0<br>query-cache-ttl=0<br></div><div><br><br></div><div>But my remote backend does not work!<br><br><br># dig @<a href="http://127.0.0.1" target="_blank">127.0.0.1</a> <a href="http://example.com" target="_blank">example.com</a>. SOA<br><br>; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.1 <<>> @<a href="http://127.0.0.1" target="_blank">127.0.0.1</a> <a href="http://example.com" target="_blank">example.com</a>. SOA<br>; (1 server found)<br>;; global options: +cmd<br>;; Got answer:<br>;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 5375<br>;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1<br>;; WARNING: recursion requested but not available<br><br>;; OPT PSEUDOSECTION:<br>; EDNS: version: 0, flags:; udp: 1680<br>;; QUESTION SECTION:<br>;<a href="http://example.com" target="_blank">example.com</a>.                   IN      SOA<br><br>;; Query time: 2 msec<br>;; SERVER: 127.0.0.1#53(127.0.0.1)<br>;; WHEN: Fri Jan 08 11:38:05 EET 2016<br>;; MSG SIZE  rcvd: 40<br><br></div><div><br></div><div>There is no new messages from pdns_server<br><br># systemctl status pdns.service   <br>● pdns.service - PowerDNS Authoritative Server<br>   Loaded: loaded (/usr/lib/systemd/system/pdns.service; enabled; vendor preset: disabled)<br>   Active: active (running) since Fri 2016-01-08 11:37:50 EET; 18s ago<br>  Process: 1581 ExecStop=/usr/bin/pdns_control quit (code=exited, status=0/SUCCESS)<br>  Process: 1586 ExecStart=/usr/sbin/pdns_server --daemon (code=exited, status=0/SUCCESS)<br> Main PID: 1587 (pdns_server)<br>   CGroup: /system.slice/pdns.service<br>           └─1587 /usr/sbin/pdns_server --daemon<br><br>Jan 08 11:37:50 localhost pdns[1587]: Listening on controlsocket in '/var/run/pdns.controlsocket'<br>Jan 08 11:37:50 localhost systemd[1]: Started PowerDNS Authoritative Server.<br>Jan 08 11:37:50 localhost pdns[1587]: UDP server bound to <a href="http://0.0.0.0:53" target="_blank">0.0.0.0:53</a><br>Jan 08 11:37:50 localhost pdns[1587]: TCP server bound to <a href="http://0.0.0.0:53" target="_blank">0.0.0.0:53</a><br>Jan 08 11:37:51 localhost pdns[1587]: PowerDNS Authoritative Server 3.4.7 (<a href="mailto:jenkins@autotest.powerdns.com" target="_blank">jenkins@autotest.powerdns.com</a>) (C) 2001-2015 PowerDNS.COM BV<br>Jan 08 11:37:51 localhost pdns[1587]: Using 64-bits mode. Built on 20151108152440 by <a href="mailto:mockbuild@buildvm-19.phx2.fedoraproject.org" target="_blank">mockbuild@buildvm-19.phx2.fedoraproject.org</a>, gcc 4.8.3 20140911 (Red Hat 4.8.3-9).<br>Jan 08 11:37:51 localhost pdns[1587]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.<br>Jan 08 11:37:51 localhost pdns[1587]: Creating backend connection for TCP<br>Jan 08 11:37:51 localhost pdns[1587]: About to create 3 backend threads for UDP<br>Jan 08 11:37:51 localhost pdns[1587]: Done launching threads, ready to distribute questions<br><br><br>But Python prints<br><br>127.0.0.1 - - [08/Jan/2016 11:38:05] "GET /dns/lookup/<a href="http://example.com/SOA" target="_blank">example.com/SOA</a> HTTP/1.1" 200 -<br>127.0.0.1 - - [08/Jan/2016 11:38:05] code 501, message Not Implemented<br>127.0.0.1 - - [08/Jan/2016 11:38:05] "GET /dns/lookup/com/SOA HTTP/1.1" 501 -<br>127.0.0.1 - - [08/Jan/2016 11:38:05] code 501, message Not Implemented<br>127.0.0.1 - - [08/Jan/2016 11:38:05] "GET /dns/lookup//SOA HTTP/1.1" 501 -<br><br><br></div><div><span lang="en"><span>Where</span> <span>am I wrong?</span></span></div><div><br><br></div>Regards,<br></div>Aleksey<br></div>
</blockquote></div><br></div></div></div></div></div></div></div>
</blockquote></div><br></div></div></div></div>