use pycurl to download image in XHTML when a proxy is configured. Fixes #7037
This commit is contained in:
parent
084f0ed46d
commit
a07829c0a9
2 changed files with 69 additions and 3 deletions
|
@ -191,6 +191,12 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAVE_UPNP_IGD = False
|
HAVE_UPNP_IGD = False
|
||||||
|
|
||||||
|
HAVE_PYCURL = True
|
||||||
|
try:
|
||||||
|
__import__('pycurl')
|
||||||
|
except ImportError:
|
||||||
|
HAVE_PYCURL = False
|
||||||
|
|
||||||
|
|
||||||
gajim_identity = {'type': 'pc', 'category': 'client', 'name': 'Gajim'}
|
gajim_identity = {'type': 'pc', 'category': 'client', 'name': 'Gajim'}
|
||||||
gajim_common_features = [xmpp.NS_BYTESTREAM, xmpp.NS_SI, xmpp.NS_FILE,
|
gajim_common_features = [xmpp.NS_BYTESTREAM, xmpp.NS_SI, xmpp.NS_FILE,
|
||||||
|
|
|
@ -54,6 +54,10 @@ if __name__ == '__main__':
|
||||||
import gtkgui_helpers
|
import gtkgui_helpers
|
||||||
from common import gajim
|
from common import gajim
|
||||||
from gtkgui_helpers import get_icon_pixmap
|
from gtkgui_helpers import get_icon_pixmap
|
||||||
|
from common import helpers
|
||||||
|
|
||||||
|
if gajim.HAVE_PYCURL:
|
||||||
|
import pycurl
|
||||||
|
|
||||||
import tooltips
|
import tooltips
|
||||||
import logging
|
import logging
|
||||||
|
@ -490,9 +494,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler):
|
||||||
tag.title = title
|
tag.title = title
|
||||||
return tag
|
return tag
|
||||||
|
|
||||||
def _get_img(self, attrs):
|
def _get_img_direct(self, attrs):
|
||||||
'''Download an image. This function is launched in a separate thread.
|
"""
|
||||||
'''
|
Download an image. This function is launched in a separate thread.
|
||||||
|
"""
|
||||||
mem, alt = '', ''
|
mem, alt = '', ''
|
||||||
# Wait maximum 5s for connection
|
# Wait maximum 5s for connection
|
||||||
socket.setdefaulttimeout(5)
|
socket.setdefaulttimeout(5)
|
||||||
|
@ -544,6 +549,61 @@ class HtmlHandler(xml.sax.handler.ContentHandler):
|
||||||
break
|
break
|
||||||
return (mem, alt)
|
return (mem, alt)
|
||||||
|
|
||||||
|
def _get_img_proxy(self, attrs, proxy):
|
||||||
|
"""
|
||||||
|
Download an image through a proxy. This function is launched in a
|
||||||
|
separate thread.
|
||||||
|
"""
|
||||||
|
if not gajim.HAVE_PYCURL:
|
||||||
|
return '', _('PyCURL is not installed')
|
||||||
|
mem, alt = '', ''
|
||||||
|
try:
|
||||||
|
b = StringIO()
|
||||||
|
c = pycurl.Curl()
|
||||||
|
c.setopt(pycurl.URL, attrs['src'].encode('utf-8'))
|
||||||
|
c.setopt(pycurl.FOLLOWLOCATION, 1)
|
||||||
|
c.setopt(pycurl.CONNECTTIMEOUT, 5)
|
||||||
|
c.setopt(pycurl.TIMEOUT, 10)
|
||||||
|
c.setopt(pycurl.MAXFILESIZE, 2000000)
|
||||||
|
c.setopt(pycurl.WRITEFUNCTION, b.write)
|
||||||
|
c.setopt(pycurl.USERAGENT, 'Gajim ' + gajim.version)
|
||||||
|
# set proxy
|
||||||
|
c.setopt(pycurl.PROXY, proxy['host'].encode('utf-8'))
|
||||||
|
c.setopt(pycurl.PROXYPORT, proxy['port'])
|
||||||
|
if proxy['useauth']:
|
||||||
|
c.setopt(pycurl.PROXYUSERPWD, proxy['user'].encode('utf-8')\
|
||||||
|
+ ':' + proxy['pass'].encode('utf-8'))
|
||||||
|
c.setopt(pycurl.PROXYAUTH, pycurl.HTTPAUTH_ANY)
|
||||||
|
if proxy['type'] == 'http':
|
||||||
|
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_HTTP)
|
||||||
|
elif proxy['type'] == 'socks5':
|
||||||
|
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
|
||||||
|
x = c.perform()
|
||||||
|
c.close()
|
||||||
|
t = b.getvalue()
|
||||||
|
return (t, attrs.get('alt', ''))
|
||||||
|
except pycurl.error, ex:
|
||||||
|
alt = attrs.get('alt', '')
|
||||||
|
if alt:
|
||||||
|
alt += '\n'
|
||||||
|
if ex[0] == pycurl.E_FILESIZE_EXCEEDED:
|
||||||
|
alt += _('Image is too big')
|
||||||
|
elif ex[0] == pycurl.E_OPERATION_TIMEOUTED:
|
||||||
|
alt += _('Timeout loading image')
|
||||||
|
else:
|
||||||
|
alt += _('Error loading image')
|
||||||
|
except Exception, ex:
|
||||||
|
log.debug('Error loading image %s ' % attrs['src'] + str(ex))
|
||||||
|
pixbuf = None
|
||||||
|
alt = attrs.get('alt', 'Broken image')
|
||||||
|
return ('', alt)
|
||||||
|
|
||||||
|
def _get_img(self, attrs):
|
||||||
|
proxy = helpers.get_proxy_info(self.conv_textview.account)
|
||||||
|
if proxy and proxy['type'] in ('http', 'socks5'):
|
||||||
|
return self._get_img_proxy(attrs, proxy)
|
||||||
|
return self._get_img_direct(attrs)
|
||||||
|
|
||||||
def _update_img(self, (mem, alt), attrs, img_mark):
|
def _update_img(self, (mem, alt), attrs, img_mark):
|
||||||
'''Callback function called after the function _get_img above.
|
'''Callback function called after the function _get_img above.
|
||||||
'''
|
'''
|
||||||
|
|
Loading…
Add table
Reference in a new issue