зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 35ef9cd54519 (bug 1358142) for breaking android nightlys
This commit is contained in:
Родитель
726ee660f9
Коммит
4e1afcd681
|
@ -36,7 +36,6 @@ import zipfile
|
||||||
import httplib
|
import httplib
|
||||||
import urlparse
|
import urlparse
|
||||||
import hashlib
|
import hashlib
|
||||||
import zlib
|
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
try:
|
try:
|
||||||
import win32file
|
import win32file
|
||||||
|
@ -59,7 +58,7 @@ from mozharness.base.log import SimpleFileLogger, MultiFileLogger, \
|
||||||
LogMixin, OutputParser, DEBUG, INFO, ERROR, FATAL
|
LogMixin, OutputParser, DEBUG, INFO, ERROR, FATAL
|
||||||
|
|
||||||
|
|
||||||
class ContentLengthMismatch(Exception):
|
class FetchedIncorrectFilesize(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@ -356,8 +355,8 @@ class ScriptMixin(PlatformMixin):
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
IOError: When the url points to a file on disk and cannot be found
|
IOError: When the url points to a file on disk and cannot be found
|
||||||
ContentLengthMismatch: When the length of the retrieved content does not match the
|
FetchedIncorrectFilesize: When the size of the fetched file does not match the
|
||||||
Content-Length response header.
|
expected file size.
|
||||||
ValueError: When the scheme of a url is not what is expected.
|
ValueError: When the scheme of a url is not what is expected.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -370,7 +369,7 @@ class ScriptMixin(PlatformMixin):
|
||||||
if not os.path.isfile(url):
|
if not os.path.isfile(url):
|
||||||
raise IOError('Could not find file to extract: {}'.format(url))
|
raise IOError('Could not find file to extract: {}'.format(url))
|
||||||
|
|
||||||
content_length = os.stat(url.replace('file://', '')).st_size
|
expected_file_size = os.stat(url.replace('file://', '')).st_size
|
||||||
|
|
||||||
# In case we're referrencing a file without file://
|
# In case we're referrencing a file without file://
|
||||||
if parsed_url.scheme == '':
|
if parsed_url.scheme == '':
|
||||||
|
@ -393,33 +392,26 @@ class ScriptMixin(PlatformMixin):
|
||||||
response = urllib2.urlopen(request, timeout=30)
|
response = urllib2.urlopen(request, timeout=30)
|
||||||
|
|
||||||
if parsed_url.scheme in ('http', 'https'):
|
if parsed_url.scheme in ('http', 'https'):
|
||||||
content_length = int(response.headers.get('Content-Length'))
|
expected_file_size = int(response.headers.get('Content-Length'))
|
||||||
|
|
||||||
response_body = response.read()
|
file_contents = response.read()
|
||||||
response_body_size = len(response_body)
|
obtained_file_size = len(file_contents)
|
||||||
|
self.info('Expected file size: {}'.format(expected_file_size))
|
||||||
|
self.info('Obtained file size: {}'.format(obtained_file_size))
|
||||||
|
|
||||||
self.info('Content-Length response header: {}'.format(content_length))
|
if obtained_file_size != expected_file_size:
|
||||||
self.info('Bytes received: {}'.format(response_body_size))
|
raise FetchedIncorrectFilesize(
|
||||||
|
'The expected file size is {} while we got instead {}'.format(
|
||||||
if response_body_size != content_length:
|
expected_file_size, obtained_file_size)
|
||||||
raise ContentLengthMismatch(
|
|
||||||
'The retrieved Content-Length header declares a body length of {} bytes, while we actually retrieved {} bytes'.format(
|
|
||||||
content_length, response_body_size)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if response.info().get('Content-Encoding') == 'gzip':
|
|
||||||
self.info('Content-Encoding is "gzip", so decompressing response body')
|
|
||||||
file_contents = zlib.decompress(response_body)
|
|
||||||
else:
|
|
||||||
file_contents = response_body
|
|
||||||
|
|
||||||
# Use BytesIO instead of StringIO
|
# Use BytesIO instead of StringIO
|
||||||
# http://stackoverflow.com/questions/34162017/unzip-buffer-with-python/34162395#34162395
|
# http://stackoverflow.com/questions/34162017/unzip-buffer-with-python/34162395#34162395
|
||||||
return BytesIO(file_contents)
|
return BytesIO(file_contents)
|
||||||
|
|
||||||
|
|
||||||
def _download_file(self, url, file_name):
|
def _download_file(self, url, file_name):
|
||||||
""" Helper function for download_file()
|
""" Helper script for download_file()
|
||||||
Additionaly this function logs all exceptions as warnings before
|
Additionaly this function logs all exceptions as warnings before
|
||||||
re-raising them
|
re-raising them
|
||||||
|
|
||||||
|
@ -451,14 +443,7 @@ class ScriptMixin(PlatformMixin):
|
||||||
if f.info().get('content-length') is not None:
|
if f.info().get('content-length') is not None:
|
||||||
f_length = int(f.info()['content-length'])
|
f_length = int(f.info()['content-length'])
|
||||||
got_length = 0
|
got_length = 0
|
||||||
if f.info().get('Content-Encoding') == 'gzip':
|
local_file = open(file_name, 'wb')
|
||||||
# Note, we'll download the full compressed content into its own
|
|
||||||
# file, since that allows the gzip library to seek through it.
|
|
||||||
# Once downloaded, we'll decompress it into the real target
|
|
||||||
# file, and delete the compressed version.
|
|
||||||
local_file = open(file_name + '.gz', 'wb')
|
|
||||||
else:
|
|
||||||
local_file = open(file_name, 'wb')
|
|
||||||
while True:
|
while True:
|
||||||
block = f.read(1024 ** 2)
|
block = f.read(1024 ** 2)
|
||||||
if not block:
|
if not block:
|
||||||
|
@ -469,11 +454,6 @@ class ScriptMixin(PlatformMixin):
|
||||||
if f_length is not None:
|
if f_length is not None:
|
||||||
got_length += len(block)
|
got_length += len(block)
|
||||||
local_file.close()
|
local_file.close()
|
||||||
if f.info().get('Content-Encoding') == 'gzip':
|
|
||||||
# Decompress file into target location, then remove compressed version
|
|
||||||
with gzip.open(file_name + '.gz', 'rb') as f_in, open(file_name, 'wb') as f_out:
|
|
||||||
shutil.copyfileobj(f_in, f_out)
|
|
||||||
os.remove(file_name + '.gz')
|
|
||||||
return file_name
|
return file_name
|
||||||
except urllib2.HTTPError, e:
|
except urllib2.HTTPError, e:
|
||||||
self.warning("Server returned status %s %s for %s" % (str(e.code), str(e), url))
|
self.warning("Server returned status %s %s for %s" % (str(e.code), str(e), url))
|
||||||
|
@ -686,7 +666,7 @@ class ScriptMixin(PlatformMixin):
|
||||||
httplib.BadStatusLine,
|
httplib.BadStatusLine,
|
||||||
socket.timeout,
|
socket.timeout,
|
||||||
socket.error,
|
socket.error,
|
||||||
ContentLengthMismatch,
|
FetchedIncorrectFilesize,
|
||||||
),
|
),
|
||||||
sleeptime=30,
|
sleeptime=30,
|
||||||
attempts=5,
|
attempts=5,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче