'Executes a request, asynchronously returning an `HTTPResponse`.
The request may be either a string URL or an `HTTPRequest` object.
If it is a string, we construct an `HTTPRequest` using any additional
kwargs: ``HTTPRequest(request, **kwargs)``
This method returns a `.Future` whose result is an
`HTTPResponse`. By default, the ``Future`` will raise an
`HTTPError` if the request returned a non-200 response code
(other errors may also be raised if the server could not be
contacted). Instead, if ``raise_error`` is set to False, the
response will always be returned regardless of the response
code.
If a ``callback`` is given, it will be invoked with the `HTTPResponse`.
In the callback interface, `HTTPError` is not automatically raised.
Instead, you must check the response\'s ``error`` attribute or
call its `~HTTPResponse.rethrow` method.'

def fetch(self, request, callback=None, raise_error=True, **kwargs):

    if self._closed:
        raise RuntimeError('fetch()    called    on    closed    AsyncHTTPClient')
    if (not isinstance(request, HTTPRequest)):
        request = HTTPRequest(url=request, **kwargs)
    elif kwargs:
        raise ValueError("kwargs    can't    be    used    if    request    is    an    HTTPRequest    object")
    request.headers = httputil.HTTPHeaders(request.headers)
    request = _RequestProxy(request, self.defaults)
    future = TracebackFuture()
    if (callback is not None):
        callback = stack_context.wrap(callback)
        def handle_future(future):
            exc = future.exception()
            if (isinstance(exc, HTTPError) and (exc.response is not None)):
                response = exc.response
            elif (exc is not None):
                response = HTTPResponse(request, 599, error=exc, request_time=(time.time() - request.start_time))
            else:
                response = future.result()
            self.io_loop.add_callback(callback, response)
        future.add_done_callback(handle_future)
    def handle_response(response):
        if (raise_error and response.error):
            future.set_exception(response.error)
        else:
            future.set_result(response)
    self.fetch_impl(request, handle_response)
    return future
