Skip to content
Merged
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
30 changes: 23 additions & 7 deletions ipinfo_django/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ def __init__(self, get_response=None):

ipinfo_token = getattr(settings, "IPINFO_TOKEN", None)
ipinfo_settings = getattr(settings, "IPINFO_SETTINGS", {})
self.ip_selector = getattr(
settings, "IPINFO_IP_SELECTOR", DefaultIPSelector()
)
self.ip_selector = getattr(settings, "IPINFO_IP_SELECTOR", DefaultIPSelector())
self.ipinfo = ipinfo.getHandler(ipinfo_token, **ipinfo_settings)

def __call__(self, request):
Expand All @@ -34,7 +32,7 @@ def __call__(self, request):
request.ipinfo = self.ipinfo.getDetails(
self.ip_selector.get_ip(request)
)
except Exception as exc:
except Exception:
request.ipinfo = None
LOGGER.error(traceback.format_exc())

Expand All @@ -57,9 +55,7 @@ def __init__(self, get_response):

ipinfo_token = getattr(settings, "IPINFO_TOKEN", None)
ipinfo_settings = getattr(settings, "IPINFO_SETTINGS", {})
self.ip_selector = getattr(
settings, "IPINFO_IP_SELECTOR", DefaultIPSelector()
)
self.ip_selector = getattr(settings, "IPINFO_IP_SELECTOR", DefaultIPSelector())
self.ipinfo = ipinfo.getHandlerAsync(ipinfo_token, **ipinfo_settings)

def __call__(self, request):
Expand All @@ -83,3 +79,23 @@ async def __acall__(self, request):

def is_bot(self, request):
return is_bot(request)


class IPinfoLiteMiddleware(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.getHandlerLite(ipinfo_token, **ipinfo_settings)


class IPinfoAsyncLiteMiddleware(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.getHandlerAsyncLite(ipinfo_token, **ipinfo_settings)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@
author_email="[email protected]",
license="Apache License 2.0",
packages=["ipinfo_django", "ipinfo_django.ip_selector"],
install_requires=["django", "ipinfo==4.2.1"],
install_requires=["django", "ipinfo>=5.2.0"],
zip_safe=False,
)
29 changes: 29 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import pytest


@pytest.fixture
def ipinfo_middleware(settings):
settings.MIDDLEWARE = [
"ipinfo_django.middleware.IPinfoMiddleware",
]


@pytest.fixture
def ipinfo_async_middleware(settings):
settings.MIDDLEWARE = [
"ipinfo_django.middleware.IPinfoAsyncMiddleware",
]


@pytest.fixture
def ipinfo_lite_middleware(settings):
settings.MIDDLEWARE = [
"ipinfo_django.middleware.IPinfoLiteMiddleware",
]


@pytest.fixture
def ipinfo_async_lite_middleware(settings):
settings.MIDDLEWARE = [
"ipinfo_django.middleware.IPinfoAsyncLiteMiddleware",
]
4 changes: 0 additions & 4 deletions tests/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,4 @@

ROOT_URLCONF = "tests.urls"

MIDDLEWARE = [
"ipinfo_django.middleware.IPinfoAsyncMiddleware",
]

USE_TZ = False
43 changes: 43 additions & 0 deletions tests/test_async_lite_middleware.py
Original file line number Diff line number Diff line change
@@ -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_lite_middleware):
with mock.patch("ipinfo.AsyncHandlerLite.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_lite_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_lite_middleware):
with mock.patch("ipinfo.AsyncHandlerLite.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_lite_middleware):
with mock.patch("ipinfo.AsyncHandlerLite.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
12 changes: 5 additions & 7 deletions tests/test_async_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@


@pytest.mark.asyncio
async def test_middleware_appends_ip_info(async_client):
async def test_middleware_appends_ip_info(async_client, ipinfo_async_middleware):
with mock.patch("ipinfo.AsyncHandler.getDetails") as mocked_getDetails:
mocked_getDetails.return_value = Details({"ip": "127.0.0.1"})
res = await async_client.get("/test_view/")
Expand All @@ -15,27 +15,25 @@ async def test_middleware_appends_ip_info(async_client):


@pytest.mark.asyncio
async def test_middleware_filters(async_client):
async def test_middleware_filters(async_client, ipinfo_async_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):
async def test_middleware_behind_proxy(async_client, ipinfo_async_middleware):
with mock.patch("ipinfo.AsyncHandler.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"
)
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):
async def test_middleware_not_behind_proxy(async_client, ipinfo_async_middleware):
with mock.patch("ipinfo.AsyncHandler.getDetails") as mocked_getDetails:
mocked_getDetails.return_value = Details({"ip": "127.0.0.1"})
res = await async_client.get("/test_view/")
Expand Down
38 changes: 38 additions & 0 deletions tests/test_lite_middleware.py
Original file line number Diff line number Diff line change
@@ -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_lite_middleware):
with mock.patch("ipinfo.HandlerLite.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_lite_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_lite_middleware):
with mock.patch("ipinfo.HandlerLite.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_lite_middleware):
with mock.patch("ipinfo.HandlerLite.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
38 changes: 38 additions & 0 deletions tests/test_middleware.py
Original file line number Diff line number Diff line change
@@ -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_middleware):
with mock.patch("ipinfo.Handler.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_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_middleware):
with mock.patch("ipinfo.Handler.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_middleware):
with mock.patch("ipinfo.Handler.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
15 changes: 7 additions & 8 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@ envlist =
py3.10-django{40}

[testenv]
commands = pytest {posargs}
passenv = PYTHONPATH
commands = pytest {posargs:tests/}
setenv =
DJANGO_SETTINGS_MODULE = tests.settings
PYTHONPATH = {toxinidir}
deps = requests

[testenv:py3.10-django32]
commands = pytest tests/test_async_middleware.py
commands = pytest tests
deps = -rrequirements/py310-django32.txt

[testenv:py3.10-django40]
commands = pytest tests/test_async_middleware.py
commands = pytest tests
deps = -rrequirements/py310-django40.txt

[pytest]
DJANGO_SETTINGS_MODULE = tests.settings
python_files = test_*.py