Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Archives a set of files to a server.""" | 6 """Archives a set of files to a server.""" |
| 7 | 7 |
| 8 import binascii | 8 import binascii |
| 9 import hashlib | 9 import hashlib |
| 10 import logging | 10 import logging |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 | 120 |
| 121 Arguments: | 121 Arguments: |
| 122 generate_upload_url: The url to get the new upload url from. | 122 generate_upload_url: The url to get the new upload url from. |
| 123 data: extra POST data. | 123 data: extra POST data. |
| 124 hash_key: sha1 of the uncompressed version of content. | 124 hash_key: sha1 of the uncompressed version of content. |
| 125 content: The contents to upload. Must fit in memory for now. | 125 content: The contents to upload. Must fit in memory for now. |
| 126 """ | 126 """ |
| 127 logging.debug('Generating url to directly upload file to blobstore') | 127 logging.debug('Generating url to directly upload file to blobstore') |
| 128 assert isinstance(hash_key, str), hash_key | 128 assert isinstance(hash_key, str), hash_key |
| 129 assert isinstance(content, str), (hash_key, content) | 129 assert isinstance(content, str), (hash_key, content) |
| 130 upload_url = url_open(generate_upload_url, data=data).read() | 130 for _ in range(run_isolated.MAX_URL_OPEN_ATTEMPTS): |
| 131 # Retry HTTP 50x here. | |
| 132 response = run_isolated.url_open(generate_upload_url, data=data) | |
| 133 if not response: | |
| 134 raise run_isolated.MappingError( | |
| 135 'Unable to connect to server %s' % generate_upload_url) | |
| 136 upload_url = response.read() | |
| 131 | 137 |
| 132 if not upload_url: | 138 # TODO(maruel): Support large files. |
| 133 logging.error('Unable to generate upload url') | 139 content_type, body = encode_multipart_formdata( |
|
csharp
2013/04/26 17:51:58
Move this out of the loop
M-A Ruel
2013/04/26 17:56:22
Oops, done.
| |
| 134 return | 140 data, [('content', hash_key, content)]) |
| 135 | 141 # Do not retry this request on HTTP 50x. Regenerate an upload url each time |
| 136 # TODO(maruel): Support large files. | 142 # since uploading "consumes" the upload url. |
| 137 content_type, body = encode_multipart_formdata( | 143 result = run_isolated.url_open( |
| 138 data, [('content', hash_key, content)]) | 144 upload_url, data=body, content_type=content_type, retry_50x=False) |
| 139 return url_open(upload_url, data=body, content_type=content_type) | 145 if result: |
| 146 return result.read() | |
| 147 raise run_isolated.MappingError( | |
| 148 'Unable to connect to server %s' % generate_upload_url) | |
| 140 | 149 |
| 141 | 150 |
| 142 class UploadRemote(run_isolated.Remote): | 151 class UploadRemote(run_isolated.Remote): |
| 143 def __init__(self, namespace, base_url, token): | 152 def __init__(self, namespace, base_url, token): |
| 144 self.namespace = str(namespace) | 153 self.namespace = str(namespace) |
| 145 self._token = token | 154 self._token = token |
| 146 super(UploadRemote, self).__init__(base_url) | 155 super(UploadRemote, self).__init__(base_url) |
| 147 | 156 |
| 148 def get_file_handler(self, base_url): | 157 def get_file_handler(self, base_url): |
| 149 base_url = str(base_url) | 158 base_url = str(base_url) |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 358 with run_isolated.Profiler('Archive'): | 367 with run_isolated.Profiler('Archive'): |
| 359 return upload_sha1_tree( | 368 return upload_sha1_tree( |
| 360 base_url=options.remote, | 369 base_url=options.remote, |
| 361 indir=os.getcwd(), | 370 indir=os.getcwd(), |
| 362 infiles=infiles, | 371 infiles=infiles, |
| 363 namespace=options.namespace) | 372 namespace=options.namespace) |
| 364 | 373 |
| 365 | 374 |
| 366 if __name__ == '__main__': | 375 if __name__ == '__main__': |
| 367 sys.exit(main(sys.argv[1:])) | 376 sys.exit(main(sys.argv[1:])) |
| OLD | NEW |