This started off from noticing that mirrorlist grab does not have a timeout and thus may "hang" indefinitely, but while at it there was a bunch of other useful options missing from that call and the options were unnecessarily copied in several places. --- yum/yumRepo.py | 88 ++++++++++++++++++++----------------------------------- 1 files changed, 32 insertions(+), 56 deletions(-)
diff --git a/yum/yumRepo.py b/yum/yumRepo.py index 765a595..101b64e 100644 --- a/yum/yumRepo.py +++ b/yum/yumRepo.py @@ -453,12 +453,14 @@ class YumRepository(Repository, config.RepoConf): self._proxy_dict['https'] = proxy_string self._proxy_dict['ftp'] = proxy_string - def __headersListFromDict(self): + def __headersListFromDict(self, cache=True): """Convert our dict of headers to a list of 2-tuples for urlgrabber.""" headers = [] for key in self.http_headers: headers.append((key, self.http_headers[key])) + if not (cache or 'Pragma' in self.http_headers): + headers.append(('Pragma', 'no-cache')) return headers @@ -476,31 +478,34 @@ class YumRepository(Repository, config.RepoConf): else: mgclass = urlgrabber.mirror.MirrorGroup - headers = tuple(self.__headersListFromDict()) - - self._grabfunc = URLGrabber(keepalive=self.keepalive, - bandwidth=self.bandwidth, - retry=self.retries, - throttle=self.throttle, - progress_obj=self.callback, - proxies = self.proxy_dict, + ugopts = self._default_grabopts() + self._grabfunc = URLGrabber(progress_obj=self.callback, failure_callback=self.failure_obj, interrupt_callback=self.interrupt_callback, - timeout=self.timeout, copy_local=self.copy_local, - http_headers=headers, reget='simple', - ssl_verify_peer=self.sslverify, - ssl_verify_host=self.sslverify, - ssl_ca_cert=self.sslcacert, - ssl_cert=self.sslclientcert, - ssl_key=self.sslclientkey) - - self._grabfunc.opts.user_agent = default_grabber.opts.user_agent + **ugopts) self._grab = mgclass(self._grabfunc, self.urls, failure_callback=self.mirror_failure_obj) + def _default_grabopts(self, cache=True): + opts = { 'keepalive': self.keepalive, + 'bandwidth': self.bandwidth, + 'retry': self.retries, + 'throttle': self.throttle, + 'proxies': self.proxy_dict, + 'timeout': self.timeout, + 'http_headers': tuple(self.__headersListFromDict(cache=cache)), + 'ssl_verify_peer': self.sslverify, + 'ssl_verify_host': self.sslverify, + 'ssl_ca_cert': self.sslcacert, + 'ssl_cert': self.sslclientcert, + 'ssl_key': self.sslclientkey, + 'user_agent': default_grabber.opts.user_agent, + } + return opts + def _getgrabfunc(self): if not self._grabfunc or self._callbacks_changed: self._setupGrab() @@ -681,18 +686,9 @@ class YumRepository(Repository, config.RepoConf): local = self.metalink_filename + '.tmp' if not self._metalinkCurrent(): url = misc.to_utf8(self.metalink) + ugopts = self._default_grabopts() try: - ug = URLGrabber(bandwidth = self.bandwidth, - retry = self.retries, - throttle = self.throttle, - progress_obj = self.callback, - proxies=self.proxy_dict, - ssl_verify_peer=self.sslverify, - ssl_verify_host=self.sslverify, - ssl_ca_cert=self.sslcacert, - ssl_cert=self.sslclientcert, - ssl_key=self.sslclientkey) - ug.opts.user_agent = default_grabber.opts.user_agent + ug = URLGrabber(progress_obj = self.callback, **ugopts) result = ug.urlgrab(url, local, text=self.id + "/metalink") except urlgrabber.grabber.URLGrabError, e: @@ -738,15 +734,6 @@ class YumRepository(Repository, config.RepoConf): # if url is None do a grab via the mirror group/grab for the repo # return the path to the local file - # Turn our dict into a list of 2-tuples - headers = self.__headersListFromDict() - - # We will always prefer to send no-cache. - if not (cache or 'Pragma' in self.http_headers): - headers.append(('Pragma', 'no-cache')) - - headers = tuple(headers) - # if copylocal isn't specified pickup the repo-defined attr if copy_local is None: copy_local = self.copy_local @@ -782,28 +769,15 @@ class YumRepository(Repository, config.RepoConf): verbose_logger.log(logginglevels.DEBUG_2, "Error getting package from media; falling back to url %s" %(e,)) if url and scheme != "media": - ug = URLGrabber(keepalive = self.keepalive, - bandwidth = self.bandwidth, - retry = self.retries, - throttle = self.throttle, - progress_obj = self.callback, + ugopts = self._default_grabopts(cache=False) + ug = URLGrabber(progress_obj = self.callback, copy_local = copy_local, reget = reget, - proxies = self.proxy_dict, failure_callback = self.failure_obj, interrupt_callback=self.interrupt_callback, - timeout=self.timeout, checkfunc=checkfunc, - http_headers=headers, - ssl_verify_peer=self.sslverify, - ssl_verify_host=self.sslverify, - ssl_ca_cert=self.sslcacert, - ssl_cert=self.sslclientcert, - ssl_key=self.sslclientkey, - size=size - ) - - ug.opts.user_agent = default_grabber.opts.user_agent + size=size, + **ugopts) remote = url + '/' + relative @@ -824,6 +798,7 @@ class YumRepository(Repository, config.RepoConf): else: + headers = tuple(self.__headersListFromDict(cache=False)) try: result = self.grab.urlgrab(misc.to_utf8(relative), local, text = misc.to_utf8(text), @@ -1687,8 +1662,9 @@ class YumRepository(Repository, config.RepoConf): scheme = urlparse.urlparse(url)[0] if scheme == '': url = 'file://' + url + ugopts = self._default_grabopts() try: - fo = urlgrabber.grabber.urlopen(url, proxies=self.proxy_dict) + fo = urlgrabber.grabber.urlopen(url, **ugopts) except urlgrabber.grabber.URLGrabError, e: print "Could not retrieve mirrorlist %s error was\n%s: %s" % (url, e.args[0], misc.to_unicode(e.args[1])) fo = None -- 1.6.2.5 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel