|
|
@@ -9,11 +9,30 @@ import sys |
|
|
|
import unittest |
|
|
|
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 import YoutubeIE, get_info_extractor |
|
|
|
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): |
|
|
@@ -743,6 +762,25 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ |
|
|
|
for i in range(len(entries)): |
|
|
|
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__': |
|
|
|
unittest.main() |