'Do one fetch'

@gen.coroutine
def async_fetch(self, task, callback=None):

    url = task.get(u'url', u'data:,')
    if (callback is None):
        callback = self.send_result
    type = u'None'
    start_time = time.time()
    try:
        if url.startswith(u'data:'):
            type = u'data'
            result = (yield gen.maybe_future(self.data_fetch(url, task)))
        elif (task.get(u'fetch', {}).get(u'fetch_type') in (u'js', u'phantomjs')):
            type = u'phantomjs'
            result = (yield self.phantomjs_fetch(url, task))
        elif (task.get(u'fetch', {}).get(u'fetch_type') in (u'splash',)):
            type = u'splash'
            result = (yield self.splash_fetch(url, task))
        else:
            type = u'http'
            result = (yield self.http_fetch(url, task))
    except Exception as e:
        logger.exception(e)
        result = self.handle_error(type, url, task, start_time, e)
    callback(type, task, result)
    self.on_result(type, task, result)
    raise gen.Return(result)
