Merge pull request #1278 from ogayot/lp-1969393-revert

Revert "Move to aiohttp for GeoIP requests"
This commit is contained in:
Dan Bungert 2022-04-20 12:59:15 -06:00 committed by GitHub
commit 6f5a0fdb15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 28 deletions

View File

@ -15,7 +15,6 @@ os-prober
pep8 pep8
pkg-config pkg-config
python3-aiohttp python3-aiohttp
python3-aioresponses
python3-apport python3-apport
python3-async-timeout python3-async-timeout
python3-attr python3-attr

View File

@ -14,12 +14,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import aiohttp
import logging import logging
import enum import enum
import requests
from xml.etree import ElementTree from xml.etree import ElementTree
from subiquitycore.async_helpers import ( from subiquitycore.async_helpers import (
run_in_thread,
SingleInstanceTask, SingleInstanceTask,
) )
@ -75,14 +76,13 @@ class HTTPGeoIPStrategy(GeoIPStrategy):
""" HTTP implementation to retrieve GeoIP information. We use the """ HTTP implementation to retrieve GeoIP information. We use the
geoip.ubuntu.com service. """ geoip.ubuntu.com service. """
async def get_response(self) -> str: async def get_response(self) -> str:
url = "https://geoip.ubuntu.com/lookup"
try: try:
async with aiohttp.ClientSession() as session: response = await run_in_thread(
async with session.get(url) as response: requests.get, "https://geoip.ubuntu.com/lookup")
response.raise_for_status() response.raise_for_status()
return await response.text() except requests.exceptions.RequestException as e:
except aiohttp.ClientError as e:
raise LookupError from e raise LookupError from e
return response.text
class GeoIP: class GeoIP:

View File

@ -13,7 +13,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from aioresponses import aioresponses import mock
from subiquitycore.tests import SubiTestCase from subiquitycore.tests import SubiTestCase
from subiquitycore.tests.mocks import make_app from subiquitycore.tests.mocks import make_app
@ -47,17 +47,30 @@ empty_tz = '<Response><TimeZone></TimeZone></Response>'
empty_cc = '<Response><CountryCode></CountryCode></Response>' empty_cc = '<Response><CountryCode></CountryCode></Response>'
class MockGeoIPResponse:
def __init__(self, text, status_code=200):
self.text = text
self.status_code = status_code
def raise_for_status(self, *args, **kwargs):
pass
def requests_get_factory(text):
def requests_get(*args, **kwargs):
return MockGeoIPResponse(text)
return requests_get
class TestGeoIP(SubiTestCase): class TestGeoIP(SubiTestCase):
@mock.patch('requests.get', new=requests_get_factory(xml))
def setUp(self): def setUp(self):
strategy = HTTPGeoIPStrategy() strategy = HTTPGeoIPStrategy()
self.geoip = GeoIP(make_app(), strategy) self.geoip = GeoIP(make_app(), strategy)
async def fn(): async def fn():
self.assertTrue(await self.geoip.lookup()) self.assertTrue(await self.geoip.lookup())
run_coro(fn())
with aioresponses() as mocked:
mocked.get("https://geoip.ubuntu.com/lookup", body=xml)
run_coro(fn())
def test_countrycode(self): def test_countrycode(self):
self.assertEqual("us", self.geoip.countrycode) self.assertEqual("us", self.geoip.countrycode)
@ -71,42 +84,37 @@ class TestGeoIPBadData(SubiTestCase):
strategy = HTTPGeoIPStrategy() strategy = HTTPGeoIPStrategy()
self.geoip = GeoIP(make_app(), strategy) self.geoip = GeoIP(make_app(), strategy)
@mock.patch('requests.get', new=requests_get_factory(partial))
def test_partial_reponse(self): def test_partial_reponse(self):
async def fn(): async def fn():
self.assertFalse(await self.geoip.lookup()) self.assertFalse(await self.geoip.lookup())
with aioresponses() as mocked: run_coro(fn())
mocked.get("https://geoip.ubuntu.com/lookup", body=partial)
run_coro(fn())
@mock.patch('requests.get', new=requests_get_factory(incomplete))
def test_incomplete(self): def test_incomplete(self):
async def fn(): async def fn():
self.assertFalse(await self.geoip.lookup()) self.assertFalse(await self.geoip.lookup())
with aioresponses() as mocked: run_coro(fn())
mocked.get("https://geoip.ubuntu.com/lookup", body=incomplete)
run_coro(fn())
self.assertIsNone(self.geoip.countrycode) self.assertIsNone(self.geoip.countrycode)
self.assertIsNone(self.geoip.timezone) self.assertIsNone(self.geoip.timezone)
@mock.patch('requests.get', new=requests_get_factory(long_cc))
def test_long_cc(self): def test_long_cc(self):
async def fn(): async def fn():
self.assertFalse(await self.geoip.lookup()) self.assertFalse(await self.geoip.lookup())
with aioresponses() as mocked: run_coro(fn())
mocked.get("https://geoip.ubuntu.com/lookup", body=long_cc)
run_coro(fn())
self.assertIsNone(self.geoip.countrycode) self.assertIsNone(self.geoip.countrycode)
@mock.patch('requests.get', new=requests_get_factory(empty_cc))
def test_empty_cc(self): def test_empty_cc(self):
async def fn(): async def fn():
self.assertFalse(await self.geoip.lookup()) self.assertFalse(await self.geoip.lookup())
with aioresponses() as mocked: run_coro(fn())
mocked.get("https://geoip.ubuntu.com/lookup", body=empty_cc)
run_coro(fn())
self.assertIsNone(self.geoip.countrycode) self.assertIsNone(self.geoip.countrycode)
@mock.patch('requests.get', new=requests_get_factory(empty_tz))
def test_empty_tz(self): def test_empty_tz(self):
async def fn(): async def fn():
self.assertFalse(await self.geoip.lookup()) self.assertFalse(await self.geoip.lookup())
with aioresponses() as mocked: run_coro(fn())
mocked.get("https://geoip.ubuntu.com/lookup", body=empty_tz)
run_coro(fn())
self.assertIsNone(self.geoip.timezone) self.assertIsNone(self.geoip.timezone)