diff --git a/api/config/urls/__init__.py b/api/config/urls/__init__.py index d8b4c891e..f2e1a6ffe 100644 --- a/api/config/urls/__init__.py +++ b/api/config/urls/__init__.py @@ -34,10 +34,10 @@ if settings.DEBUG: # This allows the error pages to be debugged during development, just visit # these url in browser to see how these error pages look like. urlpatterns += [ - url(r"^400/$", default_views.bad_request), - url(r"^403/$", default_views.permission_denied), - url(r"^404/$", default_views.page_not_found), - url(r"^500/$", default_views.server_error), + url(r"^400/?$", default_views.bad_request), + url(r"^403/?$", default_views.permission_denied), + url(r"^404/?$", default_views.page_not_found), + url(r"^500/?$", default_views.server_error), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if "debug_toolbar" in settings.INSTALLED_APPS: diff --git a/api/config/urls/api.py b/api/config/urls/api.py index 520224f9f..fd33e26cb 100644 --- a/api/config/urls/api.py +++ b/api/config/urls/api.py @@ -28,7 +28,7 @@ router.register(r"attachments", common_views.AttachmentViewSet, "attachments") v1_patterns = router.urls v1_patterns += [ - url(r"^oembed/$", views.OembedView.as_view(), name="oembed"), + url(r"^oembed/?$", views.OembedView.as_view(), name="oembed"), url( r"^instance/", include(("funkwhale_api.instance.urls", "instance"), namespace="instance"), diff --git a/api/funkwhale_api/musicbrainz/urls.py b/api/funkwhale_api/musicbrainz/urls.py index b9e24994f..aac5cf6ec 100644 --- a/api/funkwhale_api/musicbrainz/urls.py +++ b/api/funkwhale_api/musicbrainz/urls.py @@ -8,22 +8,22 @@ router = routers.OptionalSlashRouter() router.register(r"search", views.SearchViewSet, "search") urlpatterns = [ url( - "releases/(?P[0-9a-z-]+)/$", + "releases/(?P[0-9a-z-]+)/?$", views.ReleaseDetail.as_view(), name="release-detail", ), url( - "artists/(?P[0-9a-z-]+)/$", + "artists/(?P[0-9a-z-]+)/?$", views.ArtistDetail.as_view(), name="artist-detail", ), url( - "release-groups/browse/(?P[0-9a-z-]+)/$", + "release-groups/browse/(?P[0-9a-z-]+)/?$", views.ReleaseGroupBrowse.as_view(), name="release-group-browse", ), url( - "releases/browse/(?P[0-9a-z-]+)/$", + "releases/browse/(?P[0-9a-z-]+)/?$", views.ReleaseBrowse.as_view(), name="release-browse", ), diff --git a/api/funkwhale_api/users/oauth/urls.py b/api/funkwhale_api/users/oauth/urls.py index 4230668e4..98e1c114c 100644 --- a/api/funkwhale_api/users/oauth/urls.py +++ b/api/funkwhale_api/users/oauth/urls.py @@ -10,7 +10,7 @@ router.register(r"apps", views.ApplicationViewSet, "apps") router.register(r"grants", views.GrantViewSet, "grants") urlpatterns = router.urls + [ - url("^authorize/$", csrf_exempt(views.AuthorizeView.as_view()), name="authorize"), - url("^token/$", views.TokenView.as_view(), name="token"), - url("^revoke/$", views.RevokeTokenView.as_view(), name="revoke"), + url("^authorize/?$", csrf_exempt(views.AuthorizeView.as_view()), name="authorize"), + url("^token/?$", views.TokenView.as_view(), name="token"), + url("^revoke/?$", views.RevokeTokenView.as_view(), name="revoke"), ] diff --git a/api/funkwhale_api/users/rest_auth_urls.py b/api/funkwhale_api/users/rest_auth_urls.py index 21d91685c..14766a994 100644 --- a/api/funkwhale_api/users/rest_auth_urls.py +++ b/api/funkwhale_api/users/rest_auth_urls.py @@ -7,26 +7,26 @@ from . import views urlpatterns = [ # URLs that do not require a session or valid token url( - r"^password/reset/$", + r"^password/reset/?$", views.PasswordResetView.as_view(), name="rest_password_reset", ), url( - r"^password/reset/confirm/$", + r"^password/reset/confirm/?$", views.PasswordResetConfirmView.as_view(), name="rest_password_reset_confirm", ), # URLs that require a user to be logged in with a valid session / token. url( - r"^user/$", rest_auth_views.UserDetailsView.as_view(), name="rest_user_details" + r"^user/?$", rest_auth_views.UserDetailsView.as_view(), name="rest_user_details" ), url( - r"^password/change/$", + r"^password/change/?$", views.PasswordChangeView.as_view(), name="rest_password_change", ), # Registration URLs - url(r"^registration/$", views.RegisterView.as_view(), name="rest_register"), + url(r"^registration/?$", views.RegisterView.as_view(), name="rest_register"), url( r"^registration/verify-email/?$", views.VerifyEmailView.as_view(), diff --git a/changes/changelog.d/trailing-slashes.bugfix b/changes/changelog.d/trailing-slashes.bugfix new file mode 100644 index 000000000..e4e8442b8 --- /dev/null +++ b/changes/changelog.d/trailing-slashes.bugfix @@ -0,0 +1 @@ +Make trailing slashes optional for all endpoints