Skip to content

Commit 2ec259a

Browse files
authored
7.2.0: slim down default request context (#121)
1 parent 342ce87 commit 2ec259a

12 files changed

Lines changed: 17 additions & 102 deletions

File tree

CHANGELOG.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
master
22
------
33

4+
7.2.0 (2026-06-09)
5+
------------------
6+
7+
Housekeeping:
8+
~~~~~~~~~~~~~
9+
- slim down the default request context to ``headers``, ``ip``, and ``library``; the client id is carried by ``headers`` (the ``X-Castle-Client-Id`` header / ``__cid`` cookie) and resolved server-side
10+
- remove the internal ``ClientIdExtract`` service and the unused ``cookies`` plumbing in ``ContextGetDefault`` / ``ContextPrepare``
11+
412
7.1.0 (2026-05-29)
513
------------------
614

castle/client_id/__init__.py

Whitespace-only changes.

castle/client_id/extract.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

castle/context/get_default.py

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,26 @@
11
from castle.version import VERSION
22
from castle.headers.filter import HeadersFilter
3-
from castle.client_id.extract import ClientIdExtract
43
from castle.headers.extract import HeadersExtract
54
from castle.ips.extract import IPsExtract
65

76
__version__ = VERSION
87

98

109
class ContextGetDefault(object):
11-
def __init__(self, request, cookies):
12-
self.cookies = self._fetch_cookies(request, cookies)
10+
def __init__(self, request):
1311
self.pre_headers = HeadersFilter(request).call()
1412

1513
def call(self):
16-
context = dict(
14+
return dict(
1715
{
18-
'client_id': self._client_id(),
19-
'active': True,
2016
'headers': self._headers(),
2117
'ip': self._ip(),
2218
'library': {'name': 'castle-python', 'version': __version__},
2319
}
2420
)
25-
context.update(self._optional_defaults())
26-
27-
return context
2821

2922
def _ip(self):
3023
return IPsExtract(self.pre_headers).call()
3124

32-
def _client_id(self):
33-
return ClientIdExtract(self.pre_headers, self.cookies).call()
34-
3525
def _headers(self):
3626
return HeadersExtract(self.pre_headers).call()
37-
38-
def _optional_defaults(self):
39-
context = dict()
40-
if 'Accept-Language' in self.pre_headers:
41-
context['locale'] = self.pre_headers.get('Accept-Language')
42-
if 'User-Agent' in self.pre_headers:
43-
context['user_agent'] = self.pre_headers.get('User-Agent')
44-
return context
45-
46-
@staticmethod
47-
def _fetch_cookies(request, cookies):
48-
if cookies:
49-
return cookies
50-
if hasattr(request, 'COOKIES') and request.COOKIES:
51-
return request.COOKIES
52-
return None

castle/context/prepare.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ class ContextPrepare(object):
77
def call(request, options=None):
88
if options is None:
99
options = {}
10-
default_context = ContextGetDefault(request, options.get('cookies')).call()
10+
default_context = ContextGetDefault(request).call()
1111
return ContextMerge.call(default_context, options.get('context', {}))

castle/test/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
TEST_MODULES = [
88
'castle.test.api_request_test',
9-
'castle.test.client_id.extract_test',
109
'castle.test.client_test',
1110
'castle.test.command_test',
1211
'castle.test.commands.filter_test',

castle/test/client_id/extract_test.py

Lines changed: 0 additions & 36 deletions
This file was deleted.

castle/test/client_test.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,13 @@ def tearDown(self):
3030

3131
def test_init(self):
3232
context = {
33-
'active': True,
34-
'client_id': '1234',
3533
'headers': {
3634
'User-Agent': 'test',
3735
'X-Forwarded-For': '217.144.192.112',
3836
'X-Castle-Client-Id': '1234',
3937
},
4038
'ip': '217.144.192.112',
4139
'library': {'name': 'castle-python', 'version': VERSION},
42-
'user_agent': 'test',
4340
}
4441
client = Client.from_request(request(), {})
4542
self.assertEqual(client.do_not_track, False)

castle/test/context/get_default_test.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,14 @@
44
from castle.context.get_default import ContextGetDefault
55

66

7-
def client_id():
8-
return 'abcd'
9-
10-
11-
def cookies():
12-
return {'__cid': client_id()}
13-
14-
157
def request_ip():
168
return '5.5.5.5'
179

1810

1911
def environ():
2012
return {
2113
'HTTP_X_FORWARDED_FOR': request_ip(),
22-
'HTTP_COOKIE': "__cid={client_id()};other=efgh",
14+
'HTTP_COOKIE': "__cid=abcd;other=efgh",
2315
'HTTP-Accept-Language': 'en',
2416
'HTTP-User-Agent': 'test',
2517
}
@@ -34,9 +26,7 @@ def request(env):
3426

3527
class ContextGetDefaultTestCase(unittest.TestCase):
3628
def test_default_context(self):
37-
context = ContextGetDefault(request(environ()), cookies()).call()
38-
self.assertEqual(context['client_id'], client_id())
39-
self.assertEqual(context['active'], True)
29+
context = ContextGetDefault(request(environ())).call()
4030
self.assertEqual(
4131
context['headers'],
4232
{
@@ -48,4 +38,6 @@ def test_default_context(self):
4838
)
4939
self.assertEqual(context['ip'], request_ip())
5040
self.assertDictEqual(context['library'], {'name': 'castle-python', 'version': __version__})
51-
self.assertEqual(context['user_agent'], 'test')
41+
self.assertNotIn('client_id', context)
42+
self.assertNotIn('active', context)
43+
self.assertNotIn('user_agent', context)

castle/test/context/prepare_test.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,13 @@ def request():
1919
class ContextPrepareTestCase(unittest.TestCase):
2020
def test_call(self):
2121
context = {
22-
'active': True,
23-
'client_id': '1234',
2422
'headers': {
2523
'User-Agent': 'test',
2624
'X-Forwarded-For': '217.144.192.112',
2725
'X-Castle-Client-Id': '1234',
2826
},
2927
'ip': '217.144.192.112',
3028
'library': {'name': 'castle-python', 'version': VERSION},
31-
'user_agent': 'test',
3229
}
3330
result_context = ContextPrepare.call(request(), {})
3431
self.assertEqual(result_context, context)
35-
36-
def test_setup_client_id_from_cookies(self):
37-
cookies = {'__cid': '1234'}
38-
options = {'cookies': cookies}
39-
result_context = ContextPrepare.call(request(), options)
40-
self.assertEqual(result_context['client_id'], '1234')

0 commit comments

Comments
 (0)