class DownloadsReleaseHandler(BaseHandler):
def get(self, release):
- release = self.releases.get_by_id(release)
+ release = self.releases.get_by_sname(release)
+
+ if not release:
+ release = self.releases.get_by_id(release)
+
if not release:
raise tornado.web.HTTPError(404)
self.render("downloads-development.html", releases=releases)
-class DownloadHandler(BaseHandler):
- def get(self):
- self.render("downloads.html", release=self.releases.get_latest())
-
-
class DownloadAllHandler(BaseHandler):
def get(self):
self.render("downloads-all.html",
class DownloadFileHandler(BaseHandler):
- def head(self, filename):
+ def prepare(self):
self.set_header("Pragma", "no-cache")
- # Get all mirrors...
- mirrors = self.mirrors.get_all()
- mirrors = mirrors.get_with_file(filename)
- mirrors = mirrors.get_with_state("UP")
+ def head(self, filename):
+ self.redirect_to_mirror(filename)
+
+ def get(self, filename):
+ self.redirect_to_mirror(filename, log_download=True)
- if not mirrors:
+ def find_mirror(self, filename):
+ exists = self.mirrors.file_exists(filename)
+ if not exists:
raise tornado.web.HTTPError(404, "File not found: %s" % filename)
# Find mirrors located near to the user.
- # If we have not found any, we use all.
- mirrors_nearby = mirrors.get_for_location(self.request.remote_ip)
- if mirrors_nearby:
- mirrors = mirrors_nearby
+ # If we have not found any, we use a random one.
+ remote_location = self.get_remote_location()
- mirror = mirrors.get_random()
+ if remote_location:
+ mirrors = self.mirrors.get_for_location(remote_location, filename=filename)
- self.redirect(mirror.url + filename[len(mirror.prefix):])
- return mirror
+ if mirrors:
+ return random.choice(mirrors)
- def get(self, filename):
- mirror = self.head(filename)
+ return self.mirrors.get_random(filename=filename)
+
+ def redirect_to_mirror(self, filename, log_download=False):
+ # Find a random mirror.
+ mirror = self.find_mirror(filename)
+
+ # Construct the redirection URL.
+ download_url = mirror.build_url(filename)
+
+ # Redirect the request.
+ self.redirect(download_url)
+
+ if not log_download:
+ return
- # Record the download.
- country_code = self.geoip.get_country(self.request.remote_ip)
- self.mirrors.db.execute("INSERT INTO log_download(filename, mirror, country_code) VALUES(%s, %s, %s)",
- filename, mirror.id, country_code)
+ remote_location = self.get_remote_location()
+ if remote_location:
+ country_code = remote_location.country
+ else:
+ country_code = None
+
+ self.db.execute("INSERT INTO log_download(filename, mirror, country_code) \
+ VALUES(%s, %s, %s)", filename, mirror.id, country_code)
class DownloadCompatHandler(BaseHandler):
def get(self, path, url):
- _filename = None
-
for filename in self.mirrors.get_all_files():
- if filename.endswith("/%s" % url):
- _filename = filename
- break
+ if not filename.endswith("/%s" % url):
+ continue
- if not _filename:
- raise tornado.web.HTTPError(404)
+ self.redirect("/%s" % filename)
+ return
+
+ raise tornado.web.HTTPError(404)
- self.redirect("/%s" % _filename)
class DownloadSplashHandler(BaseHandler):
def get(self):