projects
/
youtube-dl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[downloader/http] Fix access to not yet opened stream in retry
[youtube-dl]
/
youtube_dl
/
downloader
/
http.py
diff --git
a/youtube_dl/downloader/http.py
b/youtube_dl/downloader/http.py
index 3c72ea18b2304befd5221960503ff5b6141304c3..04da14d91cff55b2708366662dabeb1c827515af 100644
(file)
--- a/
youtube_dl/downloader/http.py
+++ b/
youtube_dl/downloader/http.py
@@
-106,7
+106,12
@@
class HttpFD(FileDownloader):
set_range(request, range_start, range_end)
# Establish connection
try:
set_range(request, range_start, range_end)
# Establish connection
try:
- ctx.data = self.ydl.urlopen(request)
+ try:
+ ctx.data = self.ydl.urlopen(request)
+ except (compat_urllib_error.URLError, ) as err:
+ if isinstance(err.reason, socket.timeout):
+ raise RetryDownload(err)
+ raise err
# When trying to resume, Content-Range HTTP header of response has to be checked
# to match the value of requested Range HTTP header. This is due to a webservers
# that don't support resuming and serve a whole file with no Content-Range
# When trying to resume, Content-Range HTTP header of response has to be checked
# to match the value of requested Range HTTP header. This is due to a webservers
# that don't support resuming and serve a whole file with no Content-Range
@@
-218,24
+223,27
@@
class HttpFD(FileDownloader):
def retry(e):
to_stdout = ctx.tmpfilename == '-'
def retry(e):
to_stdout = ctx.tmpfilename == '-'
- if not to_stdout:
- ctx.stream.close()
- ctx.stream = None
+ if ctx.stream is not None:
+ if not to_stdout:
+ ctx.stream.close()
+ ctx.stream = None
ctx.resume_len = byte_counter if to_stdout else os.path.getsize(encodeFilename(ctx.tmpfilename))
raise RetryDownload(e)
while True:
try:
# Download and write
ctx.resume_len = byte_counter if to_stdout else os.path.getsize(encodeFilename(ctx.tmpfilename))
raise RetryDownload(e)
while True:
try:
# Download and write
- data_block = ctx.data.read(block_size if
not is_test
else min(block_size, data_len - byte_counter))
+ data_block = ctx.data.read(block_size if
data_len is None
else min(block_size, data_len - byte_counter))
# socket.timeout is a subclass of socket.error but may not have
# errno set
except socket.timeout as e:
retry(e)
except socket.error as e:
# socket.timeout is a subclass of socket.error but may not have
# errno set
except socket.timeout as e:
retry(e)
except socket.error as e:
- if e.errno not in (errno.ECONNRESET, errno.ETIMEDOUT):
- raise
- retry(e)
+ # SSLError on python 2 (inherits socket.error) may have
+ # no errno set but this error message
+ if e.errno in (errno.ECONNRESET, errno.ETIMEDOUT) or getattr(e, 'message') == 'The read operation timed out':
+ retry(e)
+ raise
byte_counter += len(data_block)
byte_counter += len(data_block)
@@
-299,7
+307,7
@@
class HttpFD(FileDownloader):
'elapsed': now - ctx.start_time,
})
'elapsed': now - ctx.start_time,
})
- if
is_test
and byte_counter == data_len:
+ if
data_len is not None
and byte_counter == data_len:
break
if not is_test and ctx.chunk_size and ctx.data_len is not None and byte_counter < ctx.data_len:
break
if not is_test and ctx.chunk_size and ctx.data_len is not None and byte_counter < ctx.data_len: