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
8 changes: 8 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
master
------

7.2.0 (2026-06-09)
------------------

Housekeeping:
~~~~~~~~~~~~~
- 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
- remove the internal ``ClientIdExtract`` service and the unused ``cookies`` plumbing in ``ContextGetDefault`` / ``ContextPrepare``

7.1.0 (2026-05-29)
------------------

Expand Down
Empty file removed castle/client_id/__init__.py
Empty file.
7 changes: 0 additions & 7 deletions castle/client_id/extract.py

This file was deleted.

30 changes: 2 additions & 28 deletions castle/context/get_default.py
Original file line number Diff line number Diff line change
@@ -1,52 +1,26 @@
from castle.version import VERSION
from castle.headers.filter import HeadersFilter
from castle.client_id.extract import ClientIdExtract
from castle.headers.extract import HeadersExtract
from castle.ips.extract import IPsExtract

__version__ = VERSION


class ContextGetDefault(object):
def __init__(self, request, cookies):
self.cookies = self._fetch_cookies(request, cookies)
def __init__(self, request):
self.pre_headers = HeadersFilter(request).call()

def call(self):
context = dict(
return dict(
{
'client_id': self._client_id(),
'active': True,
'headers': self._headers(),
'ip': self._ip(),
'library': {'name': 'castle-python', 'version': __version__},
}
)
context.update(self._optional_defaults())

return context

def _ip(self):
return IPsExtract(self.pre_headers).call()

def _client_id(self):
return ClientIdExtract(self.pre_headers, self.cookies).call()

def _headers(self):
return HeadersExtract(self.pre_headers).call()

def _optional_defaults(self):
context = dict()
if 'Accept-Language' in self.pre_headers:
context['locale'] = self.pre_headers.get('Accept-Language')
if 'User-Agent' in self.pre_headers:
context['user_agent'] = self.pre_headers.get('User-Agent')
return context

@staticmethod
def _fetch_cookies(request, cookies):
if cookies:
return cookies
if hasattr(request, 'COOKIES') and request.COOKIES:
return request.COOKIES
return None
2 changes: 1 addition & 1 deletion castle/context/prepare.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ class ContextPrepare(object):
def call(request, options=None):
if options is None:
options = {}
default_context = ContextGetDefault(request, options.get('cookies')).call()
default_context = ContextGetDefault(request).call()
return ContextMerge.call(default_context, options.get('context', {}))
1 change: 0 additions & 1 deletion castle/test/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

TEST_MODULES = [
'castle.test.api_request_test',
'castle.test.client_id.extract_test',
'castle.test.client_test',
'castle.test.command_test',
'castle.test.commands.filter_test',
Expand Down
36 changes: 0 additions & 36 deletions castle/test/client_id/extract_test.py

This file was deleted.

3 changes: 0 additions & 3 deletions castle/test/client_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,13 @@ def tearDown(self):

def test_init(self):
context = {
'active': True,
'client_id': '1234',
'headers': {
'User-Agent': 'test',
'X-Forwarded-For': '217.144.192.112',
'X-Castle-Client-Id': '1234',
},
'ip': '217.144.192.112',
'library': {'name': 'castle-python', 'version': VERSION},
'user_agent': 'test',
}
client = Client.from_request(request(), {})
self.assertEqual(client.do_not_track, False)
Expand Down
18 changes: 5 additions & 13 deletions castle/test/context/get_default_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,14 @@
from castle.context.get_default import ContextGetDefault


def client_id():
return 'abcd'


def cookies():
return {'__cid': client_id()}


def request_ip():
return '5.5.5.5'


def environ():
return {
'HTTP_X_FORWARDED_FOR': request_ip(),
'HTTP_COOKIE': "__cid={client_id()};other=efgh",
'HTTP_COOKIE': "__cid=abcd;other=efgh",
'HTTP-Accept-Language': 'en',
'HTTP-User-Agent': 'test',
}
Expand All @@ -34,9 +26,7 @@ def request(env):

class ContextGetDefaultTestCase(unittest.TestCase):
def test_default_context(self):
context = ContextGetDefault(request(environ()), cookies()).call()
self.assertEqual(context['client_id'], client_id())
self.assertEqual(context['active'], True)
context = ContextGetDefault(request(environ())).call()
self.assertEqual(
context['headers'],
{
Expand All @@ -48,4 +38,6 @@ def test_default_context(self):
)
self.assertEqual(context['ip'], request_ip())
self.assertDictEqual(context['library'], {'name': 'castle-python', 'version': __version__})
self.assertEqual(context['user_agent'], 'test')
self.assertNotIn('client_id', context)
self.assertNotIn('active', context)
self.assertNotIn('user_agent', context)
9 changes: 0 additions & 9 deletions castle/test/context/prepare_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,13 @@ def request():
class ContextPrepareTestCase(unittest.TestCase):
def test_call(self):
context = {
'active': True,
'client_id': '1234',
'headers': {
'User-Agent': 'test',
'X-Forwarded-For': '217.144.192.112',
'X-Castle-Client-Id': '1234',
},
'ip': '217.144.192.112',
'library': {'name': 'castle-python', 'version': VERSION},
'user_agent': 'test',
}
result_context = ContextPrepare.call(request(), {})
self.assertEqual(result_context, context)

def test_setup_client_id_from_cookies(self):
cookies = {'__cid': '1234'}
options = {'cookies': cookies}
result_context = ContextPrepare.call(request(), options)
self.assertEqual(result_context['client_id'], '1234')
3 changes: 0 additions & 3 deletions castle/test/payload/prepare_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,13 @@ def request():

def ctx():
return {
'active': True,
'client_id': '1234',
'headers': {
'User-Agent': 'test',
'X-Castle-Client-Id': '1234',
'X-Forwarded-For': '217.144.192.112',
},
'ip': '217.144.192.112',
'library': {'name': 'castle-python', 'version': VERSION},
'user_agent': 'test',
}


Expand Down
2 changes: 1 addition & 1 deletion castle/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION = '7.1.0'
VERSION = '7.2.0'
Loading