Index: native_client_sdk/src/build_tools/sdk_tools/download.py |
diff --git a/native_client_sdk/src/build_tools/sdk_tools/download.py b/native_client_sdk/src/build_tools/sdk_tools/download.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f2cb3be98df069e35b0a79a6eb4d9b2d15cad39 |
--- /dev/null |
+++ b/native_client_sdk/src/build_tools/sdk_tools/download.py |
@@ -0,0 +1,82 @@ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import hashlib |
+import os |
+import sys |
+# when pylint runs the third_party module is the one from depot_tools |
+# pylint: disable=E0611 |
+from third_party import fancy_urllib |
+import urllib2 |
+ |
+ |
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
+ |
+ |
+def UrlOpen(url): |
+ request = fancy_urllib.FancyRequest(url) |
+ ca_certs = os.path.join(SCRIPT_DIR, 'cacerts.txt') |
+ request.set_ssl_info(ca_certs=ca_certs) |
+ url_opener = urllib2.build_opener( |
+ fancy_urllib.FancyProxyHandler(), |
+ fancy_urllib.FancyRedirectHandler(), |
+ fancy_urllib.FancyHTTPSHandler()) |
+ return url_opener.open(request) |
+ |
+ |
+def MakeProgressFunction(file_size=0): |
+ # An inner function can only read nonlocal variables, not assign them. We can |
+ # work around this by using a list of one element. |
+ dots = [0] |
+ def ShowKnownProgress(progress): |
+ '''Returns a progress function based on a known file size''' |
+ if progress == 0: |
+ sys.stdout.write('|%s|\n' % ('=' * 48)) |
+ else: |
+ new_dots = progress * 50 / file_size - dots[0] |
+ sys.stdout.write('.' * new_dots) |
+ dots[0] += new_dots |
+ if progress == file_size: |
+ sys.stdout.write('\n') |
+ sys.stdout.flush() |
+ |
+ return ShowKnownProgress |
+ |
+ |
+def DownloadAndComputeHash(from_stream, to_stream=None, progress_func=None): |
+ '''Read from from-stream and generate sha1 and size info. |
+ |
+ Args: |
+ from_stream: An input stream that supports read. |
+ to_stream: [optional] the data is written to to_stream if it is |
+ provided. |
+ progress_func: [optional] A function used to report download progress. If |
+ provided, progress_func is called with progress=0 at the |
+ beginning of the download, periodically with progress=1 |
+ during the download, and progress=100 at the end. |
+ |
+ Return |
+ A tuple (sha1, size) where sha1 is a sha1-hash for the archive data and |
+ size is the size of the archive data in bytes.''' |
+ # Use a no-op progress function if none is specified. |
+ def progress_no_op(progress): |
+ pass |
+ if not progress_func: |
+ progress_func = progress_no_op |
+ |
+ sha1_hash = hashlib.sha1() |
+ size = 0 |
+ progress_func(progress=0) |
+ while(1): |
+ data = from_stream.read(32768) |
+ if not data: |
+ break |
+ sha1_hash.update(data) |
+ size += len(data) |
+ if to_stream: |
+ to_stream.write(data) |
+ progress_func(size) |
+ |
+ progress_func(progress=100) |
+ return sha1_hash.hexdigest(), size |