DNS query using Google App Engine socket

2019-04-04 19:11发布

I'm trying to use the new socket support for Google App Engine in order to perform some DNS queries. I'm using dnspython to perform the query, and the code works fine outside GAE.

The code is the following:

class DnsQuery(webapp2.RequestHandler):

    def get(self):
       domain  = self.request.get('domain')
       logging.info("Test Query for "+domain)
       answers = dns.resolver.query(domain, 'TXT', tcp=True)
       logging.info("DNS OK")
       for rdata in answers:
          rc =  str(rdata.exchange).lower()
          logging.info("Record "+rc)

When I run in GAE I get the following error:

  File "/base/data/home/apps/s~/one.366576281491296772/main.py", line 37, in post
    return self.get()   
  File "/base/data/home/apps/s~/one.366576281491296772/main.py", line 41, in get
    answers = dns.resolver.query(domain, 'TXT', tcp=True)
  File "/base/data/home/apps/s~/one.366576281491296772/dns/resolver.py", line 976, in query
    raise_on_no_answer, source_port)
  File "/base/data/home/apps/s~/one.366576281491296772/dns/resolver.py", line 821, in query
    timeout = self._compute_timeout(start)
  File "/base/data/home/apps/s~/one.366576281491296772/dns/resolver.py", line 735, in _compute_timeout
    raise Timeout

Which is raised by dnspython when no answer is returned within the time limit. I've raised the timelimit to 60 seconds, and DnsQuery is a task, but still getting the same error.

Is there any limitation in Google App Engine socket implementation, which prevents the execution of DNS requests ?

3条回答
神经病院院长
2楼-- · 2019-04-04 19:53

This is a bug and will be fixed ASAP.

As a workaround, pass in the source='' argument to dns.resolver.query.

tcp=True is not necessary.

查看更多
趁早两清
3楼-- · 2019-04-04 19:53

No. There is no limit on UDP ports. (only smtp ports on TCP).

It is possible there is an issue with the socket service routing. Please file an issue with the app engine issue tracker. https://code.google.com/p/googleappengine/issues/list

查看更多
走好不送
4楼-- · 2019-04-04 19:56

dnspython is using socket. However, socket is only available in paid apps.1

查看更多
登录 后发表回答