From 2b7dd3b2a2d7c6e228a42d1000a6f3296739ff1c Mon Sep 17 00:00:00 2001 From: dirkf Date: Mon, 24 Jul 2023 03:30:28 +0100 Subject: [PATCH] [utils] Fix update_Request() with empty data (not None) --- test/test_http.py | 13 +++++++++++++ youtube_dl/utils.py | 7 +++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/test/test_http.py b/test/test_http.py index 4ec8e13e3..89580969d 100644 --- a/test/test_http.py +++ b/test/test_http.py @@ -41,6 +41,7 @@ from youtube_dl.compat import ( from youtube_dl.utils import ( sanitized_Request, + update_Request, urlencode_postdata, ) @@ -395,6 +396,18 @@ class TestHTTP(unittest.TestCase): headers = ydl.urlopen(r).read().decode('utf-8') self.assertIn('Content-Type: application/x-www-form-urlencoded', headers) + def test_update_req(self): + req = sanitized_Request('http://example.com') + assert req.data is None + assert req.get_method() == 'GET' + assert not req.has_header('Content-Type') + # Test that zero-byte payloads will be sent + req = update_Request(req, data=b'') + assert req.data == b'' + assert req.get_method() == 'POST' + # yt-dl expects data to be encoded and Content-Type to be added by sender + # assert req.get_header('Content-Type') == 'application/x-www-form-urlencoded' + def test_cookiejar(self): with FakeYDL() as ydl: ydl.cookiejar.set_cookie(compat_http_cookiejar_Cookie( diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 6d798f13a..b5475434f 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -2996,8 +2996,7 @@ class YoutubeDLRedirectHandler(compat_urllib_request.HTTPRedirectHandler): # Technically the Cookie header should be in unredirected_hdrs; # however in practice some may set it in normal headers anyway. # We will remove it here to prevent any leaks. - # Also remove unwanted and undocumented Host header for old URL - remove_headers = ['Cookie', 'Host'] + remove_headers = ['Cookie'] # A 303 must either use GET or HEAD for subsequent request # https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.4 @@ -3016,7 +3015,7 @@ class YoutubeDLRedirectHandler(compat_urllib_request.HTTPRedirectHandler): remove_headers.extend(['Content-Length', 'Content-Type']) # NB: don't use dict comprehension for python 2.6 compatibility - new_headers = dict((k, v) for k, v in req.header_items() + new_headers = dict((k, v) for k, v in req.headers.items() if k.title() not in remove_headers) return compat_urllib_request.Request( @@ -4187,7 +4186,7 @@ def update_url_query(url, query): def update_Request(req, url=None, data=None, headers={}, query={}): req_headers = req.headers.copy() req_headers.update(headers) - req_data = data or req.data + req_data = data if data is not None else req.data req_url = update_url_query(url or req.get_full_url(), query) req_get_method = req.get_method() if req_get_method == 'HEAD':