diff --git a/ipinfo_django/middleware.py b/ipinfo_django/middleware.py index 7b4ffc5..ce21d83 100644 --- a/ipinfo_django/middleware.py +++ b/ipinfo_django/middleware.py @@ -99,3 +99,23 @@ def __init__(self, get_response): ipinfo_token = getattr(settings, "IPINFO_TOKEN", None) ipinfo_settings = getattr(settings, "IPINFO_SETTINGS", {}) self.ipinfo = ipinfo.getHandlerAsyncLite(ipinfo_token, **ipinfo_settings) + + +class IPinfoCoreMiddleware(IPinfoMiddleware): + def __init__(self, get_response): + super().__init__(get_response=get_response) + + ipinfo_token = getattr(settings, "IPINFO_TOKEN", None) + ipinfo_settings = getattr(settings, "IPINFO_SETTINGS", {}) + self.ipinfo = ipinfo.getHandlerCore(ipinfo_token, **ipinfo_settings) + + +class IPinfoAsyncCoreMiddleware(IPinfoAsyncMiddleware): + sync_capable = False + async_capable = True + + def __init__(self, get_response): + super().__init__(get_response=get_response) + ipinfo_token = getattr(settings, "IPINFO_TOKEN", None) + ipinfo_settings = getattr(settings, "IPINFO_SETTINGS", {}) + self.ipinfo = ipinfo.getHandlerAsyncCore(ipinfo_token, **ipinfo_settings) diff --git a/setup.py b/setup.py index 18f7643..2329837 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,6 @@ author_email="support@ipinfo.io", license="Apache License 2.0", packages=["ipinfo_django", "ipinfo_django.ip_selector"], - install_requires=["django", "ipinfo>=5.2.0"], + install_requires=["django", "ipinfo>=5.3.0"], zip_safe=False, ) diff --git a/tests/conftest.py b/tests/conftest.py index ce259a0..f34ebb9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,3 +27,17 @@ def ipinfo_async_lite_middleware(settings): settings.MIDDLEWARE = [ "ipinfo_django.middleware.IPinfoAsyncLiteMiddleware", ] + + +@pytest.fixture +def ipinfo_core_middleware(settings): + settings.MIDDLEWARE = [ + "ipinfo_django.middleware.IPinfoCoreMiddleware", + ] + + +@pytest.fixture +def ipinfo_async_core_middleware(settings): + settings.MIDDLEWARE = [ + "ipinfo_django.middleware.IPinfoAsyncCoreMiddleware", + ] diff --git a/tests/test_async_core_middleware.py b/tests/test_async_core_middleware.py new file mode 100644 index 0000000..1552503 --- /dev/null +++ b/tests/test_async_core_middleware.py @@ -0,0 +1,43 @@ +from http import HTTPStatus +from unittest import mock + +import pytest +from ipinfo.details import Details + + +@pytest.mark.asyncio +async def test_middleware_appends_ip_info(async_client, ipinfo_async_core_middleware): + with mock.patch("ipinfo.AsyncHandlerCore.getDetails") as mocked_getDetails: + mocked_getDetails.return_value = Details({"ip": "127.0.0.1"}) + res = await async_client.get("/test_view/") + assert res.status_code == HTTPStatus.OK + assert b"For testing: 127.0.0.1" in res.content + + +@pytest.mark.asyncio +async def test_middleware_filters(async_client, ipinfo_async_core_middleware): + res = await async_client.get("/test_view/", USER_AGENT="some bot") + assert res.status_code == HTTPStatus.OK + assert b"Request filtered." in res.content + + +@pytest.mark.asyncio +async def test_middleware_behind_proxy(async_client, ipinfo_async_core_middleware): + with mock.patch("ipinfo.AsyncHandlerCore.getDetails") as mocked_getDetails: + mocked_getDetails.return_value = Details({"ip": "93.44.186.197"}) + res = await async_client.get("/test_view/", X_FORWARDED_FOR="93.44.186.197") + + mocked_getDetails.assert_called_once_with("93.44.186.197") + assert res.status_code == HTTPStatus.OK + assert b"For testing: 93.44.186.197" in res.content + + +@pytest.mark.asyncio +async def test_middleware_not_behind_proxy(async_client, ipinfo_async_core_middleware): + with mock.patch("ipinfo.AsyncHandlerCore.getDetails") as mocked_getDetails: + mocked_getDetails.return_value = Details({"ip": "127.0.0.1"}) + res = await async_client.get("/test_view/") + + mocked_getDetails.assert_called_once_with("127.0.0.1") + assert res.status_code == HTTPStatus.OK + assert b"For testing: 127.0.0.1" in res.content diff --git a/tests/test_core_middleware.py b/tests/test_core_middleware.py new file mode 100644 index 0000000..a735fe6 --- /dev/null +++ b/tests/test_core_middleware.py @@ -0,0 +1,38 @@ +from http import HTTPStatus +from unittest import mock + +from ipinfo.details import Details + + +def test_middleware_appends_ip_info(client, ipinfo_core_middleware): + with mock.patch("ipinfo.HandlerCore.getDetails") as mocked_getDetails: + mocked_getDetails.return_value = Details({"ip": "127.0.0.1"}) + res = client.get("/test_view/") + assert res.status_code == HTTPStatus.OK + assert b"For testing: 127.0.0.1" in res.content + + +def test_middleware_filters(client, ipinfo_core_middleware): + res = client.get("/test_view/", HTTP_USER_AGENT="some bot") + assert res.status_code == HTTPStatus.OK + assert b"Request filtered." in res.content + + +def test_middleware_behind_proxy(client, ipinfo_core_middleware): + with mock.patch("ipinfo.HandlerCore.getDetails") as mocked_getDetails: + mocked_getDetails.return_value = Details({"ip": "93.44.186.197"}) + res = client.get("/test_view/", HTTP_X_FORWARDED_FOR="93.44.186.197") + + mocked_getDetails.assert_called_once_with("93.44.186.197") + assert res.status_code == HTTPStatus.OK + assert b"For testing: 93.44.186.197" in res.content + + +def test_middleware_not_behind_proxy(client, ipinfo_core_middleware): + with mock.patch("ipinfo.HandlerCore.getDetails") as mocked_getDetails: + mocked_getDetails.return_value = Details({"ip": "127.0.0.1"}) + res = client.get("/test_view/") + + mocked_getDetails.assert_called_once_with("127.0.0.1") + assert res.status_code == HTTPStatus.OK + assert b"For testing: 127.0.0.1" in res.content