def _doURL(self, url, method="GET", content_type=None, role=None, *args, **kwargs):
        headers = self.get_default_headers()
        if 'headers' in kwargs:
            headers.update(kwargs['headers'])

        if content_type is not None:
            headers['Content-Type'] = content_type

        if role is not None:
            headers['SAM-Role'] = str(role)
        
        kwargs['headers'] = headers

        if self.socket_timeout is not None:
            kwargs['timeout'] = self.socket_timeout

        self._logMethod( method, url, params=kwargs.get("params"), data=kwargs.get("data"))

        self._make_session()

        tmout = time.time() + self.maxtimeout
        retryinterval = 1

        while True:
            try:
                response = self._session.request(method, url, *args, **kwargs)
                if response.history:
                    # if multiple redirects just report the last one
                    self._logger("HTTP", response.history[-1].status_code, "redirect to", response.url)
                if 200 <= response.status_code < 300:
                    return response
                else:
                    # something went wrong
                    if 'application/json' in response.headers['Content-Type']:
                        jsonerr = response.json()
                        errmsg = jsonerr['message']
                        errtype = jsonerr['error']
                    else:
                        if response.status_code >= 500:
                            errmsg = "HTTP error: %d %s" % (response.status_code, response.reason)
                        else:
                            errmsg = response.text.rstrip()
                        errtype = None
                    exc = makeHTTPError(response.request.method, url, response.status_code, errmsg, errtype)
                    if 400 <= response.status_code < 500:
                        # For any 400 error, don't bother retrying
                        raise exc
            except requests.exceptions.SSLError, ex:
                errmsg = str(ex.message)
                raise self.make_ssl_error(errmsg)
            except requests.exceptions.Timeout, ex:
                errmsg = "%s: Timed out waiting for response" % (url,)
                exc = SAMWebConnectionError(errmsg)
Example #2
0
    def _doURL(self,
               url,
               method="GET",
               content_type=None,
               role=None,
               *args,
               **kwargs):
        headers = self.get_default_headers()
        if 'headers' in kwargs:
            headers.update(kwargs['headers'])

        if content_type is not None:
            headers['Content-Type'] = content_type

        if role is not None:
            headers['SAM-Role'] = str(role)

        kwargs['headers'] = headers

        if self.socket_timeout is not None:
            kwargs['timeout'] = self.socket_timeout

        self._logMethod(method,
                        url,
                        params=kwargs.get("params"),
                        data=kwargs.get("data"))

        self._make_session()

        tmout = time.time() + self.maxtimeout
        retryinterval = 1

        while True:
            try:
                response = self._session.request(method, url, *args, **kwargs)
                if response.history:
                    # if multiple redirects just report the last one
                    self._logger("HTTP", response.history[-1].status_code,
                                 "redirect to", response.url)
                if 200 <= response.status_code < 300:
                    return response
                else:
                    # something went wrong
                    if 'application/json' in response.headers['Content-Type']:
                        jsonerr = response.json()
                        errmsg = jsonerr['message']
                        errtype = jsonerr['error']
                    else:
                        if response.status_code >= 500:
                            errmsg = "HTTP error: %d %s" % (
                                response.status_code, response.reason)
                        else:
                            errmsg = response.text.rstrip()
                        errtype = None
                    exc = makeHTTPError(response.request.method, url,
                                        response.status_code, errmsg, errtype)
                    if 400 <= response.status_code < 500:
                        # For any 400 error, don't bother retrying
                        raise exc
            except requests.exceptions.SSLError, ex:
                errmsg = str(ex.message)
                raise self.make_ssl_error(errmsg)
            except requests.exceptions.Timeout, ex:
                errmsg = "%s: Timed out waiting for response" % (url, )
                exc = SAMWebConnectionError(errmsg)
Example #3
0
    def _doURL(self,
               url,
               method='GET',
               params=None,
               data=None,
               content_type=None,
               stream=False,
               headers=None,
               role=None):
        request_headers = self.get_default_headers()
        if headers is not None:
            request_headers.update(headers)
        if content_type:
            request_headers['Content-Type'] = content_type

        if role is not None:
            request_headers['SAM-Role'] = str(role)

        if method in ('POST', 'PUT'):
            # these always require body data
            if data is None:
                data = ''

        self._logMethod(method, url, params=params, data=data)

        if data is not None and not isinstance(data, basestring):
            data = urlencode(data, doseq=True)

        if params is not None:
            if '?' not in url: url += '?'
            else: url += '&'
            url += urlencode(params, doseq=True)
        tmout = time.time() + self.maxtimeout
        retryinterval = 1

        request = RequestWithMethod(url,
                                    method=method,
                                    headers=request_headers,
                                    logger=self._logger)
        if data is not None:
            request.add_data(data)
        kwargs = {}
        if self.socket_timeout is not None:
            kwargs['timeout'] = self.socket_timeout
        while True:
            try:
                return Response(self._opener.open(request, **kwargs),
                                stream=stream)
            except HTTPError, x:
                #python 2.4 treats 201 and up as errors instead of normal return codes
                if 201 <= x.code <= 299:
                    return Response(x)
                if x.headers.get('Content-Type') == 'application/json':
                    err = json.load(x)
                    errmsg = err['message']
                    errtype = err['error']
                else:
                    if x.code >= 500:
                        errmsg = "HTTP error: %d %s" % (x.code, x.msg)
                    else:
                        errmsg = x.read().rstrip()
                    errtype = None
                x.close(
                )  # ensure that the socket is closed (otherwise it may hang around in the traceback object)
                # retry server errors
                if x.code >= 500 and time.time() < tmout:
                    pass
                else:
                    raise makeHTTPError(method, url, x.code, errmsg, errtype)
            except URLError, x:
                if isinstance(x.reason, socket.sslerror):
                    raise self.make_ssl_error(str(x.reason))
                else:
                    errmsg = str(x.reason)
                if time.time() >= tmout:
                    raise SAMWebConnectionError(errmsg)
    def _doURL(self, url, method='GET', params=None, data=None, content_type=None, stream=False, headers=None,role=None):
        request_headers = self.get_default_headers()
        if headers is not None:
            request_headers.update(headers)
        if content_type:
            request_headers['Content-Type'] = content_type

        if role is not None:
            request_headers['SAM-Role'] = str(role)

        if method in ('POST', 'PUT'):
            # these always require body data
            if data is None:
                data = ''

        self._logMethod(method, url, params=params, data=data)

        if data is not None and not isinstance(data, basestring):
            data = urlencode(data, doseq=True)

        if params is not None:
            if '?' not in url: url += '?'
            else: url += '&'
            url += urlencode(params, doseq=True)
        tmout = time.time() + self.maxtimeout
        retryinterval = 1

        request = RequestWithMethod(url, method=method, headers=request_headers, logger=self._logger)
        if data is not None:
            request.add_data(data)
        kwargs = {}
        if self.socket_timeout is not None:
            kwargs['timeout'] = self.socket_timeout
        while True:
            try:
                return Response(self._opener.open(request, **kwargs), stream=stream)
            except HTTPError, x:
                #python 2.4 treats 201 and up as errors instead of normal return codes
                if 201 <= x.code <= 299:
                    return Response(x)
                if x.headers.get('Content-Type') == 'application/json':
                    err = json.load(x)
                    errmsg = err['message']
                    errtype = err['error']
                else:
                    if x.code >= 500:
                        errmsg = "HTTP error: %d %s" % (x.code, x.msg)
                    else:
                        errmsg = x.read().rstrip()
                    errtype = None
                x.close() # ensure that the socket is closed (otherwise it may hang around in the traceback object)
                # retry server errors
                if x.code >= 500 and time.time() < tmout:
                    pass
                else:
                    raise makeHTTPError(method, url, x.code, errmsg, errtype)
            except URLError, x:
                if isinstance(x.reason, socket.sslerror):
                    raise self.make_ssl_error(str(x.reason))
                else:
                    errmsg = str(x.reason)
                if time.time() >= tmout:
                    raise SAMWebConnectionError(errmsg)