diff mbox series

[2/2] fetch2/wget: cache SSL context instead of recreating every time

Message ID 20260817195057.2485364-2-chris.laplante@agilent.com
State New
Headers show
Series [1/2] fetch2: get rid of unused FetchMethod.urls property | expand

Commit Message

chris.laplante@agilent.com Aug. 17, 2026, 7:50 p.m. UTC
From: Chris Laplante <chris.laplante@agilent.com>

On my system, ssl.create_default_context() takes between 100-200ms,
presumably because it has to load all the certs in /etc/ssl/.

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 lib/bb/fetch2/wget.py | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/lib/bb/fetch2/wget.py b/lib/bb/fetch2/wget.py
index 94a1ec973..0d2b7f5c8 100644
--- a/lib/bb/fetch2/wget.py
+++ b/lib/bb/fetch2/wget.py
@@ -54,12 +54,34 @@  class WgetProgressHandler(bb.progress.LineFilterProgressHandler):
 class Wget(FetchMethod):
     """Class to fetch urls via 'wget'"""
 
+    def __init__(self):
+        super().__init__()
+        self._unverified_ssl_context = None
+        self._verified_ssl_context = None
+
     def check_certs(self, d):
         """
         Should certificates be checked?
         """
         return (d.getVar("BB_CHECK_SSL_CERTS") or "1") != "0"
 
+    def ssl_context(self, d):
+        """
+        Get an SSL context, caching it to avoid creating every time.
+        """
+        if self.check_certs(d):
+            # Cache verified SSL context
+            if self._verified_ssl_context is None:
+                import ssl
+                self._verified_ssl_context = ssl.create_default_context()
+            return self._verified_ssl_context
+
+        # Cache unverified SSL context
+        if self._unverified_ssl_context is None:
+            import ssl
+            self._unverified_ssl_context = ssl._create_unverified_context()
+        return self._unverified_ssl_context
+
     def supports(self, ud, d):
         """
         Check to see if a given url can be fetched with wget.
@@ -412,13 +434,7 @@  class Wget(FetchMethod):
         # to scope the changes to the build_opener request, which is when the
         # environment lookups happen.
         with bb.utils.environment(**newenv):
-            import ssl
-
-            if check_certs:
-                context = ssl.create_default_context()
-            else:
-                context = ssl._create_unverified_context()
-
+            context = self.ssl_context(d)
             handlers = [FixedHTTPRedirectHandler,
                         HTTPMethodFallback,
                         urllib.request.ProxyHandler(),