details:   https://code.tryton.org/tryton/commit/f46f8037da40
branch:    default
user:      Cédric Krier <[email protected]>
date:      Sat Jan 03 13:45:10 2026 +0100
description:
        Defer patching requests default agent when it is imported

        Importing requests module in `trytond/__init__.py` prevents the gevent 
monkey
        patch to be applied to the requests module as it is imported before.

        Closes #14461
diffstat:

 trytond/trytond/__init__.py |  36 +++++++++++++++++++++++++-----------
 1 files changed, 25 insertions(+), 11 deletions(-)

diffs (61 lines):

diff -r 391237759c51 -r f46f8037da40 trytond/trytond/__init__.py
--- a/trytond/trytond/__init__.py       Fri Jan 09 11:29:24 2026 +0100
+++ b/trytond/trytond/__init__.py       Sat Jan 03 13:45:10 2026 +0100
@@ -2,7 +2,9 @@
 # this repository contains the full copyright notices and license terms.
 
 import decimal
+import importlib
 import os
+import sys
 import time
 import warnings
 from email import charset
@@ -10,11 +12,6 @@
 import __main__
 from lxml import etree, objectify
 
-try:
-    from requests import utils as requests_utils
-except ImportError:
-    requests_utils = None
-
 __version__ = "7.9.0"
 __series__ = '.'.join(__version__.split('.')[:2])
 
@@ -37,12 +34,29 @@
 etree.set_default_parser(etree.XMLParser(resolve_entities=False))
 objectify.set_default_parser(objectify.makeparser(resolve_entities=False))
 
-
-def default_user_agent(name="Tryton"):
-    return f"{name}/{__version__}"
+decimal.DefaultContext.prec = int(os.environ.get('TRYTOND_DECIMAL_PREC', 28))
 
 
-if requests_utils:
-    requests_utils.default_user_agent = default_user_agent
+class _RequestPatchFinder:
+    def find_spec(self, fullname, path, target=None):
+        if fullname != 'requests.utils':
+            return
+        sys.meta_path.remove(self)
+        spec = importlib.util.find_spec(fullname)
+        loader = spec.loader
+        original_exec = loader.exec_module
 
-decimal.DefaultContext.prec = int(os.environ.get('TRYTOND_DECIMAL_PREC', 28))
+        def exec_module(module):
+            original_exec(module)
+            self._patch_requests_utils(module)
+        loader.exec_module = exec_module
+        return spec
+
+    @staticmethod
+    def _patch_requests_utils(module):
+        def default_user_agent(name="Tryton"):
+            return f"{name}/{__version__}"
+        module.default_user_agent = default_user_agent
+
+
+sys.meta_path.insert(0, _RequestPatchFinder())

Reply via email to