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).
This commit is contained in:
Florian Bruhin 2014-08-12 09:57:40 +02:00
parent 7be3976890
commit bad9031914
2 changed files with 30 additions and 22 deletions

View File

@ -19,6 +19,8 @@
"""Our own QNetworkAccessManager.""" """Our own QNetworkAccessManager."""
from functools import partial
from PyQt5.QtCore import pyqtSlot, PYQT_VERSION, QCoreApplication from PyQt5.QtCore import pyqtSlot, PYQT_VERSION, QCoreApplication
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply 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.qutescheme import QuteSchemeHandler
from qutebrowser.network.schemehandler import ErrorNetworkReply from qutebrowser.network.schemehandler import ErrorNetworkReply
from qutebrowser.utils.usertypes import PromptMode from qutebrowser.utils.usertypes import PromptMode
from qutebrowser.utils.http import change_content_type
class NetworkManager(QNetworkAccessManager): class NetworkManager(QNetworkAccessManager):
@ -137,27 +140,32 @@ class NetworkManager(QNetworkAccessManager):
elif scheme in self._scheme_handlers: elif scheme in self._scheme_handlers:
return self._scheme_handlers[scheme].createRequest( return self._scheme_handlers[scheme].createRequest(
op, req, outgoing_data) op, req, outgoing_data)
if config.get('network', 'do-not-track'):
dnt = '1'.encode('ascii')
else: else:
if config.get('network', 'do-not-track'): dnt = '0'.encode('ascii')
dnt = '1'.encode('ascii') req.setRawHeader('DNT'.encode('ascii'), dnt)
else: req.setRawHeader('X-Do-Not-Track'.encode('ascii'), dnt)
dnt = '0'.encode('ascii') accept_language = config.get('network', 'accept-language')
req.setRawHeader('DNT'.encode('ascii'), dnt) if accept_language is not None:
req.setRawHeader('X-Do-Not-Track'.encode('ascii'), dnt) req.setRawHeader('Accept-Language'.encode('ascii'),
accept_language = config.get('network', 'accept-language') accept_language.encode('ascii'))
if accept_language is not None: if PYQT_VERSION < 0x050301:
req.setRawHeader('Accept-Language'.encode('ascii'), # If we don't disable our message handler, we get a freeze if a
accept_language.encode('ascii')) # warning is printed due to a PyQt bug, e.g. when clicking a
if PYQT_VERSION < 0x050301: # currency on http://ch.mouser.com/localsites/
# 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 # See http://www.riverbankcomputing.com/pipermail/pyqt/2014-June/034420.html
# currency on http://ch.mouser.com/localsites/ with log.disable_qt_msghandler():
#
# 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) reply = super().createRequest(op, req, outgoing_data)
self._requests.append(reply) else:
reply.destroyed.connect(lambda obj: self._requests.remove(obj)) 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 return reply

View File

@ -103,7 +103,7 @@ def change_content_type(reply, mapping):
try: try:
content_type = mapping[content_type] content_type = mapping[content_type]
except KeyError: except KeyError:
pass return
if rest is not None: if rest is not None:
header = ';'.join((content_type, rest)) header = ';'.join((content_type, rest))
else: else: