public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Brian Dolbec" <brian.dolbec@gmail.com>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/mirrorselect:master commit in: mirrorselect/
Date: Sat, 19 Oct 2013 09:06:17 +0000 (UTC)	[thread overview]
Message-ID: <1382173498.6a2e7f6c9d72eb4b8f7fafe5239c8c8f18387043.dol-sen@gentoo> (raw)

commit:     6a2e7f6c9d72eb4b8f7fafe5239c8c8f18387043
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 19 09:04:33 2013 +0000
Commit:     Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Sat Oct 19 09:04:58 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/mirrorselect.git;a=commit;h=6a2e7f6c

fix url testing for vhosts that do not handle ip requests.

Migrate to urllib2
Add HTTPError exception handling
Move the code to it's own function in order to handle recursion to test the connection using the hostname url since the ip url failed.

---
 mirrorselect/selectors.py | 60 +++++++++++++++++++++++++++++++++--------------
 1 file changed, 43 insertions(+), 17 deletions(-)

diff --git a/mirrorselect/selectors.py b/mirrorselect/selectors.py
index a3d0baf..d59d601 100644
--- a/mirrorselect/selectors.py
+++ b/mirrorselect/selectors.py
@@ -41,12 +41,14 @@ if sys.version_info[0] >= 3:
 	url_parse = urllib.parse.urlparse
 	url_unparse = urllib.parse.urlunparse
 	url_open = urllib.request.urlopen
+	HTTPError = urllib.HTTPError
 else:
-	import urllib
+	import urllib2
 	import urlparse
 	url_parse = urlparse.urlparse
 	url_unparse = urlparse.urlunparse
-	url_open = urllib.urlopen
+	url_open = urllib2.urlopen
+	HTTPError = urllib2.HTTPError
 
 
 from mirrorselect.output import encoder, get_encoding, decode_selection
@@ -314,21 +316,11 @@ class Deep(object):
 			test_parts = url_parts._replace(netloc=ip)
 			test_url = url_unparse(test_parts)
 			self.output.write('deeptime(): testing url: %s\n' % test_url, 2)
-			try:
-				try:
-					signal.alarm(self._connect_timeout)
-					f = url_open(test_url)
-					break
-				finally:
-					signal.alarm(0)
-			except EnvironmentError as e:
-				self.output.write(('deeptime(): connection to host %s ' + \
-					'failed for ip %s: %s\n') % \
-					(url_parts.hostname, ip, e), 2)
-			except TimeoutException:
-				self.output.write(('deeptime(): connection to host %s ' + \
-					'timed out for ip %s\n') % \
-					(test_parts.hostname, ip), 2)
+
+			f, test_url, early_out = self._test_connection(test_url, url_parts,
+				ip, ips[ips.index(ip):])
+			if early_out:
+				break
 
 		if f is None:
 			self.output.write('deeptime(): unable to ' + \
@@ -395,6 +387,40 @@ class Deep(object):
 		self.output.write('deeptime(): %s seconds for host %s\n' % (delta, url), 2)
 		return (delta, False)
 
+
+	def _test_connection(self, test_url, url_parts, ip, ips):
+		"""Tests the url for a connection, will recurse using
+		the original url instead of the ip if an HTTPError occurs
+		Returns f, test_url, early_out
+		"""
+		early_out = False
+		f = None
+		try:
+			try:
+				signal.alarm(self._connect_timeout)
+				f = url_open(test_url)
+				early_out = True
+			finally:
+				signal.alarm(0)
+		except HTTPError, e:
+			self.output.write(('deeptime(): connection to host %s\n' + \
+				'            returned HTTPError: %s for ip %s\n'  \
+				'            Switching back to original url\n') % \
+				(url_parts.hostname, e, ip), 2)
+			if len(ips) == 1:
+				test_url = url_unparse(url_parts)
+				return self._test_connection(test_url, url_parts, ip, [])
+		except EnvironmentError as e:
+			self.output.write(('deeptime(): connection to host %s ' + \
+				'failed for ip %s:\n            %s\n') % \
+				(url_parts.hostname, ip, e), 2)
+		except TimeoutException:
+			self.output.write(('deeptime(): connection to host %s ' + \
+				'timed out for ip %s\n') % \
+				(url_parts.hostname, ip), 2)
+		return f, test_url, early_out
+
+
 	def _list_add(self, time_host, maxtime, host_dict, maxlen):
 		"""
 		Takes argumets ((time, host), maxtime, host_dict, maxlen)


             reply	other threads:[~2013-10-19  9:06 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-19  9:06 Brian Dolbec [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-05-28  3:48 [gentoo-commits] proj/mirrorselect:master commit in: mirrorselect/ Sam James
2023-08-07  0:23 Sam James
2023-08-07  0:14 Sam James
2023-08-07  0:14 Sam James
2023-08-07  0:14 Sam James
2023-08-06 23:30 Sam James
2023-08-06 23:30 Sam James
2023-07-06  8:05 Sam James
2022-05-31 18:39 Brian Dolbec
2022-05-31 18:39 Brian Dolbec
2022-05-31 18:39 Brian Dolbec
2022-05-31 18:39 Brian Dolbec
2022-05-31  4:08 Brian Dolbec
2022-05-31  4:08 Brian Dolbec
2022-05-31  2:22 Brian Dolbec
2022-05-31  2:22 Brian Dolbec
2022-05-30 23:12 Brian Dolbec
2022-05-30 23:12 Brian Dolbec
2020-06-03 19:05 Brian Dolbec
2019-07-17  5:06 Zac Medico
2019-05-27 17:52 Zac Medico
2019-05-27 17:22 Zac Medico
2019-02-13  8:22 Zac Medico
2019-02-13  8:09 Zac Medico
2019-02-13  5:51 Zac Medico
2018-05-26 15:43 Brian Dolbec
2017-02-21  4:44 Zac Medico
2017-02-21  3:19 Brian Dolbec
2017-02-21  3:19 Brian Dolbec
2016-11-15  1:16 Zac Medico
2015-01-27 18:20 Brian Dolbec
2015-01-27  4:38 Brian Dolbec
2015-01-27  4:38 Brian Dolbec
2014-05-28 21:08 Brian Dolbec
2014-05-28 19:44 Brian Dolbec
2014-05-05  2:04 Brian Dolbec
2014-05-05  2:04 Brian Dolbec
2014-05-05  2:04 Brian Dolbec
2014-03-02  7:44 [gentoo-commits] proj/mirrorselect:ssl " Brian Dolbec
2014-03-02  7:44 ` [gentoo-commits] proj/mirrorselect:master " Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-03-02  7:44 Brian Dolbec
2014-01-31 15:44 [gentoo-commits] proj/mirrorselect:ssl " Brian Dolbec
2014-03-02  7:44 ` [gentoo-commits] proj/mirrorselect:master " Brian Dolbec
2013-10-20 18:19 [gentoo-commits] proj/mirrorselect:ssl " Brian Dolbec
2014-03-02  7:44 ` [gentoo-commits] proj/mirrorselect:master " Brian Dolbec
2013-10-19  9:06 Brian Dolbec
2013-10-19  9:06 Brian Dolbec
2013-10-18 14:26 Brian Dolbec
2013-10-18  6:46 Brian Dolbec
2013-10-18  6:46 Brian Dolbec
2013-10-18  6:46 Brian Dolbec
2013-10-18  6:46 Brian Dolbec
2013-10-17 14:26 Brian Dolbec
2013-10-17  6:57 Brian Dolbec
2013-10-17  3:16 Brian Dolbec
2013-10-17  3:16 Brian Dolbec
2013-10-17  3:16 Brian Dolbec
2013-10-16  9:17 Brian Dolbec
2013-10-16  8:36 Brian Dolbec
2013-10-16  8:36 Brian Dolbec
2013-10-16  8:36 Brian Dolbec
2013-10-16  8:36 Brian Dolbec
2013-10-15 22:43 Brian Dolbec
2013-10-15 14:39 Brian Dolbec
2013-10-15 14:39 Brian Dolbec
2013-10-15 14:39 Brian Dolbec
2013-10-15  7:27 Brian Dolbec
2013-10-15  3:51 Brian Dolbec
2013-10-15  3:51 Brian Dolbec
2013-03-10 13:07 Brian Dolbec
2012-12-16  2:38 Brian Dolbec
2012-12-15 21:25 Brian Dolbec
2012-11-15  3:53 Brian Dolbec
2012-11-15  3:44 Brian Dolbec
2012-11-14 20:28 Paul Varner
2012-11-12 21:41 Brian Dolbec
2012-11-12 20:37 Brian Dolbec
2012-11-12 15:56 Brian Dolbec
2012-11-12  7:46 Brian Dolbec
2012-11-12  7:46 Brian Dolbec
2012-11-12  7:46 Brian Dolbec
2012-11-12  7:46 Brian Dolbec

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1382173498.6a2e7f6c9d72eb4b8f7fafe5239c8c8f18387043.dol-sen@gentoo \
    --to=brian.dolbec@gmail.com \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox