]> git.ipfire.org Git - ipfire.org.git/blame - src/web/download.py
Deploy rate-limiting
[ipfire.org.git] / src / web / download.py
CommitLineData
e77cd04c
MT
1#!/usr/bin/python
2
f110a9ff 3import logging
e77cd04c
MT
4import tornado.web
5
124a8404 6from . import base
e77cd04c
MT
7
8class 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
7e8e995d
MT
14 # Cache this response for one minute
15 self.set_expires(60)
16
63e1f3a3
MT
17 # Redirect to latest release page
18 self.redirect("/download/%s" % release.slug)
e77cd04c
MT
19
20
21class 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
7e8e995d
MT
27 # Cache this response for ten minutes
28 self.set_expires(600)
29
e77cd04c
MT
30 self.render("download/release.html", release=release)
31
32
5cf65b4f
MT
33class ReleaseRedirectHandler(base.BaseHandler):
34 def get(self, release):
35 self.redirect("https://www.ipfire.org/download/%s" % release, permanent=True)
36
37
ed8116c7
MT
38class FileHandler(base.BaseHandler):
39 def prepare(self):
40 self.set_header("Pragma", "no-cache")
41
cfe7d74c 42 @base.blacklisted
372ef119 43 @base.ratelimit(minutes=5, requests=10)
ed8116c7 44 def get(self, filename):
f110a9ff
MT
45 mirror = self.backend.mirrors.get_for_download(filename,
46 country_code=self.current_country_code)
ed8116c7 47
f110a9ff
MT
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)
ed8116c7 51
f110a9ff
MT
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")
ed8116c7 56
f110a9ff
MT
57 # Log something
58 logging.info("Sending client from %s to %s" % (self.current_country_code or "unknown", url))
ed8116c7 59
f110a9ff
MT
60 # Redirect the request
61 self.redirect(url)
ed8116c7 62
f110a9ff
MT
63 # Allow HEAD
64 head = get
6a9bfbc9
MT
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)