src/eric7/WebBrowser/Network/NetworkUrlInterceptor.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
--- a/src/eric7/WebBrowser/Network/NetworkUrlInterceptor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/NetworkUrlInterceptor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,8 @@
 
 from PyQt6.QtCore import QMutex, QUrl
 from PyQt6.QtWebEngineCore import (
-    QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestInfo
+    QWebEngineUrlRequestInterceptor,
+    QWebEngineUrlRequestInfo,
 )
 
 from EricUtilities.EricMutexLocker import EricMutexLocker
@@ -24,24 +25,25 @@
     """
     Class implementing an URL request handler.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__interceptors = []
         self.__mutex = QMutex()
-        
+
         self.__loadSettings()
-    
+
     def interceptRequest(self, info):
         """
         Public method handling an URL request.
-        
+
         @param info URL request information
         @type QWebEngineUrlRequestInfo
         """
@@ -50,66 +52,67 @@
             if self.__doNotTrack:
                 info.setHttpHeader(b"DNT", b"1")
                 info.setHttpHeader(b"X-Do-Not-Track", b"1")
-            
+
             # Send referrer header?
             if info.requestUrl().host() not in Preferences.getWebBrowser(
-                    "SendRefererWhitelist"):
+                "SendRefererWhitelist"
+            ):
                 self.__setRefererHeader(info)
-            
+
             # User Agents header
             userAgent = WebBrowserPage.userAgentForUrl(info.requestUrl())
             info.setHttpHeader(b"User-Agent", userAgent.encode())
-            
+
             for interceptor in self.__interceptors:
                 interceptor.interceptRequest(info)
-    
+
     def installUrlInterceptor(self, interceptor):
         """
         Public method to install an URL interceptor.
-        
+
         @param interceptor URL interceptor to be installed
         @type UrlInterceptor
         """
         with EricMutexLocker(self.__mutex):
             if interceptor not in self.__interceptors:
                 self.__interceptors.append(interceptor)
-    
+
     def removeUrlInterceptor(self, interceptor):
         """
         Public method to remove an URL interceptor.
-        
+
         @param interceptor URL interceptor to be removed
         @type UrlInterceptor
         """
         with EricMutexLocker(self.__mutex):
             if interceptor in self.__interceptors:
                 self.__interceptors.remove(interceptor)
-    
+
     def __loadSettings(self):
         """
         Private method to load the Network Manager settings.
         """
         with EricMutexLocker(self.__mutex):
-            self.__doNotTrack = Preferences.getWebBrowser(
-                "DoNotTrack")
-            self.__sendReferer = Preferences.getWebBrowser(
-                "RefererSendReferer")
+            self.__doNotTrack = Preferences.getWebBrowser("DoNotTrack")
+            self.__sendReferer = Preferences.getWebBrowser("RefererSendReferer")
             self.__refererDefaultPolicy = Preferences.getWebBrowser(
-                "RefererDefaultPolicy")
+                "RefererDefaultPolicy"
+            )
             self.__refererTrimmingPolicy = Preferences.getWebBrowser(
-                "RefererTrimmingPolicy")
-    
+                "RefererTrimmingPolicy"
+            )
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         self.__loadSettings()
-    
+
     def __setRefererHeader(self, info):
         """
         Private method to set the 'Referer' header depending on the configured
         rule set.
-        
+
         @param info URL request information
         @type QWebEngineUrlRequestInfo
         @see <a href="https://wiki.mozilla.org/Security/Referrer">
@@ -134,15 +137,18 @@
         #       3 = no-referrer-when-downgrade (default)
         # see: https://wiki.mozilla.org/Security/Referrer
         # see: https://www.w3.org/TR/referrer-policy/
-        
+
         if (
-            self.__sendReferer == 0 or
-            # never send referer header
-            
-            (self.__sendReferer == 1 and
-             (info.navigationType() !=
-              QWebEngineUrlRequestInfo.NavigationType.NavigationTypeLink))
-            # send referer header only on click
+            self.__sendReferer == 0
+            # never send referrer header
+            or (
+                self.__sendReferer == 1
+                and (
+                    info.navigationType()
+                    != QWebEngineUrlRequestInfo.NavigationType.NavigationTypeLink
+                )
+            )
+            # send referrer header only on click
         ):
             info.setHttpHeader(b"Referer", b"")
         else:
@@ -171,20 +177,20 @@
                     refererUrl = self.__refererOrigin(url)
             else:
                 # no-referrer-when-downgrade
-                if (
-                    url.scheme() in ("https", "wss") and
-                    not self.__potentiallyTrustworthy(url)
-                ):
+                if url.scheme() in (
+                    "https",
+                    "wss",
+                ) and not self.__potentiallyTrustworthy(url):
                     refererUrl = b""
                 else:
                     refererUrl = self.__trimmedReferer(url)
-            
+
             info.setHttpHeader(b"Referer", refererUrl)
-    
+
     def __sameOrigin(self, url1, url2):
         """
         Private method to test the "same origin" policy.
-        
+
         @param url1 first URL for the test
         @type QUrl
         @param url2 second URL for the test
@@ -192,17 +198,21 @@
         @return flag indicating that both URLs have the same origin
         @rtype bool
         """
-        origin1 = url1.url(QUrl.UrlFormattingOption.RemoveUserInfo |
-                           QUrl.UrlFormattingOption.RemovePath)
-        origin2 = url2.url(QUrl.UrlFormattingOption.RemoveUserInfo |
-                           QUrl.UrlFormattingOption.RemovePath)
-        
+        origin1 = url1.url(
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
+        )
+        origin2 = url2.url(
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
+        )
+
         return origin1 == origin2
-    
+
     def __potentiallyTrustworthy(self, url):
         """
         Private method to check, if the given URL is potentially trustworthy.
-        
+
         @param url URL to be checked
         @type QUrl
         @return flag indicating a potentially trustworthy URL
@@ -210,35 +220,34 @@
         """
         if url.scheme() == "data":
             return False
-        
+
         if url.toString() in ("about:blank", "about:srcdoc"):
             return True
-        
-        origin = url.adjusted(QUrl.UrlFormattingOption.RemoveUserInfo |
-                              QUrl.UrlFormattingOption.RemovePath)
-        
+
+        origin = url.adjusted(
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
+        )
+
         if origin.isEmpty() or origin.scheme() == "":
             return False
         if origin.scheme() in ("https", "wss"):
             return True
         if origin.host().startswith("127.") or origin.host().endswith(":1"):
             return True
-        if (
-            origin.host() == "localhost" or
-            origin.host().endswith(".localhost")
-        ):
+        if origin.host() == "localhost" or origin.host().endswith(".localhost"):
             return True
         if origin.scheme() == "file":
             return True
         if origin.scheme() in ("qrc", "qthelp", "eric"):
             return True
-        
+
         return False
-    
+
     def __trimmedReferer(self, url):
         """
         Private method to generate the trimmed referer header URL.
-        
+
         @param url URL to be trimmed as a referer header
         @type QUrl
         @return trimmed referer header URL
@@ -247,36 +256,36 @@
         if self.__refererTrimmingPolicy == 0:
             # send full URL (no trimming) (default)
             refererUrl = url.toEncoded(
-                QUrl.UrlFormattingOption.RemoveUserInfo |
-                QUrl.UrlFormattingOption.RemoveFragment
+                QUrl.UrlFormattingOption.RemoveUserInfo
+                | QUrl.UrlFormattingOption.RemoveFragment
             )
         elif self.__refererTrimmingPolicy == 1:
             # send the URL without its query string
             refererUrl = url.toEncoded(
-                QUrl.UrlFormattingOption.RemoveUserInfo |
-                QUrl.UrlFormattingOption.RemoveFragment |
-                QUrl.UrlFormattingOption.RemoveQuery
+                QUrl.UrlFormattingOption.RemoveUserInfo
+                | QUrl.UrlFormattingOption.RemoveFragment
+                | QUrl.UrlFormattingOption.RemoveQuery
             )
         else:
             # only send the origin (ensure trailing /)
             refererUrl = self.__refererOrigin(url)
-        
+
         return refererUrl
-    
+
     def __refererOrigin(self, url):
         """
         Private method to generate an origin referer header URL.
-        
+
         @param url URL to generate the header from
         @type QUrl
         @return origin referer header URL
         @rtype QByteArray or bytes
         """
         referer = url.toEncoded(
-            QUrl.UrlFormattingOption.RemoveUserInfo |
-            QUrl.UrlFormattingOption.RemovePath
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
         )
         if not referer.endsWith(b"/"):
             referer += b"/"
-        
+
         return referer

eric ide

mercurial