When downloading through a proxy i sometimes get a "timed out" error: ``` ERROR:deemix:[XXXX - YYYY] ('timed out',) Traceback (most recent call last): File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 438, in _error_catcher yield File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 519, in read data = self._fp.read(amt) if not fp_closed else b"" File "/usr/lib/python3.6/http/client.py", line 463, in read n = self.readinto(b) File "/usr/lib/python3.6/http/client.py", line 507, in readinto n = self.fp.readinto(b) File "/usr/lib/python3.6/socket.py", line 586, in readinto return self._sock.recv_into(b) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 252, in recv_into return self._base_recv(nbytes, flags, into=True, buffer_=buffer) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 267, in _base_recv read = self.read(nbytes, buffer_) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 187, in read super(GreenSSLSocket, self).read, *args, **kwargs) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 167, in _call_trampolining timeout_exc=timeout_exc('timed out')) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/hubs/__init__.py", line 159, in trampoline return hub.switch() File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 313, in switch return self.greenlet.switch() ssl.SSLError: ('timed out',) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 748, in downloadWrapper result = self.download(trackAPI_gw) File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 578, in download raise e File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 576, in download trackDownloaded = downloadMusic(track, trackAPI_gw) File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 572, in downloadMusic raise e File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 524, in downloadMusic self.streamTrack(stream, track) File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 694, in streamTrack for chunk in request.iter_content(2048 * 3): File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/requests/models.py", line 753, in generate for chunk in self.raw.stream(chunk_size, decode_content=True): File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 576, in stream data = self.read(amt=amt, decode_content=decode_content) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 541, in read raise IncompleteRead(self._fp_bytes_read, self.length_remaining) File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__ self.gen.throw(type, value, traceback) File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 449, in _error_catcher raise SSLError(e) urllib3.exceptions.SSLError: ('timed out',) ``` I'm not sure why this is, but redownload always works. Catching `urllib3.exceptions.SSLError` in `downloadjob.py` works a treat, e.g.: ```diff diff --git a/deemix/app/downloadjob.py b/deemix/app/downloadjob.py index 033df13..b12f6eb 100644 --- a/deemix/app/downloadjob.py +++ b/deemix/app/downloadjob.py @@ -13,6 +13,7 @@ import errno from ssl import SSLError from os import makedirs from tempfile import gettempdir +from urllib3.exceptions import SSLError as u3SSLError from deemix.app.queueitem import QISingle, QICollection from deemix.app.track import Track, AlbumDoesntExists @@ -554,7 +555,7 @@ class DownloadJob: raise DownloadFailed("notAvailableNoAlternative") else: raise DownloadFailed("notAvailable") - except (request_exception.ConnectionError, request_exception.ChunkedEncodingError) as e: + except (request_exception.ConnectionError, request_exception.ChunkedEncodingError, u3SSLError) as e: if writepath.is_file(): writepath.unlink() logger.warn(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, trying again in 5s...") eventlet.sleep(5) ```