Skip to content

Commit 33d7d59

Browse files
Sam Parkdlitvakb
authored andcommitted
Add timeouts to requests calls (contentful#46)
Fixes contentful#45
1 parent 8d875f5 commit 33d7d59

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

contentful/client.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class Client(object):
5252
:param reuse_entries: (optional) Boolean determining wether to reuse
5353
hydrated Entry and Asset objects within the same request when possible.
5454
Defaults to False
55+
:param timeout_s: (optional) Max time allowed for each API call, in seconds.
56+
Defaults to 1s.
5557
:param proxy_host: (optional) URL for Proxy, defaults to None.
5658
:param proxy_port: (optional) Port for Proxy, defaults to None.
5759
:param proxy_username: (optional) Username for Proxy, defaults to None.
@@ -93,6 +95,7 @@ def __init__(
9395
raise_errors=True,
9496
content_type_cache=True,
9597
reuse_entries=False,
98+
timeout_s=1,
9699
proxy_host=None,
97100
proxy_port=None,
98101
proxy_username=None,
@@ -117,6 +120,7 @@ def __init__(
117120
self.raise_errors = raise_errors
118121
self.content_type_cache = content_type_cache
119122
self.reuse_entries = reuse_entries
123+
self.timeout_s = timeout_s
120124
self.proxy_host = proxy_host
121125
self.proxy_port = proxy_port
122126
self.proxy_username = proxy_username
@@ -529,7 +533,8 @@ def _http_get(self, url, query):
529533

530534
kwargs = {
531535
'params': query,
532-
'headers': self._request_headers()
536+
'headers': self._request_headers(),
537+
'timeout': self.timeout_s
533538
}
534539

535540
if self._has_proxy():

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ coverage==4.3.4
66
flake8==3.3.0
77
tox==2.5.0
88
virtualenv==15.1.0
9+
requests-mock==1.5.2
910

1011
Sphinx==1.6.3
1112
sphinxcontrib-websupport==1.0.1

tests/client_test.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import unicode_literals
3+
4+
import requests_mock
35
import vcr
46
import re
57
from unittest import TestCase
8+
9+
from requests_mock import ANY
10+
611
from contentful.client import Client
712
from contentful.content_type_cache import ContentTypeCache
813
from contentful.errors import EntryNotFoundError
14+
from contentful.errors import HTTPError
915
from contentful.utils import ConfigurationException
1016
from contentful.entry import Entry
1117

@@ -32,6 +38,21 @@ def test_client_validations(self):
3238
with self.assertRaises(ConfigurationException):
3339
Client('foo', 'bar', api_version=None)
3440

41+
def test_uses_timeouts(self):
42+
c = Client('cfexampleapi', 'b4c0n73n7fu1')
43+
with requests_mock.mock() as m:
44+
m.register_uri('GET', ANY, status_code=500)
45+
self.assertRaises(HTTPError, c.entries)
46+
self.assertEqual(m.call_count, 1)
47+
self.assertEqual(m.request_history[0].timeout, 1)
48+
49+
c = Client('cfexampleapi', 'b4c0n73n7fu1', timeout_s=0.1231570235)
50+
with requests_mock.mock() as m:
51+
m.register_uri('GET', ANY, status_code=500)
52+
self.assertRaises(HTTPError, c.entries)
53+
self.assertEqual(m.call_count, 1)
54+
self.assertEqual(m.request_history[0].timeout, c.timeout_s)
55+
3556
@vcr.use_cassette('fixtures/client/content_type_cache.yaml')
3657
def test_client_creates_a_content_type_cache(self):
3758
Client('cfexampleapi', 'b4c0n73n7fu1')

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ deps =
1616
PyYAML
1717
python-dateutil
1818
vcrpy
19+
requests-mock
1920
requests1: requests==1.2.3
2021
requests27: requests==2.7.0
2122
requests26: requests==2.6.0

0 commit comments

Comments
 (0)