summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGenki Sky <sky@genki.is>2018-04-21 21:59:09 -0400
committerJelle van der Waa <jelle@vdwaa.nl>2018-04-22 19:39:30 +0200
commita0ce797dedf5e31c6354917c51b16efc1d0508c8 (patch)
treecb04560e08d99d13124ce1afda2f05779db00cc9
parentdad8fa4a842d6e140cb6c31799d01b04bd063b26 (diff)
downloadarchweb-a0ce797dedf5e31c6354917c51b16efc1d0508c8.tar.gz
archweb-a0ce797dedf5e31c6354917c51b16efc1d0508c8.zip
mirrorlist: Accept GET parameters as filters
This fixes a regression. Originally request.REQUEST was used, but django 1.9 removed this. In its stead, request.POST was used unconditionally. However, this results in any GET request returning *all* mirrors, rather than filtering as requested in the parameters. This patch uses POST or GET based on the request method. This fixes the behavior of the [mirror-filter-form], and any scripts depending on the generated URL format. Accordingly, make test_mirrorlist_filter() test both the success and failure cases, rather than just success. [mirror-filter-form]: https://www.archlinux.org/mirrorlist/ Signed-off-by: Genki Sky <sky@genki.is>
-rw-r--r--mirrors/tests/__init__.py11
-rw-r--r--mirrors/tests/test_mirrorlist.py16
-rw-r--r--mirrors/views/mirrorlist.py3
3 files changed, 22 insertions, 8 deletions
diff --git a/mirrors/tests/__init__.py b/mirrors/tests/__init__.py
index fb6c10df..a1d3c2c9 100644
--- a/mirrors/tests/__init__.py
+++ b/mirrors/tests/__init__.py
@@ -1,12 +1,13 @@
from mirrors.models import MirrorUrl, MirrorProtocol, Mirror
-def create_mirror_url():
- mirror = Mirror.objects.create(name='mirror1',
+def create_mirror_url(name='mirror1', country='US',
+ protocol='http', url='https://archlinux.org'):
+ mirror = Mirror.objects.create(name=name,
admin_email='admin@archlinux.org')
- mirror_protocol = MirrorProtocol.objects.create(protocol='http')
- mirror_url = MirrorUrl.objects.create(url='https://archlinux.org',
+ mirror_protocol = MirrorProtocol.objects.create(protocol=protocol)
+ mirror_url = MirrorUrl.objects.create(url=url,
protocol=mirror_protocol,
mirror=mirror,
- country='US')
+ country=country)
return mirror_url
diff --git a/mirrors/tests/test_mirrorlist.py b/mirrors/tests/test_mirrorlist.py
index 5590a966..1ad3d8d5 100644
--- a/mirrors/tests/test_mirrorlist.py
+++ b/mirrors/tests/test_mirrorlist.py
@@ -30,9 +30,21 @@ class MirrorListTest(TestCase):
# TODO: test 200 case
def test_mirrorlist_filter(self):
- response = self.client.get('/mirrorlist/?country=all&protocol=http&ip_version=4')
+ jp_mirror_url = create_mirror_url(
+ name='jp_mirror',
+ country='JP',
+ protocol='https',
+ url='https://wikipedia.jp')
+
+ # First test that we correctly see the above mirror.
+ response = self.client.get('/mirrorlist/?country=JP&protocol=https')
self.assertEqual(response.status_code, 200)
- self.assertIn(self.mirror_url.hostname, response.content)
+ self.assertIn(jp_mirror_url.hostname, response.content)
+
+ # Now confirm that the US mirror did not show up.
+ self.assertNotIn(self.mirror_url.hostname, response.content)
+
+ jp_mirror_url.delete()
def test_generate(self):
response = self.client.get('/mirrorlist/?country=all&protocol=http&ip_version=4')
diff --git a/mirrors/views/mirrorlist.py b/mirrors/views/mirrorlist.py
index 35d59e82..45c01819 100644
--- a/mirrors/views/mirrorlist.py
+++ b/mirrors/views/mirrorlist.py
@@ -55,7 +55,8 @@ class MirrorlistForm(forms.Form):
@csrf_exempt
def generate_mirrorlist(request):
if request.method == 'POST' or len(request.GET) > 0:
- form = MirrorlistForm(data=request.POST)
+ data = request.POST if request.method == 'POST' else request.GET
+ form = MirrorlistForm(data=data)
if form.is_valid():
countries = form.cleaned_data['country']
protocols = form.cleaned_data['protocol']