]> git.ipfire.org Git - ipfire.org.git/blob - src/web/download.py
downloads: Cache pages
[ipfire.org.git] / src / web / download.py
1 #!/usr/bin/python
2
3 import random
4 import tornado.web
5
6 from . import handlers_base as base
7
8 from . import ui_modules
9
10 class 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
16 # Cache this response for one minute
17 self.set_expires(60)
18
19 # Redirect to latest release page
20 self.redirect("/download/%s" % release.slug)
21
22
23 class 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
29 # Cache this response for ten minutes
30 self.set_expires(600)
31
32 self.render("download/release.html", release=release)
33
34
35 class 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)