def convert_requests_exceptions(log, func, *args, **kwargs): ''' Run a requests command, catching exceptions and reraising them as DownloadException. Status errors, such as 404 or 500 do not cause exceptions, instead exposed as not response.ok. e.g. >>> convert_requests_exceptions(log, requests.get, url, timeout=url_timeout) runs: res = requests.get(url, timeout=url_timeout) ''' from requests_ssl import SSLv3Adapter try: try: response = func(*args, **kwargs) except requests.exceptions.ConnectionError, e: if 'SSL23_GET_SERVER_HELLO' not in str(e): raise log.info('SSLv23 failed so trying again using SSLv3: %r', args) requests_session = requests.Session() requests_session.mount('https://', SSLv3Adapter()) func = { requests.get: requests_session.get, requests.post: requests_session.post }[func] response = func(*args, **kwargs) except requests.exceptions.ConnectionError, e: raise DownloadException('Connection error: %s' % e)
'saved_file': None, 'url_redirected_to': None, 'request_type': 'GET' } except Exception, e: resource_blacklist.status_code = 408 raise DownloadException(_('FTP download error')) try: try: response = func(*args, **kwargs) except requests.exceptions.ConnectionError, e: if 'SSL23_GET_SERVER_HELLO' not in str(e): raise log.info('SSLv23 failed so trying again using SSLv3: %r', args) requests_session = requests.Session() requests_session.mount('https://', SSLv3Adapter()) func = { requests.get: requests_session.get, requests.post: requests_session.post }[func] response = func(*args, **kwargs) except requests.exceptions.ConnectionError, e: resource_blacklist.add_url_blacklist(e.args[0].reason.errno) raise DownloadException(_('Connection error: %s') % e) except requests.exceptions.HTTPError, e: raise DownloadException(_('Invalid HTTP response: %s') % e) except requests.exceptions.Timeout, e: resource_blacklist.add_url_blacklist(100) raise DownloadException( _('Connection timed out after %ss') % kwargs.get('timeout', '?'))