Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion slumber/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,12 @@ def _request(self, method, data=None, files=None, params=None):
resp = self._store["session"].request(method, url, data=data, params=params, files=files, headers=headers)

if 400 <= resp.status_code <= 499:
exception_class = exceptions.HttpNotFoundError if resp.status_code == 404 else exceptions.HttpClientError
if resp.status_code == 404:
exception_class = exceptions.HttpNotFoundError
elif resp.status_code == 429:
exception_class = exceptions.HttpTooManyRequestsError
else:
exception_class = exceptions.HttpClientError
raise exception_class("Client Error %s: %s" % (resp.status_code, url), response=resp, content=resp.content)
elif 500 <= resp.status_code <= 599:
raise exceptions.HttpServerError("Server Error %s: %s" % (resp.status_code, url), response=resp, content=resp.content)
Expand Down
8 changes: 7 additions & 1 deletion slumber/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .utils import url_join, iterator
from .utils import iterator


class SlumberBaseException(Exception):
Expand Down Expand Up @@ -30,6 +30,12 @@ class HttpNotFoundError(HttpClientError):
"""


class HttpTooManyRequestsError(HttpClientError):
"""
Called when the server sends a 429 error.
"""


class HttpServerError(SlumberHttpBaseException):
"""
Called when the server tells us there was a server error (5xx).
Expand Down
2 changes: 1 addition & 1 deletion tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import os.path
import unittest


def get_tests():
return full_suite()


def full_suite():
from .resource import ResourceTestCase
from .serializer import ResourceTestCase as SerializerTestCase
Expand Down
16 changes: 15 additions & 1 deletion tests/resource.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*-
import sys
import mock
import requests
import slumber
Expand Down Expand Up @@ -419,6 +418,21 @@ def test_get_404_response(self):
with self.assertRaises(exceptions.HttpNotFoundError):
self.base_resource.req._request("GET")

def test_get_429_response(self):
r = mock.Mock(spec=requests.Response)
r.status_code = 429
r.headers = {"content-type": "application/json"}
r.content = ''

self.base_resource._store.update({
"session": mock.Mock(spec=requests.Session),
"serializer": slumber.serialize.Serializer(),
})
self.base_resource._store["session"].request.return_value = r

with self.assertRaises(exceptions.HttpTooManyRequestsError):
self.base_resource.req._request("GET")

def test_get_500_response(self):
r = mock.Mock(spec=requests.Response)
r.status_code = 500
Expand Down