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