def set_referer(self, req, current_url): """Set the referer header.""" referer_header_conf = config.get("network", "referer-header") try: if referer_header_conf == "never": # Note: using ''.encode('ascii') sends a header with no value, # instead of no header at all req.setRawHeader("Referer".encode("ascii"), QByteArray()) elif referer_header_conf == "same-domain" and not urlutils.same_domain(req.url(), current_url): req.setRawHeader("Referer".encode("ascii"), QByteArray()) # If refer_header_conf is set to 'always', we leave the header # alone as QtWebKit did set it. except urlutils.InvalidUrlError: # req.url() or current_url can be invalid - this happens on # https://www.playstation.com/ for example. pass
def test_same_domain_invalid_url(url1, url2): """Test same_domain with invalid URLs.""" with pytest.raises(urlutils.InvalidUrlError): urlutils.same_domain(QUrl(url1), QUrl(url2))
def test_same_domain(are_same, url1, url2): """Test same_domain.""" assert urlutils.same_domain(QUrl(url1), QUrl(url2)) == are_same assert urlutils.same_domain(QUrl(url2), QUrl(url1)) == are_same
def createRequest(self, op, req, outgoing_data): """Return a new QNetworkReply object. Extend QNetworkAccessManager::createRequest to save requests in self._requests and handle custom schemes. Args: op: Operation op req: const QNetworkRequest & req outgoing_data: QIODevice * outgoingData Return: A QNetworkReply. """ scheme = req.url().scheme() if scheme in self._scheme_handlers: return self._scheme_handlers[scheme].createRequest( op, req, outgoing_data) host_blocker = objreg.get('host-blocker') if (op == QNetworkAccessManager.GetOperation and req.url().host() in host_blocker.blocked_hosts and config.get('content', 'host-blocking-enabled')): log.webview.info("Request to {} blocked by host blocker.".format( req.url().host())) return networkreply.ErrorNetworkReply( req, HOSTBLOCK_ERROR_STRING, QNetworkReply.ContentAccessDenied, self) if config.get('network', 'do-not-track'): dnt = '1'.encode('ascii') else: dnt = '0'.encode('ascii') req.setRawHeader('DNT'.encode('ascii'), dnt) req.setRawHeader('X-Do-Not-Track'.encode('ascii'), dnt) if self._tab_id is None: current_url = QUrl() # generic NetworkManager, e.g. for downloads else: webview = objreg.get('webview', scope='tab', window=self._win_id, tab=self._tab_id) current_url = webview.url() referer_header_conf = config.get('network', 'referer-header') try: if referer_header_conf == 'never': # Note: using ''.encode('ascii') sends a header with no value, # instead of no header at all req.setRawHeader('Referer'.encode('ascii'), QByteArray()) elif (referer_header_conf == 'same-domain' and not urlutils.same_domain(req.url(), current_url)): req.setRawHeader('Referer'.encode('ascii'), QByteArray()) # If refer_header_conf is set to 'always', we leave the header # alone as QtWebKit did set it. except urlutils.InvalidUrlError: # req.url() or current_url can be invalid - this happens on # https://www.playstation.com/ for example. pass accept_language = config.get('network', 'accept-language') if accept_language is not None: req.setRawHeader('Accept-Language'.encode('ascii'), accept_language.encode('ascii')) if PYQT_VERSION < 0x050301: # WORKAROUND (remove this when we bump the requirements to 5.3.1) # # If we don't disable our message handler, we get a freeze if a # warning is printed due to a PyQt bug, e.g. when clicking a # currency on http://ch.mouser.com/localsites/ # # See http://www.riverbankcomputing.com/pipermail/pyqt/2014-June/034420.html with log.disable_qt_msghandler(): reply = super().createRequest(op, req, outgoing_data) else: reply = super().createRequest(op, req, outgoing_data) self._requests.append(reply) reply.destroyed.connect(self._requests.remove) return reply