Skip to content

Commit

Permalink
Merge pull request #10 from Nekmo/hotfix
Browse files Browse the repository at this point in the history
Fixed infinite recursion loop when a country doesn't have any proxy.
  • Loading branch information
Nekmo authored Nov 13, 2019
2 parents 34f8092 + 33e081c commit 1bfc5b5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
11 changes: 8 additions & 3 deletions proxy_db/proxies.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,26 @@ def find_provider(self):

def reload_provider(self):
provider = self.find_provider()
# TODO: controlar cuando no hay provider
provider.request(**self.request_options).now()

def __iter__(self):
self._proxies = set()
return self

def __next__(self):
def try_get_proxy(self, retry=True):
proxy = self.find_db_proxy()
if proxy:
self._proxies.add(proxy)
return proxy
else:
self.reload_provider()
return next(self)
if retry:
return self.try_get_proxy(retry=False)
else:
raise StopIteration

def __next__(self):
return self.try_get_proxy()

def next(self):
return self.__next__()
18 changes: 18 additions & 0 deletions tests/test_providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,21 @@ def test_find_page_proxies(self):
{'proxy': '190.95.300.123:8080'},
{'proxy': '190.900.48.190:7070'},
])


class TestNoProviderInfiniteLoop(unittest.TestCase):
"""Test to make sure that it doesn't fall into an infinite loop when
next(ProxiesList(country)) is called with a country with no proxies."""

@patch("proxy_db.proxies.ProxiesList.reload_provider")
@patch("proxy_db.proxies.ProxiesList.find_db_proxy")
def test_infinite_recursion_loop_solution(self, reload_provider_mock, find_db_proxy_mock):
"""This call was falling into a recursion loop. Now tries only twice and then raise
an StopIteration exception."""
from proxy_db.proxies import ProxiesList
reload_provider_mock.return_value = None
find_db_proxy_mock.return_value = None

self.assertRaises(StopIteration, lambda: next(ProxiesList("country")))
self.assertEqual(find_db_proxy_mock.call_count, 2)
self.assertEqual(reload_provider_mock.call_count, 2)

0 comments on commit 1bfc5b5

Please sign in to comment.