]> git.ipfire.org Git - ipfire.org.git/blob - src/web/downloads.py
donation: Fix typo
[ipfire.org.git] / src / web / downloads.py
1 #!/usr/bin/python
2
3 import logging
4 import tornado.web
5
6 from . import base
7
8 class IndexHandler(base.AnalyticsMixin, base.BaseHandler):
9 def get(self):
10 release = self.backend.releases.get_latest()
11 if not release:
12 raise tornado.web.HTTPError(404)
13
14 # Redirect to latest release page
15 self.redirect("/downloads/%s" % release.slug)
16
17
18 class MirrorsHandler(base.AnalyticsMixin, base.BaseHandler):
19 def get(self):
20 mirrors = self.backend.mirrors.get_by_countries()
21 if not mirrors:
22 raise tornado.web.HTTPError(404)
23
24 self.render("downloads/mirrors.html", mirrors=mirrors)
25
26
27 class ReleaseHandler(base.AnalyticsMixin, base.BaseHandler):
28 def get(self, slug):
29 release = self.backend.releases.get_by_sname(slug)
30 if not release:
31 raise tornado.web.HTTPError(404)
32
33 self.render("downloads/release.html", release=release)
34
35
36 class ThankYouHandler(base.AnalyticsMixin, base.BaseHandler):
37 def get(self):
38 self.render("downloads/thank-you.html")
39
40
41 class FileHandler(base.AnalyticsMixin, base.BaseHandler):
42 def prepare(self):
43 self.set_header("Pragma", "no-cache")
44
45 @base.ratelimit(minutes=5, requests=10)
46 def get(self, filename):
47 mirror = self.backend.mirrors.get_for_download(filename,
48 country_code=self.current_country_code)
49
50 # Send 404 if no mirror was found
51 if not mirror:
52 raise tornado.web.HTTPError(404, "Could not find a mirror for %s" % filename)
53
54 # Construct the redirection URL
55 url = mirror.build_url(filename)
56 if not url:
57 raise tornado.web.HTTPError(500, "Could not get download URL")
58
59 # Log something
60 logging.info("Sending client from %s to %s" % (self.current_country_code or "unknown", url))
61
62 # Redirect the request
63 self.redirect(url)
64
65 # Allow HEAD
66 head = get
67
68 def write_error(self, status_code, **kwargs):
69 """
70 Since we cannot deliver any CSS or similar here,
71 we will have to redirect the user back to the main page
72 """
73 self.redirect("https://www.ipfire.org/error/%s" % status_code)