|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a network proxy factory. |
|
8 """ |
|
9 |
|
10 import sys |
|
11 import os |
|
12 |
|
13 from PyQt4.QtCore import QUrl |
|
14 from PyQt4.QtGui import QMessageBox |
|
15 from PyQt4.QtNetwork import QNetworkProxyFactory, QNetworkProxy, QNetworkProxyQuery |
|
16 |
|
17 import Preferences |
|
18 |
|
19 class E5NetworkProxyFactory(QNetworkProxyFactory): |
|
20 """ |
|
21 Class implementing a network proxy factory. |
|
22 """ |
|
23 def __init__(self): |
|
24 """ |
|
25 Constructor |
|
26 """ |
|
27 QNetworkProxyFactory.__init__(self) |
|
28 |
|
29 def queryProxy(self, query): |
|
30 """ |
|
31 Public method to determine a proxy for a given query. |
|
32 |
|
33 @param query reference to the query object (QNetworkProxyQuery) |
|
34 @return list of proxies in order of preference (list of QNetworkProxy) |
|
35 """ |
|
36 if query.queryType() == QNetworkProxyQuery.UrlRequest and \ |
|
37 query.protocolTag() in ["http", "https", "ftp"] and \ |
|
38 Preferences.getUI("UseProxy"): |
|
39 if Preferences.getUI("UseSystemProxy"): |
|
40 proxyList = QNetworkProxyFactory.systemProxyForQuery(query) |
|
41 if sys.platform not in ["darwin", "nt"] and \ |
|
42 len(proxyList) == 1 and \ |
|
43 proxyList[0].type() == QNetworkProxy.NoProxy: |
|
44 # try it the Python way |
|
45 # scan the environment for variables named <scheme>_proxy |
|
46 # scan over whole environment to make this case insensitive |
|
47 for name, value in os.environ.items(): |
|
48 name = name.lower() |
|
49 if value and name[-6:] == '_proxy' and \ |
|
50 name[:-6] == query.protocolTag().lower(): |
|
51 url = QUrl(value) |
|
52 if url.scheme() in ["http", "https"]: |
|
53 proxyType = QNetworkProxy.HttpProxy |
|
54 else: |
|
55 proxyType = QNetworkProxy.FtpCachingProxy |
|
56 proxy = QNetworkProxy(proxyType, url.host(), url.port(), |
|
57 url.userName(), url.password()) |
|
58 proxyList = [proxy] |
|
59 break |
|
60 return proxyList |
|
61 else: |
|
62 host = Preferences.getUI("ProxyHost") |
|
63 if not host: |
|
64 QMessageBox.critical(None, |
|
65 self.trUtf8("Proxy Configuration Error"), |
|
66 self.trUtf8("""Proxy usage was activated""" |
|
67 """ but no proxy host configured.""")) |
|
68 return [QNetworkProxy(QNetworkProxy.DefaultProxy)] |
|
69 else: |
|
70 pProxyType = Preferences.getUI("ProxyType") |
|
71 if pProxyType == 0: |
|
72 proxyType = QNetworkProxy.HttpProxy |
|
73 elif pProxyType == 1: |
|
74 proxyType = QNetworkProxy.HttpCachingProxy |
|
75 elif pProxyType == 2: |
|
76 proxyType = QNetworkProxy.Socks5Proxy |
|
77 proxy = QNetworkProxy(proxyType, host, |
|
78 Preferences.getUI("ProxyPort"), |
|
79 Preferences.getUI("ProxyUser"), |
|
80 Preferences.getUI("ProxyPassword")) |
|
81 return [proxy, QNetworkProxy(QNetworkProxy.DefaultProxy)] |
|
82 else: |
|
83 return [QNetworkProxy(QNetworkProxy.NoProxy)] |