code: def urlfetch_async(self, url, method='GET', headers=None,
                       payload=None, deadline=None, callback=None,
                       follow_redirects=False):
      
      headers = {} if headers is None else dict(headers)
      headers.update(self.user_agent)
      try:
        self.token = yield self.get_token_async()
      except app_identity.InternalError, e:
        if os.environ.get('DATACENTER', '').endswith('sandman'):
          self.token = None
          logging.warning('Could not fetch an authentication token in sandman '
                       'based Appengine devel setup; proceeding without one.')
        else:
          raise e
      if self.token:
        headers['authorization'] = 'OAuth ' + self.token
  
      deadline = deadline or self.retry_params.urlfetch_timeout
  
      ctx = ndb.get_context()
      resp = yield ctx.urlfetch(
          url, payload=payload, method=method,
          headers=headers, follow_redirects=follow_redirects,
          deadline=deadline, callback=callback)
      raise ndb.Return(resp)
docs: Make an async urlfetch() call.
  
      This is an async wrapper around urlfetch(). It adds an authentication
      header.
  
      Args:
        url: the url to fetch.
        method: the method in which to fetch.
        headers: the http headers.
        payload: the data to submit in the fetch.
        deadline: the deadline in which to make the call.
        callback: the call to make once completed.
        follow_redirects: whether or not to follow redirects.
  
      Yields:
        This returns a Future despite not being decorated with @ndb.tasklet!