[Toaster] [RFC PATCH] toaster: support authentication required proxy connection

Bian Naimeng biannm at cn.fujitsu.com
Thu Aug 20 03:18:31 PDT 2015


Make sure layersource can be downloaded from authentication required proxy connection.

Signed-off-by: Bian Naimeng <biannm at cn.fujitsu.com>
---
 lib/toaster/orm/models.py | 58 ++++++++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 26 deletions(-)

diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py
index 92fcaa7..8371d9b 100644
--- a/lib/toaster/orm/models.py
+++ b/lib/toaster/orm/models.py
@@ -817,7 +817,7 @@ class LayerIndexLayerSource(LayerSource):
         assert self.apiurl is not None
         from django.db import transaction, connection
 
-        import httplib, urlparse, json
+        import httplib2, urlparse, json
         import os
         proxy_settings = os.environ.get("http_proxy", None)
 
@@ -825,34 +825,40 @@ class LayerIndexLayerSource(LayerSource):
             conn = None
             _parsedurl = urlparse.urlparse(apiurl)
             path = _parsedurl.path
-            query = _parsedurl.query
-            def parse_url(url):
-                parsedurl = urlparse.urlparse(url)
+
+            def get_nameserver_ip():
+                from os import path
+                # Get Nameserver from /etc/resolv.conf
+                RESOLV_CONF="/etc/resolv.conf"
+                if not path.isfile(RESOLV_CONF):
+                    logger.info("%s does not exist" % RESOLV_CONF)
+                    return None
+
+                fh = None
                 try:
-                    (host, port) = parsedurl.netloc.split(":")
-                except ValueError:
-                    host = parsedurl.netloc
-                    port = None
+                    fh = open(RESOLV_CONF, 'r')
+                    for line in fh:
+                        if not line.startswith('nameserver'):
+                            continue
+                        return line.strip().split()[-1]
+                finally:
+                    if fh is not None:
+                        fh.close()
+                return None
+
+            pi = None
+            if proxy_settings is not None:
+                pi = httplib2.proxy_info_from_environment()
+                rdns = get_nameserver_ip()
+                if rdns is not None:
+                    pi.proxy_rdns = rdns
 
-                if port is None:
-                    port = 80
-                else:
-                    port = int(port)
-                return (host, port)
+            httpcon = httplib2.Http(proxy_info=pi)
+            res, content = httpcon.request(apiurl, 'GET')
 
-            if proxy_settings is None:
-                host, port = parse_url(apiurl)
-                conn = httplib.HTTPConnection(host, port)
-                conn.request("GET", path + "?" + query)
-            else:
-                host, port = parse_url(proxy_settings)
-                conn = httplib.HTTPConnection(host, port)
-                conn.request("GET", apiurl)
-
-            r = conn.getresponse()
-            if r.status != 200:
-                raise Exception("Failed to read " + path + ": %d %s" % (r.status, r.reason))
-            return json.loads(r.read())
+            if res.status != 200:
+                raise Exception("Failed to read " + path + ": %d %s" % (res.status, res.reason))
+            return json.loads(content)
 
         # verify we can get the basic api
         try:
-- 
1.9.1



More information about the toaster mailing list