|
23 | 23 | import httpbin |
24 | 24 | import json |
25 | 25 | import os |
| 26 | +import re |
26 | 27 | import testbench_utils |
27 | 28 | from werkzeug import serving |
28 | 29 | from werkzeug import wsgi |
@@ -445,14 +446,27 @@ def objects_get(bucket_name, object_name): |
445 | 446 | if media != 'media': |
446 | 447 | raise error_response.ErrorResponse('Invalid alt=%s parameter' % media) |
447 | 448 | revision.validate_encryption_for_read(flask.request) |
| 449 | + # Respect the Range: header, if present. |
| 450 | + range_header = flask.request.headers.get('range') |
| 451 | + response_payload = revision.media |
| 452 | + begin = 0 |
| 453 | + end = len(response_payload) |
| 454 | + if range_header is not None: |
| 455 | + print("\n\n\nrange_header = %s\n\n" % range_header) |
| 456 | + m = re.match('bytes=([0-9]+)-([0-9]+)', range_header) |
| 457 | + if m: |
| 458 | + print("\n\n\nmatch = %s\n\n" % m) |
| 459 | + begin = int(m.group(1)) |
| 460 | + end = int(m.group(2)) |
| 461 | + response_payload = response_payload[begin:end + 1] |
| 462 | + # Process custome headers to test error conditions. |
448 | 463 | instructions = flask.request.headers.get('x-goog-testbench-instructions') |
449 | 464 | if instructions == 'return-corrupted-data': |
450 | | - response_payload = testbench_utils.corrupt_media(revision.media) |
451 | | - else: |
452 | | - response_payload = revision.media |
| 465 | + response_payload = testbench_utils.corrupt_media(response_payload) |
453 | 466 | response = flask.make_response(response_payload) |
454 | 467 | length = len(response_payload) |
455 | | - response.headers['Content-Range'] = 'bytes 0-%d/%d' % (length - 1, length) |
| 468 | + content_range = 'bytes %d-%d/%d' % (begin, end - 1, length) |
| 469 | + response.headers['Content-Range'] = content_range |
456 | 470 | response.headers['x-goog-hash'] = revision.x_goog_hash_header() |
457 | 471 | return response |
458 | 472 |
|
@@ -693,14 +707,27 @@ def xmlapi_get_object(bucket_name, object_name): |
693 | 707 | blob.check_preconditions_by_value(generation_match, None, |
694 | 708 | metageneration_match, None) |
695 | 709 | revision = blob.get_revision(flask.request) |
| 710 | + # Respect the Range: header, if present. |
| 711 | + range_header = flask.request.headers.get('range') |
| 712 | + response_payload = revision.media |
| 713 | + begin = 0 |
| 714 | + end = len(response_payload) |
| 715 | + if range_header is not None: |
| 716 | + print("\n\n\nrange_header = %s\n\n" % range_header) |
| 717 | + m = re.match('bytes=([0-9]+)-([0-9]+)', range_header) |
| 718 | + if m: |
| 719 | + print("\n\n\nmatch = %s\n\n" % m) |
| 720 | + begin = int(m.group(1)) |
| 721 | + end = int(m.group(2)) |
| 722 | + response_payload = response_payload[begin:end + 1] |
| 723 | + # Process custome headers to test error conditions. |
696 | 724 | instructions = flask.request.headers.get('x-goog-testbench-instructions') |
697 | 725 | if instructions == 'return-corrupted-data': |
698 | | - response_payload = testbench_utils.corrupt_media(revision.media) |
699 | | - else: |
700 | | - response_payload = revision.media |
| 726 | + response_payload = testbench_utils.corrupt_media(response_payload) |
701 | 727 | response = flask.make_response(response_payload) |
702 | 728 | length = len(response_payload) |
703 | | - response.headers['Content-Range'] = 'bytes 0-%d/%d' % (length - 1, length) |
| 729 | + content_range = 'bytes %d-%d/%d' % (begin, end - 1, length) |
| 730 | + response.headers['Content-Range'] = content_range |
704 | 731 | response.headers['x-goog-hash'] = revision.x_goog_hash_header() |
705 | 732 | return response |
706 | 733 |
|
|
0 commit comments