[utils] Correct per-request proxy handling
This commit is contained in:
		@@ -1771,7 +1771,8 @@ class YoutubeDL(object):
 | 
			
		||||
        https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel)
 | 
			
		||||
        ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel)
 | 
			
		||||
        opener = compat_urllib_request.build_opener(
 | 
			
		||||
            https_handler, proxy_handler, cookie_processor, ydlh)
 | 
			
		||||
            proxy_handler, https_handler, cookie_processor, ydlh)
 | 
			
		||||
 | 
			
		||||
        # Delete the default user-agent header, which would otherwise apply in
 | 
			
		||||
        # cases where our custom HTTP handler doesn't come into play
 | 
			
		||||
        # (See https://github.com/rg3/youtube-dl/issues/1309 for details)
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,6 @@ class LetvIE(InfoExtractor):
 | 
			
		||||
            'title': '美人天下01',
 | 
			
		||||
            'description': 'md5:f88573d9d7225ada1359eaf0dbf8bcda',
 | 
			
		||||
        },
 | 
			
		||||
        'expected_warnings': [
 | 
			
		||||
            'publish time'
 | 
			
		||||
        ]
 | 
			
		||||
    }, {
 | 
			
		||||
        'note': 'This video is available only in Mainland China, thus a proxy is needed',
 | 
			
		||||
        'url': 'http://www.letv.com/ptv/vplay/1118082.html',
 | 
			
		||||
@@ -53,11 +50,8 @@ class LetvIE(InfoExtractor):
 | 
			
		||||
            'title': '与龙共舞 完整版',
 | 
			
		||||
            'description': 'md5:7506a5eeb1722bb9d4068f85024e3986',
 | 
			
		||||
        },
 | 
			
		||||
        'expected_warnings': [
 | 
			
		||||
            'publish time'
 | 
			
		||||
        ],
 | 
			
		||||
        'params': {
 | 
			
		||||
            'cn_verification_proxy': 'proxy.uku.im:8888'
 | 
			
		||||
            'cn_verification_proxy': 'http://proxy.uku.im:8888'
 | 
			
		||||
        },
 | 
			
		||||
    }]
 | 
			
		||||
 | 
			
		||||
@@ -95,7 +89,7 @@ class LetvIE(InfoExtractor):
 | 
			
		||||
            'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params)
 | 
			
		||||
        )
 | 
			
		||||
        play_json_req.add_header(
 | 
			
		||||
            'Ytdl-Request-Proxy',
 | 
			
		||||
            'Ytdl-request-proxy',
 | 
			
		||||
            self._downloader.params.get('cn_verification_proxy'))
 | 
			
		||||
        play_json = self._download_json(
 | 
			
		||||
            play_json_req,
 | 
			
		||||
 
 | 
			
		||||
@@ -1771,10 +1771,21 @@ def match_filter_func(filter_str):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):
 | 
			
		||||
    def __init__(self, proxies=None):
 | 
			
		||||
        # Set default handlers
 | 
			
		||||
        for type in ('http', 'https'):
 | 
			
		||||
            setattr(self, '%s_open' % type,
 | 
			
		||||
                    lambda r, proxy='__noproxy__', type=type, meth=self.proxy_open:
 | 
			
		||||
                        meth(r, proxy, type))
 | 
			
		||||
        return compat_urllib_request.ProxyHandler.__init__(self, proxies)
 | 
			
		||||
 | 
			
		||||
    def proxy_open(self, req, proxy, type):
 | 
			
		||||
        req_proxy = req.headers.get('Ytdl-Request-Proxy')
 | 
			
		||||
        req_proxy = req.headers.get('Ytdl-request-proxy')
 | 
			
		||||
        if req_proxy is not None:
 | 
			
		||||
            proxy = req_proxy
 | 
			
		||||
            del req.headers['Ytdl-Request-Proxy']
 | 
			
		||||
            del req.headers['Ytdl-request-proxy']
 | 
			
		||||
 | 
			
		||||
        if proxy == '__noproxy__':
 | 
			
		||||
            return None  # No Proxy
 | 
			
		||||
        return compat_urllib_request.ProxyHandler.proxy_open(
 | 
			
		||||
            self, req, proxy, type)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user