OLD | NEW |
1 # Copyright 2010 Google Inc. | 1 # Copyright 2010 Google Inc. |
2 # | 2 # |
3 # Permission is hereby granted, free of charge, to any person obtaining a | 3 # Permission is hereby granted, free of charge, to any person obtaining a |
4 # copy of this software and associated documentation files (the | 4 # copy of this software and associated documentation files (the |
5 # "Software"), to deal in the Software without restriction, including | 5 # "Software"), to deal in the Software without restriction, including |
6 # without limitation the rights to use, copy, modify, merge, publish, dis- | 6 # without limitation the rights to use, copy, modify, merge, publish, dis- |
7 # tribute, sublicense, and/or sell copies of the Software, and to permit | 7 # tribute, sublicense, and/or sell copies of the Software, and to permit |
8 # persons to whom the Software is furnished to do so, subject to the fol- | 8 # persons to whom the Software is furnished to do so, subject to the fol- |
9 # lowing conditions: | 9 # lowing conditions: |
10 # | 10 # |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 fp.flush() | 213 fp.flush() |
214 | 214 |
215 def _check_final_md5(self, key, file_name): | 215 def _check_final_md5(self, key, file_name): |
216 """ | 216 """ |
217 Checks that etag from server agrees with md5 computed after the | 217 Checks that etag from server agrees with md5 computed after the |
218 download completes. This is important, since the download could | 218 download completes. This is important, since the download could |
219 have spanned a number of hours and multiple processes (e.g., | 219 have spanned a number of hours and multiple processes (e.g., |
220 gsutil runs), and the user could change some of the file and not | 220 gsutil runs), and the user could change some of the file and not |
221 realize they have inconsistent data. | 221 realize they have inconsistent data. |
222 """ | 222 """ |
223 fp = open(file_name, 'r') | 223 fp = open(file_name, 'rb') |
224 if key.bucket.connection.debug >= 1: | 224 if key.bucket.connection.debug >= 1: |
225 print 'Checking md5 against etag.' | 225 print 'Checking md5 against etag.' |
226 hex_md5 = key.compute_md5(fp)[0] | 226 hex_md5 = key.compute_md5(fp)[0] |
227 if hex_md5 != key.etag.strip('"\''): | 227 if hex_md5 != key.etag.strip('"\''): |
228 file_name = fp.name | 228 file_name = fp.name |
229 fp.close() | 229 fp.close() |
230 os.unlink(file_name) | 230 os.unlink(file_name) |
231 raise ResumableDownloadException( | 231 raise ResumableDownloadException( |
232 'File changed during download: md5 signature doesn\'t match ' | 232 'File changed during download: md5 signature doesn\'t match ' |
233 'etag (incorrect downloaded file deleted)', | 233 'etag (incorrect downloaded file deleted)', |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 key.close() | 344 key.close() |
345 except httplib.IncompleteRead: | 345 except httplib.IncompleteRead: |
346 pass | 346 pass |
347 | 347 |
348 sleep_time_secs = 2**progress_less_iterations | 348 sleep_time_secs = 2**progress_less_iterations |
349 if debug >= 1: | 349 if debug >= 1: |
350 print('Got retryable failure (%d progress-less in a row).\n' | 350 print('Got retryable failure (%d progress-less in a row).\n' |
351 'Sleeping %d seconds before re-trying' % | 351 'Sleeping %d seconds before re-trying' % |
352 (progress_less_iterations, sleep_time_secs)) | 352 (progress_less_iterations, sleep_time_secs)) |
353 time.sleep(sleep_time_secs) | 353 time.sleep(sleep_time_secs) |
OLD | NEW |