From 4da0c64cc305ce6f30d1e682e9e3f46d5131e0fc Mon Sep 17 00:00:00 2001 From: Samuel Walladge <samuel@opencraft.com> Date: Mon, 15 Jun 2020 17:29:57 +0930 Subject: [PATCH] Fix crashes in yt_video_metadata - yt_video_metadata returned a generic non-json-api-friendly 500 error when called on a non-youtube video - load_metadata_from_youtube was crashing when called from the xblock yt_video_metadata endpoint. It passes a webob request, which has a different api for retrieving the http referer. --- .../xmodule/xmodule/video_module/video_handlers.py | 4 ++++ lms/djangoapps/courseware/views/views.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/video_module/video_handlers.py b/common/lib/xmodule/xmodule/video_module/video_handlers.py index 7acab232c14..037ec75e00d 100644 --- a/common/lib/xmodule/xmodule/video_module/video_handlers.py +++ b/common/lib/xmodule/xmodule/video_module/video_handlers.py @@ -391,6 +391,10 @@ class VideoStudentViewHandlers(object): runtime uses a similar REST API that's not an XBlock handler. """ from lms.djangoapps.courseware.views.views import load_metadata_from_youtube + if not self.youtube_id_1_0: + # TODO: more informational response to explain that yt_video_metadata not supported for non-youtube videos. + return Response('{}', status=400) + metadata, status_code = load_metadata_from_youtube(video_id=self.youtube_id_1_0, request=request) response = Response(json.dumps(metadata), status=status_code) response.content_type = 'application/json' diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 45c7462cd3d..3c6c2958d5d 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -308,7 +308,16 @@ def load_metadata_from_youtube(video_id, request): yt_timeout = settings.YOUTUBE.get('TEST_TIMEOUT', 1500) / 1000 # converting milli seconds to seconds headers = {} - http_referer = request.META.get('HTTP_REFERER') + http_referer = None + + try: + # This raises an attribute error if called from the xblock yt_video_metadata handler, which passes + # a webob request instead of a django request. + http_referer = request.META.get('HTTP_REFERER') + except AttributeError: + # So here, let's assume it's a webob request and access the referer the webob way. + http_referer = request.referer + if http_referer: headers['Referer'] = http_referer -- GitLab