]>
Raphaƫl G. Git Repositories - youtubedl/blob - test/test_http.py
f2e305b6fed3ce2f0574a7c20e89ffb977934f28
2 from __future__
import unicode_literals
4 # Allow direct execution
8 sys
.path
.insert(0, os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
))))
10 from youtube_dl
import YoutubeDL
11 from youtube_dl
.compat
import compat_http_server
, compat_urllib_request
15 TEST_DIR
= os
.path
.dirname(os
.path
.abspath(__file__
))
18 class HTTPTestRequestHandler(compat_http_server
.BaseHTTPRequestHandler
):
19 def log_message(self
, format
, *args
):
23 if self
.path
== '/video.html':
24 self
.send_response(200)
25 self
.send_header('Content-Type', 'text/html; charset=utf-8')
27 self
.wfile
.write(b
'<html><video src="/vid.mp4" /></html>')
28 elif self
.path
== '/vid.mp4':
29 self
.send_response(200)
30 self
.send_header('Content-Type', 'video/mp4')
32 self
.wfile
.write(b
'\x00\x00\x00\x00\x20\x66\x74[video]')
37 class FakeLogger(object):
41 def warning(self
, msg
):
48 class TestHTTP(unittest
.TestCase
):
50 certfn
= os
.path
.join(TEST_DIR
, 'testcert.pem')
51 self
.httpd
= compat_http_server
.HTTPServer(
52 ('localhost', 0), HTTPTestRequestHandler
)
53 self
.httpd
.socket
= ssl
.wrap_socket(
54 self
.httpd
.socket
, certfile
=certfn
, server_side
=True)
55 self
.port
= self
.httpd
.socket
.getsockname()[1]
56 self
.server_thread
= threading
.Thread(target
=self
.httpd
.serve_forever
)
57 self
.server_thread
.daemon
= True
58 self
.server_thread
.start()
60 def test_nocheckcertificate(self
):
61 if sys
.version_info
>= (2, 7, 9): # No certificate checking anyways
62 ydl
= YoutubeDL({'logger': FakeLogger()})
65 ydl
.extract_info
, 'https://localhost:%d/video.html' % self
.port
)
67 ydl
= YoutubeDL({'logger': FakeLogger(), 'nocheckcertificate': True})
68 r
= ydl
.extract_info('https://localhost:%d/video.html' % self
.port
)
69 self
.assertEqual(r
['url'], 'https://localhost:%d/vid.mp4' % self
.port
)
72 def _build_proxy_handler(name
):
73 class HTTPTestRequestHandler(compat_http_server
.BaseHTTPRequestHandler
):
76 def log_message(self
, format
, *args
):
80 self
.send_response(200)
81 self
.send_header('Content-Type', 'text/plain; charset=utf-8')
83 self
.wfile
.write('{self.proxy_name}: {self.path}'.format(self
=self
).encode('utf-8'))
84 return HTTPTestRequestHandler
87 class TestProxy(unittest
.TestCase
):
89 self
.proxy
= compat_http_server
.HTTPServer(
90 ('localhost', 0), _build_proxy_handler('normal'))
91 self
.port
= self
.proxy
.socket
.getsockname()[1]
92 self
.proxy_thread
= threading
.Thread(target
=self
.proxy
.serve_forever
)
93 self
.proxy_thread
.daemon
= True
94 self
.proxy_thread
.start()
96 self
.cn_proxy
= compat_http_server
.HTTPServer(
97 ('localhost', 0), _build_proxy_handler('cn'))
98 self
.cn_port
= self
.cn_proxy
.socket
.getsockname()[1]
99 self
.cn_proxy_thread
= threading
.Thread(target
=self
.cn_proxy
.serve_forever
)
100 self
.cn_proxy_thread
.daemon
= True
101 self
.cn_proxy_thread
.start()
103 def test_proxy(self
):
104 cn_proxy
= 'localhost:{0}'.format(self
.cn_port
)
106 'proxy': 'localhost:{0}'.format(self
.port
),
107 'cn_verification_proxy': cn_proxy
,
109 url
= 'http://foo.com/bar'
110 response
= ydl
.urlopen(url
).read().decode('utf-8')
111 self
.assertEqual(response
, 'normal: {0}'.format(url
))
113 req
= compat_urllib_request
.Request(url
)
114 req
.add_header('Ytdl-request-proxy', cn_proxy
)
115 response
= ydl
.urlopen(req
).read().decode('utf-8')
116 self
.assertEqual(response
, 'cn: {0}'.format(url
))
118 if __name__
== '__main__':