Skip to content
Snippets Groups Projects
Commit 1553ea76 authored by Antoine Lambert's avatar Antoine Lambert
Browse files

Add url redirections for uppercase sha1s (WIP)

parent 0d8b3362
No related branches found
No related tags found
No related merge requests found
......@@ -56,12 +56,14 @@ class api_route(object): # noqa: N801
def __init__(self, url_pattern=None, view_name=None,
methods=['GET', 'HEAD', 'OPTIONS'],
throttle_scope='swh_api',
api_version='1'):
api_version='1',
checksum_args=None):
super().__init__()
self.url_pattern = '^' + api_version + url_pattern + '$'
self.view_name = view_name
self.methods = methods
self.throttle_scope = throttle_scope
self.checksum_args = checksum_args
def __call__(self, f):
# create a DRF view from the wrapped function
......@@ -76,4 +78,9 @@ class api_route(object): # noqa: N801
# register the route and its view in the endpoints index
APIUrls.add_url_pattern(self.url_pattern, api_view_f,
self.view_name)
if self.checksum_args:
APIUrls.add_redirect_for_checksum_args(self.view_name,
[self.url_pattern],
self.checksum_args)
return f
......@@ -10,9 +10,11 @@ from swh.web.api.apiurls import api_route
from swh.web.api.views.utils import api_lookup
@api_route(r'/directory/(?P<sha1_git>[0-9a-f]+)/', 'api-directory')
@api_route(r'/directory/(?P<sha1_git>[0-9a-f]+)/', 'api-directory',
checksum_args=['sha1_git'])
@api_route(r'/directory/(?P<sha1_git>[0-9a-f]+)/(?P<path>.+)/',
'api-directory')
'api-directory',
checksum_args=['sha1_git'])
@api_doc('/directory/')
def api_directory(request, sha1_git, path=None):
"""
......
......@@ -24,9 +24,10 @@ class browse_route(object): # noqa: N801
reverse the url
""" # noqa
def __init__(self, *url_patterns, view_name=None):
def __init__(self, *url_patterns, view_name=None, checksum_args=None):
super().__init__()
self.url_patterns = []
self.checksum_args = checksum_args
for url_pattern in url_patterns:
self.url_patterns.append('^' + url_pattern + '$')
self.view_name = view_name
......@@ -35,4 +36,10 @@ class browse_route(object): # noqa: N801
# register the route and its view in the browse endpoints index
for url_pattern in self.url_patterns:
BrowseUrls.add_url_pattern(url_pattern, f, self.view_name)
if self.checksum_args:
BrowseUrls.add_redirect_for_checksum_args(self.view_name,
self.url_patterns,
self.checksum_args)
return f
......@@ -23,7 +23,8 @@ from swh.web.browse.browseurls import browse_route
@browse_route(r'directory/(?P<sha1_git>[0-9a-f]+)/',
r'directory/(?P<sha1_git>[0-9a-f]+)/(?P<path>.+)/',
view_name='browse-directory')
view_name='browse-directory',
checksum_args=['sha1_git'])
def directory_browse(request, sha1_git, path=None):
"""Django view for browsing the content of a directory identified
by its sha1_git value.
......
......@@ -4,6 +4,7 @@
# See top-level LICENSE file for more information
from django.conf.urls import url
from django.shortcuts import redirect
class UrlsIndex(object):
......@@ -19,7 +20,7 @@ class UrlsIndex(object):
scope = 'default'
@classmethod
def add_url_pattern(cls, url_pattern, view, view_name):
def add_url_pattern(cls, url_pattern, view, view_name=None):
"""
Class method that adds an url pattern to the current scope.
......@@ -36,6 +37,23 @@ class UrlsIndex(object):
else:
cls._urlpatterns[cls.scope].append(url(url_pattern, view))
@classmethod
def add_redirect_for_checksum_args(cls, view_name, url_patterns,
checksum_args):
new_view_name = view_name+'-uppercase-checksum'
for url_pattern in url_patterns:
url_pattern_upper = url_pattern.replace('[0-9a-f]',
'[0-9a-fA-F]')
def view_redirect(request, *args, **kwargs):
for checksum_arg in checksum_args:
checksum_upper = kwargs[checksum_arg]
kwargs[checksum_arg] = checksum_upper.lower()
return redirect(view_name, *args, **kwargs)
cls.add_url_pattern(url_pattern_upper, view_redirect,
new_view_name)
@classmethod
def get_url_patterns(cls):
"""
......
......@@ -74,6 +74,19 @@ class DirectoryApiTestCase(WebTestCase, APITestCase):
'reason': ('Directory entry with path %s from %s not found'
% (path, directory))})
@given(directory())
def test_api_directory_uppercase(self, directory):
url = reverse('api-directory-uppercase-checksum',
url_args={'sha1_git': directory.upper()})
resp = self.client.get(url)
self.assertEqual(resp.status_code, 302)
redirect_url = reverse('api-directory',
url_args={'sha1_git': directory})
self.assertEqual(resp['location'], redirect_url)
@classmethod
def _enrich_dir_data(cls, dir_data):
if dir_data['type'] == 'file':
......
......@@ -116,3 +116,16 @@ class SwhBrowseDirectoryTest(WebTestCase):
resp = self.client.get(dir_url)
self.assertEqual(resp.status_code, 404)
self.assertTemplateUsed('browse/error.html')
@given(directory())
def test_directory_uppercase(self, directory):
url = reverse('browse-directory-uppercase-checksum',
url_args={'sha1_git': directory.upper()})
resp = self.client.get(url)
self.assertEqual(resp.status_code, 302)
redirect_url = reverse('browse-directory',
url_args={'sha1_git': directory})
self.assertEqual(resp['location'], redirect_url)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment