Fix #1056 - Add flag to accept URLs without a trailing slash

This commit is contained in:
Jessica Tallon 2014-12-12 13:55:14 +00:00
parent 058964bce7
commit c7c26b1740
3 changed files with 60 additions and 37 deletions

View File

@ -20,74 +20,87 @@ from mediagoblin.tools.routing import add_route
add_route(
"mediagoblin.federation.user",
"/api/user/<string:username>/",
"mediagoblin.federation.views:user_endpoint"
"mediagoblin.federation.views:user_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.user.profile",
"/api/user/<string:username>/profile",
"mediagoblin.federation.views:profile_endpoint"
"/api/user/<string:username>/profile/",
"mediagoblin.federation.views:profile_endpoint",
match_slash=False
)
# Inbox and Outbox (feed)
add_route(
"mediagoblin.federation.feed",
"/api/user/<string:username>/feed",
"mediagoblin.federation.views:feed_endpoint"
"/api/user/<string:username>/feed/",
"mediagoblin.federation.views:feed_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.user.uploads",
"/api/user/<string:username>/uploads",
"mediagoblin.federation.views:uploads_endpoint"
"/api/user/<string:username>/uploads/",
"mediagoblin.federation.views:uploads_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.inbox",
"/api/user/<string:username>/inbox",
"mediagoblin.federation.views:inbox_endpoint"
"/api/user/<string:username>/inbox/",
"mediagoblin.federation.views:inbox_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.inbox_minor",
"/api/user/<string:username>/inbox/minor",
"mediagoblin.federation.views:inbox_minor_endpoint"
"/api/user/<string:username>/inbox/minor/",
"mediagoblin.federation.views:inbox_minor_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.inbox_major",
"/api/user/<string:username>/inbox/major",
"mediagoblin.federation.views:inbox_major_endpoint"
"/api/user/<string:username>/inbox/major/",
"mediagoblin.federation.views:inbox_major_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.inbox_direct",
"/api/user/<string:username>/inbox/direct",
"mediagoblin.federation.views:inbox_endpoint"
"/api/user/<string:username>/inbox/direct/",
"mediagoblin.federation.views:inbox_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.inbox_direct_minor",
"/api/user/<string:username>/inbox/direct/minor",
"mediagoblin.federation.views:inbox_minor_endpoint"
"mediagoblin.federation.views:inbox_minor_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.inbox_direct_major",
"/api/user/<string:username>/inbox/direct/major",
"mediagoblin.federation.views:inbox_major_endpoint"
"mediagoblin.federation.views:inbox_major_endpoint",
match_slash=False
)
# object endpoints
add_route(
"mediagoblin.federation.object",
"/api/<string:object_type>/<string:id>",
"mediagoblin.federation.views:object_endpoint"
)
"/api/<string:object_type>/<string:id>/",
"mediagoblin.federation.views:object_endpoint",
match_slash=False
)
add_route(
"mediagoblin.federation.object.comments",
"/api/<string:object_type>/<string:id>/comments",
"mediagoblin.federation.views:object_comments"
"/api/<string:object_type>/<string:id>/comments/",
"mediagoblin.federation.views:object_comments",
match_slash=False
)
add_route(
@ -104,18 +117,21 @@ add_route(
add_route(
"mediagoblin.webfinger.well-known.webfinger",
"/.well-known/webfinger",
"mediagoblin.federation.views:lrdd_lookup"
"/.well-known/webfinger/",
"mediagoblin.federation.views:lrdd_lookup",
match_slash=False
)
add_route(
"mediagoblin.webfinger.whoami",
"/api/whoami",
"mediagoblin.federation.views:whoami"
"/api/whoami/",
"mediagoblin.federation.views:whoami",
match_slash=False
)
add_route(
"mediagoblin.federation.activity_view",
"/<string:username>/activity/<string:id>",
"mediagoblin.federation.views:activity_view"
"/<string:username>/activity/<string:id>/",
"mediagoblin.federation.views:activity_view",
match_slash=False
)

View File

@ -188,7 +188,7 @@ class TestAPI(object):
# Lets change the image uploader to be self.other_user, this is easier
# than uploading the image as someone else as the way self.mocked_oauth_required
# and self._upload_image.
id = int(data["object"]["id"].split("/")[-1])
id = int(data["object"]["id"].split("/")[-2])
media = MediaEntry.query.filter_by(id=id).first()
media.uploader = self.other_user.id
media.save()
@ -232,14 +232,14 @@ class TestAPI(object):
image = json.loads(response.body.decode())["object"]
# Check everything has been set on the media correctly
id = int(image["id"].split("/")[-1])
id = int(image["id"].split("/")[-2])
media = MediaEntry.query.filter_by(id=id).first()
assert media.title == title
assert media.description == description
assert media.license == license
# Check we're being given back everything we should on an update
assert int(image["id"].split("/")[-1]) == media.id
assert int(image["id"].split("/")[-2]) == media.id
assert image["displayName"] == title
assert image["content"] == description
assert image["license"] == license
@ -288,7 +288,7 @@ class TestAPI(object):
request = test_app.get(object_uri)
image = json.loads(request.body.decode())
entry_id = int(image["id"].split("/")[-1])
entry_id = int(image["id"].split("/")[-2])
entry = MediaEntry.query.filter_by(id=entry_id).first()
assert request.status_code == 200
@ -319,7 +319,7 @@ class TestAPI(object):
assert response.status_code == 200
# Find the objects in the database
media_id = int(data["object"]["id"].split("/")[-1])
media_id = int(data["object"]["id"].split("/")[-2])
media = MediaEntry.query.filter_by(id=media_id).first()
comment = media.get_comments()[0]
@ -382,7 +382,7 @@ class TestAPI(object):
response, comment_data = self._activity_to_feed(test_app, activity)
# change who uploaded the comment as it's easier than changing
comment_id = int(comment_data["object"]["id"].split("/")[-1])
comment_id = int(comment_data["object"]["id"].split("/")[-2])
comment = MediaComment.query.filter_by(id=comment_id).first()
comment.author = self.other_user.id
comment.save()

View File

@ -28,15 +28,22 @@ url_map = Map()
class MGRoute(Rule):
def __init__(self, endpoint, url, controller):
def __init__(self, endpoint, url, controller, match_slash=True):
Rule.__init__(self, url, endpoint=endpoint)
self.gmg_controller = controller
self.match_slash = match_slash
def empty(self):
new_rule = Rule.empty(self)
new_rule.gmg_controller = self.gmg_controller
return new_rule
def match(self, path, *args, **kwargs):
if not (self.match_slash or path.endswith("/")):
path = path + "/"
return super(MGRoute, self).match(path, *args, **kwargs)
def endpoint_to_controller(rule):
endpoint = rule.endpoint
@ -52,11 +59,11 @@ def endpoint_to_controller(rule):
return view_func
def add_route(endpoint, url, controller):
def add_route(endpoint, url, controller, *args, **kwargs):
"""
Add a route to the url mapping
"""
url_map.add(MGRoute(endpoint, url, controller))
url_map.add(MGRoute(endpoint, url, controller, *args, **kwargs))
def mount(mountpoint, routes):