Exemplo n.º 1
0
    def request(self,
                method,
                endpoint,
                data=None,
                permissions=None,
                payload=None,
                **kwargs):
        parsed = urlparse(endpoint)
        if not parsed.scheme:
            actual_url = utils.urljoin(self.server_url, endpoint)
        else:
            actual_url = endpoint

        if self.auth is not None:
            kwargs.setdefault('auth', self.auth)

        payload = payload or {}
        # if data is not None:
        payload['data'] = data or {}
        if permissions is not None:
            if hasattr(permissions, 'as_dict'):
                permissions = permissions.as_dict()
            payload['permissions'] = permissions
        if payload and method not in ('get', 'head'):
            payload_kwarg = 'data' if 'files' in kwargs else 'json'
            kwargs.setdefault(payload_kwarg, payload)

        retry = self.nb_retry
        while retry >= 0:
            resp = requests.request(method, actual_url, **kwargs)
            retry = retry - 1
            if not (200 <= resp.status_code < 400):
                if resp.status_code >= 500 and retry >= 0:
                    # Wait and try again.
                    # If not forced, use retry-after header and wait.
                    if self.retry_after is None:
                        retry_after = resp.headers.get("Retry-After", 0)
                    else:
                        retry_after = self.retry_after
                    time.sleep(retry_after)
                    continue

                # Retries exhausted, raise expection.
                message = '{0} - {1}'.format(resp.status_code, resp.json())
                exception = KintoException(message)
                exception.request = resp.request
                exception.response = resp
                raise exception

        if resp.status_code == 304:
            body = None
        else:
            body = resp.json()
        # XXX Add the status code.
        return body, resp.headers
Exemplo n.º 2
0
    def request(self, method, endpoint, data=None, permissions=None,
                payload=None, **kwargs):
        parsed = urlparse(endpoint)
        if not parsed.scheme:
            actual_url = utils.urljoin(self.server_url, endpoint)
        else:
            actual_url = endpoint

        if self.auth is not None:
            kwargs.setdefault('auth', self.auth)

        payload = payload or {}
        # if data is not None:
        payload['data'] = data or {}
        if permissions is not None:
            if hasattr(permissions, 'as_dict'):
                permissions = permissions.as_dict()
            payload['permissions'] = permissions
        if payload and method not in ('get', 'head'):
            payload_kwarg = 'data' if 'files' in kwargs else 'json'
            kwargs.setdefault(payload_kwarg, payload)

        retry = self.nb_retry
        while retry >= 0:
            resp = requests.request(method, actual_url, **kwargs)
            retry = retry - 1
            if not (200 <= resp.status_code < 400):
                if resp.status_code >= 500 and retry >= 0:
                    # Wait and try again.
                    # If not forced, use retry-after header and wait.
                    if self.retry_after is None:
                        retry_after = resp.headers.get("Retry-After", 0)
                    else:
                        retry_after = self.retry_after
                    time.sleep(retry_after)
                    continue

                # Retries exhausted, raise expection.
                message = '{0} - {1}'.format(resp.status_code, resp.json())
                exception = KintoException(message)
                exception.request = resp.request
                exception.response = resp
                raise exception

        if resp.status_code == 304:
            body = None
        else:
            body = resp.json()
        # XXX Add the status code.
        return body, resp.headers
Exemplo n.º 3
0
 def send(self):
     result = []
     requests = self._build_requests()
     for chunk in utils.chunks(requests, self.batch_max_requests):
         kwargs = dict(method="POST", endpoint=self.endpoints.get("batch"), payload={"requests": chunk})
         resp, headers = self.session.request(**kwargs)
         for i, response in enumerate(resp["responses"]):
             status_code = response["status"]
             if not (200 <= status_code < 400):
                 message = "{0} - {1}".format(status_code, response["body"])
                 exception = KintoException(message)
                 exception.request = chunk[i]
                 exception.response = response
                 raise exception
         result.append((resp, headers))
     return result
Exemplo n.º 4
0
    def test_synchronize_raises_SynchronizationError_if_create_fails(self):
        error = KintoException()
        error.response = mock.MagicMock(content='foobar')

        with mock.patch('xml2kinto.synchronize.KintoRecords') as KintoRecords:
            KintoRecords.return_value.records = []
            KintoRecords.return_value.find.return_value = None
            KintoRecords.return_value.create.side_effect = error

            here = os.path.dirname(__file__)
            test_file = os.path.join(here, 'test_synchronize.xml')

            with pytest.raises(SynchronizationError):
                synchronize(FIELDS,
                            xml_options={'filename': test_file},
                            kinto_options=mock.MagicMock())
Exemplo n.º 5
0
 def send(self):
     result = []
     requests = self._build_requests()
     for chunk in utils.chunks(requests, self.batch_max_requests):
         kwargs = dict(method='POST',
                       endpoint=self.endpoints.get('batch'),
                       payload={'requests': chunk})
         resp, headers = self.session.request(**kwargs)
         for i, response in enumerate(resp['responses']):
             status_code = response['status']
             if not (200 <= status_code < 400):
                 message = '{0} - {1}'.format(status_code, response['body'])
                 exception = KintoException(message)
                 exception.request = chunk[i]
                 exception.response = response
                 raise exception
         result.append((resp, headers))
     return result
Exemplo n.º 6
0
 def send(self):
     result = []
     requests = self._build_requests()
     for chunk in utils.chunks(requests, self.batch_max_requests):
         kwargs = dict(method='POST',
                       endpoint=self.endpoints.get('batch'),
                       payload={'requests': chunk})
         resp, headers = self.session.request(**kwargs)
         for i, response in enumerate(resp['responses']):
             status_code = response['status']
             if not (200 <= status_code < 400):
                 message = '{0} - {1}'.format(status_code, response['body'])
                 exception = KintoException(message)
                 exception.request = chunk[i]
                 exception.response = response
                 raise exception
         result.append((resp, headers))
     return result
Exemplo n.º 7
0
    def get(self, endpoint, **kwargs):
        # Remove nullable values from the kwargs, and slugify the values.
        kwargs = dict((k, utils.slugify(v)) for k, v in iteritems(kwargs) if v)

        try:
            pattern = self.endpoints[endpoint]
            return pattern.format(root=self._root, **kwargs)
        except KeyError as e:
            msg = "Cannot get {endpoint} endpoint, {field} is missing"
            raise KintoException(
                msg.format(endpoint=endpoint, field=','.join(e.args)))
Exemplo n.º 8
0
def get_http_error(status):
    exception = KintoException()
    exception.response = mock.MagicMock()
    exception.response.status_code = status
    exception.request = mock.sentinel.request
    return exception
Exemplo n.º 9
0
def get_http_error(status):
    exception = KintoException()
    exception.response = mock.MagicMock()
    exception.response.status_code = status
    exception.request = mock.sentinel.request
    return exception