Подтвердить что ты не робот

DNS-запрос с использованием приложения Google App Engine

Я пытаюсь использовать поддержку нового сокета для Google App Engine для выполнения некоторых DNS-запросов. Я использую dnspython для выполнения запроса, и код отлично работает вне GAE.

Код следующий:

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)

Когда я запускаю в GAE, я получаю следующую ошибку:

  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

Что вызвано dnspython, когда ответ не возвращается в течение срока. Я повысил timelimit до 60 секунд, а DnsQuery - задача, но все равно получаю ту же ошибку.

Есть ли какое-либо ограничение в реализации сокета приложений Google App Engine, которое предотвращает выполнение запросов DNS?

4b9b3361

Ответ 1

Это ошибка и будет исправлена ​​как можно скорее.

Как обходной путь, передайте аргумент source = '' в dns.resolver.query.

tcp = True не требуется.

Ответ 2

Нет. На UDP-портах нет ограничений. (только порты smtp на TCP).

Возможно, возникла проблема с маршрутизацией службы сокетов. Пожалуйста, зарегистрируйте проблему с отслеживателем проблем с движком приложения. https://code.google.com/p/googleappengine/issues/list

Ответ 3

dnspython использует socket. Однако сокет доступен только в платных приложениях. 1