[PATCH v2 2/3] pwclient: Support proxy configuration

Thomas Monjalon thomas.monjalon at 6wind.com
Tue Dec 13 21:37:46 AEDT 2016


The environment variables http_proxy and https_proxy can be used
to configure the HTTP transport.

The TCP connection is made with the proxy host, whereas the original host
is maintained in the HTTP POST URI via "handler" in "send_request".

The send_request() method of xmlrpclib has a different signature
and behaviour in Python 2 and 3.

Fixes #47

Signed-off-by: Thomas Monjalon <thomas.monjalon at 6wind.com>
Reviewed-by: Stephen Finucane <stephen at that.guru>
---
 patchwork/bin/pwclient | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/patchwork/bin/pwclient b/patchwork/bin/pwclient
index 633ffc2..660ed76 100755
--- a/patchwork/bin/pwclient
+++ b/patchwork/bin/pwclient
@@ -107,12 +107,24 @@ class Transport(xmlrpclib.SafeTransport):
     def __init__(self, url):
         xmlrpclib.SafeTransport.__init__(self)
         self.credentials = None
+        self.host = None
+        self.proxy = None
+        self.scheme = url.split('://', 1)[0]
         self.https = url.startswith('https')
+        if self.https:
+            self.proxy = os.environ.get('https_proxy')
+        else:
+            self.proxy = os.environ.get('http_proxy')
+        if self.proxy:
+            self.https = self.proxy.startswith('https')
 
     def set_credentials(self, username=None, password=None):
         self.credentials = '%s:%s' % (username, password)
 
     def make_connection(self, host):
+        self.host = host
+        if self.proxy:
+            host = self.proxy.split('://', 1)[-1]
         if self.credentials:
             host = '@'.join([self.credentials, host])
         if self.https:
@@ -120,6 +132,18 @@ class Transport(xmlrpclib.SafeTransport):
         else:
             return xmlrpclib.Transport.make_connection(self, host)
 
+    if sys.version_info[0] == 2:
+
+        def send_request(self, connection, handler, request_body):
+            handler = '%s://%s%s' % (self.scheme, self.host, handler)
+            xmlrpclib.Transport.send_request(self, connection, handler, request_body)
+
+    else: # Python 3
+
+        def send_request(self, host, handler, request_body, debug):
+            handler = '%s://%s%s' % (self.scheme, host, handler)
+            return xmlrpclib.Transport.send_request(self, host, handler, request_body, debug)
+
 
 def project_id_by_name(rpc, linkname):
     """Given a project short name, look up the Project ID."""
-- 
2.7.0



More information about the Patchwork mailing list