|
@@ -9,11 +9,30 @@ import sys
|
|
import unittest
|
|
import unittest
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
|
|
-from test.helper import FakeYDL, expect_dict, expect_value
|
|
|
|
-from youtube_dl.compat import compat_etree_fromstring
|
|
|
|
|
|
+from test.helper import FakeYDL, expect_dict, expect_value, http_server_port
|
|
|
|
+from youtube_dl.compat import compat_etree_fromstring, compat_http_server
|
|
from youtube_dl.extractor.common import InfoExtractor
|
|
from youtube_dl.extractor.common import InfoExtractor
|
|
from youtube_dl.extractor import YoutubeIE, get_info_extractor
|
|
from youtube_dl.extractor import YoutubeIE, get_info_extractor
|
|
from youtube_dl.utils import encode_data_uri, strip_jsonp, ExtractorError, RegexNotFoundError
|
|
from youtube_dl.utils import encode_data_uri, strip_jsonp, ExtractorError, RegexNotFoundError
|
|
|
|
+import threading
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+TEAPOT_RESPONSE_STATUS = 418
|
|
|
|
+TEAPOT_RESPONSE_BODY = "<h1>418 I'm a teapot</h1>"
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class InfoExtractorTestRequestHandler(compat_http_server.BaseHTTPRequestHandler):
|
|
|
|
+ def log_message(self, format, *args):
|
|
|
|
+ pass
|
|
|
|
+
|
|
|
|
+ def do_GET(self):
|
|
|
|
+ if self.path == '/teapot':
|
|
|
|
+ self.send_response(TEAPOT_RESPONSE_STATUS)
|
|
|
|
+ self.send_header('Content-Type', 'text/html; charset=utf-8')
|
|
|
|
+ self.end_headers()
|
|
|
|
+ self.wfile.write(TEAPOT_RESPONSE_BODY.encode())
|
|
|
|
+ else:
|
|
|
|
+ assert False
|
|
|
|
|
|
|
|
|
|
class TestIE(InfoExtractor):
|
|
class TestIE(InfoExtractor):
|
|
@@ -743,6 +762,25 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/
|
|
for i in range(len(entries)):
|
|
for i in range(len(entries)):
|
|
expect_dict(self, entries[i], expected_entries[i])
|
|
expect_dict(self, entries[i], expected_entries[i])
|
|
|
|
|
|
|
|
+ def test_response_with_expected_status_returns_content(self):
|
|
|
|
+ # Checks for mitigations against the effects of
|
|
|
|
+ # <https://bugs.python.org/issue15002> that affect Python 3.4.1+, which
|
|
|
|
+ # manifest as `_download_webpage`, `_download_xml`, `_download_json`,
|
|
|
|
+ # or the underlying `_download_webpage_handle` returning no content
|
|
|
|
+ # when a response matches `expected_status`.
|
|
|
|
+
|
|
|
|
+ httpd = compat_http_server.HTTPServer(
|
|
|
|
+ ('127.0.0.1', 0), InfoExtractorTestRequestHandler)
|
|
|
|
+ port = http_server_port(httpd)
|
|
|
|
+ server_thread = threading.Thread(target=httpd.serve_forever)
|
|
|
|
+ server_thread.daemon = True
|
|
|
|
+ server_thread.start()
|
|
|
|
+
|
|
|
|
+ (content, urlh) = self.ie._download_webpage_handle(
|
|
|
|
+ 'http://127.0.0.1:%d/teapot' % port, None,
|
|
|
|
+ expected_status=TEAPOT_RESPONSE_STATUS)
|
|
|
|
+ self.assertEqual(content, TEAPOT_RESPONSE_BODY)
|
|
|
|
+
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
unittest.main()
|