]> git.ipfire.org Git - ipfire.org.git/blame - src/web/download.py
Redirect to right host when no avatar image is available
[ipfire.org.git] / src / web / download.py
CommitLineData
e77cd04c
MT
1#!/usr/bin/python
2
ed8116c7 3import random
e77cd04c
MT
4import tornado.web
5
6from . import handlers_base as base
7
8from . import ui_modules
9
10class IndexHandler(base.BaseHandler):
11 def get(self):
12 release = self.backend.releases.get_latest()
13 if not release:
14 raise tornado.web.HTTPError(404)
15
7e8e995d
MT
16 # Cache this response for one minute
17 self.set_expires(60)
18
63e1f3a3
MT
19 # Redirect to latest release page
20 self.redirect("/download/%s" % release.slug)
e77cd04c
MT
21
22
23class ReleaseHandler(base.BaseHandler):
24 def get(self, slug):
25 release = self.backend.releases.get_by_sname(slug)
26 if not release:
27 raise tornado.web.HTTPError(404)
28
7e8e995d
MT
29 # Cache this response for ten minutes
30 self.set_expires(600)
31
e77cd04c
MT
32 self.render("download/release.html", release=release)
33
34
ed8116c7
MT
35class FileHandler(base.BaseHandler):
36 def prepare(self):
37 self.set_header("Pragma", "no-cache")
38
39 def head(self, filename):
40 self.redirect_to_mirror(filename)
41
42 def get(self, filename):
43 self.redirect_to_mirror(filename, log_download=True)
44
45 def find_mirror(self, filename):
46 exists = self.mirrors.file_exists(filename)
47 if not exists:
48 raise tornado.web.HTTPError(404, "File not found: %s" % filename)
49
50 # Find mirrors located near to the user.
51 # If we have not found any, we use a random one.
52 remote_location = self.get_remote_location()
53
54 if remote_location:
55 mirrors = self.mirrors.get_for_location(remote_location, filename=filename)
56
57 if mirrors:
58 return random.choice(mirrors)
59
60 return self.mirrors.get_random(filename=filename)
61
62 def redirect_to_mirror(self, filename, log_download=False):
63 # Find a random mirror.
64 mirror = self.find_mirror(filename)
65
66 # Construct the redirection URL.
67 download_url = mirror.build_url(filename)
68
69 # Redirect the request.
70 self.redirect(download_url)
71
72 if not log_download:
73 return
74
75 remote_location = self.get_remote_location()
76 if remote_location:
77 country_code = remote_location.country
78 else:
79 country_code = None
80
81 self.db.execute("INSERT INTO log_download(filename, mirror, country_code) \
82 VALUES(%s, %s, %s)", filename, mirror.id, country_code)