From bad9031914d5795327757613ab397fb3ef1a0b52 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 12 Aug 2014 09:57:40 +0200 Subject: [PATCH] Change image/jpg Content-Type to image/jpeg. This makes QtWebKit display images with a (nonstandard) image/jpg content-type, e.g. http://m.c.lnkd.licdn.com/mpr/mpr/p/2/005/07b/08a/018245a.jpg (instead of downloading them). --- qutebrowser/network/networkmanager.py | 50 ++++++++++++++++----------- qutebrowser/utils/http.py | 2 +- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/qutebrowser/network/networkmanager.py b/qutebrowser/network/networkmanager.py index 8b19e8866..43963fcae 100644 --- a/qutebrowser/network/networkmanager.py +++ b/qutebrowser/network/networkmanager.py @@ -19,6 +19,8 @@ """Our own QNetworkAccessManager.""" +from functools import partial + from PyQt5.QtCore import pyqtSlot, PYQT_VERSION, QCoreApplication from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply @@ -35,6 +37,7 @@ import qutebrowser.utils.log as log from qutebrowser.network.qutescheme import QuteSchemeHandler from qutebrowser.network.schemehandler import ErrorNetworkReply from qutebrowser.utils.usertypes import PromptMode +from qutebrowser.utils.http import change_content_type class NetworkManager(QNetworkAccessManager): @@ -137,27 +140,32 @@ class NetworkManager(QNetworkAccessManager): elif scheme in self._scheme_handlers: return self._scheme_handlers[scheme].createRequest( op, req, outgoing_data) + if config.get('network', 'do-not-track'): + dnt = '1'.encode('ascii') else: - 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) - 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: - # 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: + dnt = '0'.encode('ascii') + req.setRawHeader('DNT'.encode('ascii'), dnt) + req.setRawHeader('X-Do-Not-Track'.encode('ascii'), dnt) + 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: + # 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) - self._requests.append(reply) - reply.destroyed.connect(lambda obj: self._requests.remove(obj)) + else: + reply = super().createRequest(op, req, outgoing_data) + self._requests.append(reply) + reply.destroyed.connect(lambda obj: self._requests.remove(obj)) + # Some servers (e.g. the LinkedIn CDN) send a non-standard image/jpg + # header for jpg images. We change this to image/jpeg (defined in RFC + # 1341 section 7.5: https://tools.ietf.org/html/rfc1341) so QtWebKit + # displays this instead of downloading it. + reply.metaDataChanged.connect(partial(change_content_type, reply, + {'image/jpg': 'image/jpeg'})) return reply diff --git a/qutebrowser/utils/http.py b/qutebrowser/utils/http.py index 0491e2eac..5fdb16db3 100644 --- a/qutebrowser/utils/http.py +++ b/qutebrowser/utils/http.py @@ -103,7 +103,7 @@ def change_content_type(reply, mapping): try: content_type = mapping[content_type] except KeyError: - pass + return if rest is not None: header = ';'.join((content_type, rest)) else: