Issue the request.

        Uses httplib2.Http support for handling redirects.  Returns an
        httplib2.Response, which may be augmented by the
        proc_response() method.

        Note that the default implementation of proc_response() causes
        an appropriate exception to be raised if the response code is
        >= 400.

def send(self):
        """Issue the request.

        Uses httplib2.Http support for handling redirects.  Returns an
        httplib2.Response, which may be augmented by the
        proc_response() method.

        Note that the default implementation of proc_response() causes
        an appropriate exception to be raised if the response code is
        >= 400.
        """

        # Pre-process the request
        try:
            self.procstack.proc_request(self)
        except exc.ShortCircuit, e:
            self._debug("Request pre-processing short-circuited")

            # Short-circuited; we have an (already processed) response
            return e.response

        self._debug("Sending %r request to %r (body %r, headers %r)",
                    self.method, self.url, self.body, self.headers)

        # Issue the request
        (resp, content) = self.client.request(self.url, self.method,
                                              self.body, self.headers,
                                              self.max_redirects)

        # Save the body in the response
        resp.body = content

        # Do any processing on the response that's desired
        try:
            self.proc_response(resp)
        except:
            # Process the exception
            result = self.procstack.proc_exception(*sys.exc_info())
            if not result:
                # Not handled, re-raise it
                raise
            else:
                # Handled and we have a fully post-processed response
                return result

        # Return the response, post-processing it
        return self.procstack.proc_response(resp)