Skip to content

Commit

Permalink
Merge pull request #3405 from GeotrekCE/cache_invalidate_along_x_forw…
Browse files Browse the repository at this point in the history
…arded_proto_header

🐛 Use X-Forwarded-Proto header to define API v2 cache key
  • Loading branch information
submarcos authored Jan 12, 2023
2 parents e2546e4 + b9ccb98 commit b28498b
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
1 change: 1 addition & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ In preparation for HD Views developments (PR #3298)

- Recreate cache folders if missing. (#3384)
- Modify site's geometry before saving to avoid edition and export of shapefiles (#3399)
- Fix API V2 cache key with X-Forwarded-Proto header (#3404)


2.94.0 (2022-12-12)
Expand Down
40 changes: 40 additions & 0 deletions geotrek/api/tests/test_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from django.utils import timezone
from freezegun.api import freeze_time
from mapentity.tests.factories import SuperUserFactory
from rest_framework.test import APITestCase

from geotrek import __version__
from geotrek.authent import models as authent_models
Expand All @@ -38,6 +39,7 @@
from geotrek.tourism.tests import factories as tourism_factory
from geotrek.trekking import models as trek_models
from geotrek.trekking.tests import factories as trek_factory
from geotrek.trekking.tests.factories import PracticeFactory
from geotrek.zoning import models as zoning_models
from geotrek.zoning.tests import factories as zoning_factory

Expand Down Expand Up @@ -4255,3 +4257,41 @@ def test_cache_is_used_when_getting_trek_profile_svg(self):
response = self.client.get(reverse('apiv2:trek-profile', args=(self.trek.pk,)), {"format": "svg"})
self.assertEqual(response.status_code, 200)
self.assertIn('image/svg+xml', response['Content-Type'])


class GenericCacheTestCase(APITestCase):
@classmethod
def setUpTestData(cls):
cls.practice = PracticeFactory.create()

def test_cache_invalidates_along_x_forwarded_proto_header(self):
with self.assertNumQueries(2):
response = self.client.get(reverse('apiv2:practice-detail', args=(self.practice.pk,)))
data = response.json()
self.assertTrue(data['pictogram'].startswith('http://'))

# after cache hit, query number is 1
with self.assertNumQueries(1):
response = self.client.get(reverse('apiv2:practice-detail', args=(self.practice.pk,)))
data = response.json()
self.assertTrue(data['pictogram'].startswith('http://'))

# we used custom header, cache is invalidate and url is now https
with self.assertNumQueries(2):
response = self.client.get(reverse('apiv2:practice-detail', args=(self.practice.pk,)),
HTTP_X_FORWARDED_PROTO='https')
data = response.json()
self.assertTrue(data['pictogram'].startswith('https://'))

# cache is hit
with self.assertNumQueries(1):
response = self.client.get(reverse('apiv2:practice-detail', args=(self.practice.pk,)),
HTTP_X_FORWARDED_PROTO='https')
data = response.json()
self.assertTrue(data['pictogram'].startswith('https://'))

# first request is always cached
with self.assertNumQueries(1):
response = self.client.get(reverse('apiv2:practice-detail', args=(self.practice.pk,)))
data = response.json()
self.assertTrue(data['pictogram'].startswith('http://'))
3 changes: 2 additions & 1 deletion geotrek/api/v2/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ def get_ordered_query_params(self):

def get_base_cache_string(self):
""" return cache string as url path + ordered query params """
return f"{self.request.path}:{self.get_ordered_query_params()}:{self.request.accepted_renderer.format}"
proto_scheme = self.request.headers.get('X-Forwarded-Proto', self.request.scheme) # take care about scheme defined in nginx.conf
return f"{self.request.path}:{self.get_ordered_query_params()}:{self.request.accepted_renderer.format}:{proto_scheme}"

def get_object_cache_key(self, pk):
""" return specific object cache key based on object date_update column"""
Expand Down

0 comments on commit b28498b

Please sign in to comment.